LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HexagonVLIWPacketizer.cpp
Go to the documentation of this file.
1 //===----- HexagonPacketizer.cpp - vliw packetizer ---------------------===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This implements a simple VLIW packetizer using DFA. The packetizer works on
11 // machine basic blocks. For each instruction I in BB, the packetizer consults
12 // the DFA to see if machine resources are available to execute I. If so, the
13 // packetizer checks if I depends on any instruction J in the current packet.
14 // If no dependency is found, I is added to current packet and machine resource
15 // is marked as taken. If any dependency is found, a target API call is made to
16 // prune the dependence.
17 //
18 //===----------------------------------------------------------------------===//
19 #define DEBUG_TYPE "packets"
21 #include "llvm/CodeGen/Passes.h"
37 #include "llvm/ADT/DenseMap.h"
38 #include "llvm/ADT/Statistic.h"
41 #include "llvm/Support/Compiler.h"
43 #include "llvm/Support/Debug.h"
44 #include "Hexagon.h"
45 #include "HexagonTargetMachine.h"
46 #include "HexagonRegisterInfo.h"
47 #include "HexagonSubtarget.h"
49 
50 #include <map>
51 #include <vector>
52 
53 using namespace llvm;
54 
55 static cl::opt<bool> PacketizeVolatiles("hexagon-packetize-volatiles",
57  cl::desc("Allow non-solo packetization of volatile memory references"));
58 
59 namespace llvm {
61 }
62 
63 
64 namespace {
65  class HexagonPacketizer : public MachineFunctionPass {
66 
67  public:
68  static char ID;
69  HexagonPacketizer() : MachineFunctionPass(ID) {
71  }
72 
73  void getAnalysisUsage(AnalysisUsage &AU) const {
74  AU.setPreservesCFG();
81  }
82 
83  const char *getPassName() const {
84  return "Hexagon Packetizer";
85  }
86 
87  bool runOnMachineFunction(MachineFunction &Fn);
88  };
89  char HexagonPacketizer::ID = 0;
90 
91  class HexagonPacketizerList : public VLIWPacketizerList {
92 
93  private:
94 
95  // Has the instruction been promoted to a dot-new instruction.
96  bool PromotedToDotNew;
97 
98  // Has the instruction been glued to allocframe.
99  bool GlueAllocframeStore;
100 
101  // Has the feeder instruction been glued to new value jump.
102  bool GlueToNewValueJump;
103 
104  // Check if there is a dependence between some instruction already in this
105  // packet and this instruction.
106  bool Dependence;
107 
108  // Only check for dependence if there are resources available to
109  // schedule this instruction.
110  bool FoundSequentialDependence;
111 
112  /// \brief A handle to the branch probability pass.
113  const MachineBranchProbabilityInfo *MBPI;
114 
115  // Track MIs with ignored dependece.
116  std::vector<MachineInstr*> IgnoreDepMIs;
117 
118  public:
119  // Ctor.
120  HexagonPacketizerList(MachineFunction &MF, MachineLoopInfo &MLI,
122  const MachineBranchProbabilityInfo *MBPI);
123 
124  // initPacketizerState - initialize some internal flags.
125  void initPacketizerState();
126 
127  // ignorePseudoInstruction - Ignore bundling of pseudo instructions.
128  bool ignorePseudoInstruction(MachineInstr *MI, MachineBasicBlock *MBB);
129 
130  // isSoloInstruction - return true if instruction MI can not be packetized
131  // with any other instruction, which means that MI itself is a packet.
132  bool isSoloInstruction(MachineInstr *MI);
133 
134  // isLegalToPacketizeTogether - Is it legal to packetize SUI and SUJ
135  // together.
136  bool isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ);
137 
138  // isLegalToPruneDependencies - Is it legal to prune dependece between SUI
139  // and SUJ.
140  bool isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ);
141 
143  private:
144  bool IsCallDependent(MachineInstr* MI, SDep::Kind DepType, unsigned DepReg);
145  bool PromoteToDotNew(MachineInstr* MI, SDep::Kind DepType,
147  const TargetRegisterClass* RC);
148  bool CanPromoteToDotNew(MachineInstr* MI, SUnit* PacketSU,
149  unsigned DepReg,
150  std::map <MachineInstr*, SUnit*> MIToSUnit,
152  const TargetRegisterClass* RC);
153  bool CanPromoteToNewValue(MachineInstr* MI, SUnit* PacketSU,
154  unsigned DepReg,
155  std::map <MachineInstr*, SUnit*> MIToSUnit,
157  bool CanPromoteToNewValueStore(MachineInstr* MI, MachineInstr* PacketMI,
158  unsigned DepReg,
159  std::map <MachineInstr*, SUnit*> MIToSUnit);
160  bool DemoteToDotOld(MachineInstr* MI);
161  bool ArePredicatesComplements(MachineInstr* MI1, MachineInstr* MI2,
162  std::map <MachineInstr*, SUnit*> MIToSUnit);
163  bool RestrictingDepExistInPacket(MachineInstr*,
164  unsigned, std::map <MachineInstr*, SUnit*>);
165  bool isNewifiable(MachineInstr* MI);
166  bool isCondInst(MachineInstr* MI);
167  bool tryAllocateResourcesForConstExt(MachineInstr* MI);
168  bool canReserveResourcesForConstExt(MachineInstr *MI);
169  void reserveResourcesForConstExt(MachineInstr* MI);
170  bool isNewValueInst(MachineInstr* MI);
171  };
172 }
173 
174 INITIALIZE_PASS_BEGIN(HexagonPacketizer, "packets", "Hexagon Packetizer",
175  false, false)
180 INITIALIZE_PASS_END(HexagonPacketizer, "packets", "Hexagon Packetizer",
181  false, false)
182 
183 
184 // HexagonPacketizerList Ctor.
185 HexagonPacketizerList::HexagonPacketizerList(
187  const MachineBranchProbabilityInfo *MBPI)
188  : VLIWPacketizerList(MF, MLI, MDT, true){
189  this->MBPI = MBPI;
190 }
191 
192 bool HexagonPacketizer::runOnMachineFunction(MachineFunction &Fn) {
193  const TargetInstrInfo *TII = Fn.getTarget().getInstrInfo();
194  MachineLoopInfo &MLI = getAnalysis<MachineLoopInfo>();
195  MachineDominatorTree &MDT = getAnalysis<MachineDominatorTree>();
196  const MachineBranchProbabilityInfo *MBPI =
197  &getAnalysis<MachineBranchProbabilityInfo>();
198  // Instantiate the packetizer.
199  HexagonPacketizerList Packetizer(Fn, MLI, MDT, MBPI);
200 
201  // DFA state table should not be empty.
202  assert(Packetizer.getResourceTracker() && "Empty DFA table!");
203 
204  //
205  // Loop over all basic blocks and remove KILL pseudo-instructions
206  // These instructions confuse the dependence analysis. Consider:
207  // D0 = ... (Insn 0)
208  // R0 = KILL R0, D0 (Insn 1)
209  // R0 = ... (Insn 2)
210  // Here, Insn 1 will result in the dependence graph not emitting an output
211  // dependence between Insn 0 and Insn 2. This can lead to incorrect
212  // packetization
213  //
214  for (MachineFunction::iterator MBB = Fn.begin(), MBBe = Fn.end();
215  MBB != MBBe; ++MBB) {
216  MachineBasicBlock::iterator End = MBB->end();
217  MachineBasicBlock::iterator MI = MBB->begin();
218  while (MI != End) {
219  if (MI->isKill()) {
220  MachineBasicBlock::iterator DeleteMI = MI;
221  ++MI;
222  MBB->erase(DeleteMI);
223  End = MBB->end();
224  continue;
225  }
226  ++MI;
227  }
228  }
229 
230  // Loop over all of the basic blocks.
231  for (MachineFunction::iterator MBB = Fn.begin(), MBBe = Fn.end();
232  MBB != MBBe; ++MBB) {
233  // Find scheduling regions and schedule / packetize each region.
234  unsigned RemainingCount = MBB->size();
235  for(MachineBasicBlock::iterator RegionEnd = MBB->end();
236  RegionEnd != MBB->begin();) {
237  // The next region starts above the previous region. Look backward in the
238  // instruction stream until we find the nearest boundary.
239  MachineBasicBlock::iterator I = RegionEnd;
240  for(;I != MBB->begin(); --I, --RemainingCount) {
241  if (TII->isSchedulingBoundary(llvm::prior(I), MBB, Fn))
242  break;
243  }
244  I = MBB->begin();
245 
246  // Skip empty scheduling regions.
247  if (I == RegionEnd) {
248  RegionEnd = llvm::prior(RegionEnd);
249  --RemainingCount;
250  continue;
251  }
252  // Skip regions with one instruction.
253  if (I == llvm::prior(RegionEnd)) {
254  RegionEnd = llvm::prior(RegionEnd);
255  continue;
256  }
257 
258  Packetizer.PacketizeMIs(MBB, I, RegionEnd);
259  RegionEnd = I;
260  }
261  }
262 
263  return true;
264 }
265 
266 
267 static bool IsIndirectCall(MachineInstr* MI) {
268  return ((MI->getOpcode() == Hexagon::CALLR) ||
269  (MI->getOpcode() == Hexagon::CALLRv3));
270 }
271 
272 // Reserve resources for constant extender. Trigure an assertion if
273 // reservation fail.
274 void HexagonPacketizerList::reserveResourcesForConstExt(MachineInstr* MI) {
275  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
276  MachineFunction *MF = MI->getParent()->getParent();
277  MachineInstr *PseudoMI = MF->CreateMachineInstr(QII->get(Hexagon::IMMEXT_i),
278  MI->getDebugLoc());
279 
280  if (ResourceTracker->canReserveResources(PseudoMI)) {
281  ResourceTracker->reserveResources(PseudoMI);
282  MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI);
283  } else {
284  MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI);
285  llvm_unreachable("can not reserve resources for constant extender.");
286  }
287  return;
288 }
289 
290 bool HexagonPacketizerList::canReserveResourcesForConstExt(MachineInstr *MI) {
291  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
292  assert((QII->isExtended(MI) || QII->isConstExtended(MI)) &&
293  "Should only be called for constant extended instructions");
294  MachineFunction *MF = MI->getParent()->getParent();
295  MachineInstr *PseudoMI = MF->CreateMachineInstr(QII->get(Hexagon::IMMEXT_i),
296  MI->getDebugLoc());
297  bool CanReserve = ResourceTracker->canReserveResources(PseudoMI);
298  MF->DeleteMachineInstr(PseudoMI);
299  return CanReserve;
300 }
301 
302 // Allocate resources (i.e. 4 bytes) for constant extender. If succeed, return
303 // true, otherwise, return false.
304 bool HexagonPacketizerList::tryAllocateResourcesForConstExt(MachineInstr* MI) {
305  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
306  MachineFunction *MF = MI->getParent()->getParent();
307  MachineInstr *PseudoMI = MF->CreateMachineInstr(QII->get(Hexagon::IMMEXT_i),
308  MI->getDebugLoc());
309 
310  if (ResourceTracker->canReserveResources(PseudoMI)) {
311  ResourceTracker->reserveResources(PseudoMI);
312  MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI);
313  return true;
314  } else {
315  MI->getParent()->getParent()->DeleteMachineInstr(PseudoMI);
316  return false;
317  }
318 }
319 
320 
321 bool HexagonPacketizerList::IsCallDependent(MachineInstr* MI,
322  SDep::Kind DepType,
323  unsigned DepReg) {
324 
325  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
326  const HexagonRegisterInfo* QRI =
327  (const HexagonRegisterInfo *) TM.getRegisterInfo();
328 
329  // Check for lr dependence
330  if (DepReg == QRI->getRARegister()) {
331  return true;
332  }
333 
334  if (QII->isDeallocRet(MI)) {
335  if (DepReg == QRI->getFrameRegister() ||
336  DepReg == QRI->getStackRegister())
337  return true;
338  }
339 
340  // Check if this is a predicate dependence
341  const TargetRegisterClass* RC = QRI->getMinimalPhysRegClass(DepReg);
342  if (RC == &Hexagon::PredRegsRegClass) {
343  return true;
344  }
345 
346  //
347  // Lastly check for an operand used in an indirect call
348  // If we had an attribute for checking if an instruction is an indirect call,
349  // then we could have avoided this relatively brittle implementation of
350  // IsIndirectCall()
351  //
352  // Assumes that the first operand of the CALLr is the function address
353  //
354  if (IsIndirectCall(MI) && (DepType == SDep::Data)) {
355  MachineOperand MO = MI->getOperand(0);
356  if (MO.isReg() && MO.isUse() && (MO.getReg() == DepReg)) {
357  return true;
358  }
359  }
360 
361  return false;
362 }
363 
364 static bool IsRegDependence(const SDep::Kind DepType) {
365  return (DepType == SDep::Data || DepType == SDep::Anti ||
366  DepType == SDep::Output);
367 }
368 
369 static bool IsDirectJump(MachineInstr* MI) {
370  return (MI->getOpcode() == Hexagon::JMP);
371 }
372 
373 static bool IsSchedBarrier(MachineInstr* MI) {
374  switch (MI->getOpcode()) {
375  case Hexagon::BARRIER:
376  return true;
377  }
378  return false;
379 }
380 
381 static bool IsControlFlow(MachineInstr* MI) {
382  return (MI->getDesc().isTerminator() || MI->getDesc().isCall());
383 }
384 
385 static bool IsLoopN(MachineInstr *MI) {
386  return (MI->getOpcode() == Hexagon::LOOP0_i ||
387  MI->getOpcode() == Hexagon::LOOP0_r);
388 }
389 
390 /// DoesModifyCalleeSavedReg - Returns true if the instruction modifies a
391 /// callee-saved register.
393  const TargetRegisterInfo *TRI) {
394  for (const uint16_t *CSR = TRI->getCalleeSavedRegs(); *CSR; ++CSR) {
395  unsigned CalleeSavedReg = *CSR;
396  if (MI->modifiesRegister(CalleeSavedReg, TRI))
397  return true;
398  }
399  return false;
400 }
401 
402 // Returns true if an instruction can be promoted to .new predicate
403 // or new-value store.
404 bool HexagonPacketizerList::isNewifiable(MachineInstr* MI) {
405  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
406  if ( isCondInst(MI) || QII->mayBeNewStore(MI))
407  return true;
408  else
409  return false;
410 }
411 
412 bool HexagonPacketizerList::isCondInst (MachineInstr* MI) {
413  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
414  const MCInstrDesc& TID = MI->getDesc();
415  // bug 5670: until that is fixed,
416  // this portion is disabled.
417  if ( TID.isConditionalBranch() // && !IsRegisterJump(MI)) ||
418  || QII->isConditionalTransfer(MI)
419  || QII->isConditionalALU32(MI)
420  || QII->isConditionalLoad(MI)
421  || QII->isConditionalStore(MI)) {
422  return true;
423  }
424  return false;
425 }
426 
427 
428 // Promote an instructiont to its .new form.
429 // At this time, we have already made a call to CanPromoteToDotNew
430 // and made sure that it can *indeed* be promoted.
431 bool HexagonPacketizerList::PromoteToDotNew(MachineInstr* MI,
433  const TargetRegisterClass* RC) {
434 
435  assert (DepType == SDep::Data);
436  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
437 
438  int NewOpcode;
439  if (RC == &Hexagon::PredRegsRegClass)
440  NewOpcode = QII->GetDotNewPredOp(MI, MBPI);
441  else
442  NewOpcode = QII->GetDotNewOp(MI);
443  MI->setDesc(QII->get(NewOpcode));
444 
445  return true;
446 }
447 
448 bool HexagonPacketizerList::DemoteToDotOld(MachineInstr* MI) {
449  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
450  int NewOpcode = QII->GetDotOldOp(MI->getOpcode());
451  MI->setDesc(QII->get(NewOpcode));
452  return true;
453 }
454 
459 };
460 
461 /// Returns true if an instruction is predicated on p0 and false if it's
462 /// predicated on !p0.
464  const HexagonInstrInfo *QII) {
465  if (!QII->isPredicated(MI))
466  return PK_Unknown;
467 
468  if (QII->isPredicatedTrue(MI))
469  return PK_True;
470 
471  return PK_False;
472 }
473 
475  const HexagonInstrInfo *QII) {
476  assert(QII->isPostIncrement(MI) && "Not a post increment operation.");
477 #ifndef NDEBUG
478  // Post Increment means duplicates. Use dense map to find duplicates in the
479  // list. Caution: Densemap initializes with the minimum of 64 buckets,
480  // whereas there are at most 5 operands in the post increment.
481  DenseMap<unsigned, unsigned> DefRegsSet;
482  for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++)
483  if (MI->getOperand(opNum).isReg() &&
484  MI->getOperand(opNum).isDef()) {
485  DefRegsSet[MI->getOperand(opNum).getReg()] = 1;
486  }
487 
488  for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++)
489  if (MI->getOperand(opNum).isReg() &&
490  MI->getOperand(opNum).isUse()) {
491  if (DefRegsSet[MI->getOperand(opNum).getReg()]) {
492  return MI->getOperand(opNum);
493  }
494  }
495 #else
496  if (MI->getDesc().mayLoad()) {
497  // The 2nd operand is always the post increment operand in load.
498  assert(MI->getOperand(1).isReg() &&
499  "Post increment operand has be to a register.");
500  return (MI->getOperand(1));
501  }
502  if (MI->getDesc().mayStore()) {
503  // The 1st operand is always the post increment operand in store.
504  assert(MI->getOperand(0).isReg() &&
505  "Post increment operand has be to a register.");
506  return (MI->getOperand(0));
507  }
508 #endif
509  // we should never come here.
510  llvm_unreachable("mayLoad or mayStore not set for Post Increment operation");
511 }
512 
513 // get the value being stored
515  // value being stored is always the last operand.
516  return (MI->getOperand(MI->getNumOperands()-1));
517 }
518 
519 // can be new value store?
520 // Following restrictions are to be respected in convert a store into
521 // a new value store.
522 // 1. If an instruction uses auto-increment, its address register cannot
523 // be a new-value register. Arch Spec 5.4.2.1
524 // 2. If an instruction uses absolute-set addressing mode,
525 // its address register cannot be a new-value register.
526 // Arch Spec 5.4.2.1.TODO: This is not enabled as
527 // as absolute-set address mode patters are not implemented.
528 // 3. If an instruction produces a 64-bit result, its registers cannot be used
529 // as new-value registers. Arch Spec 5.4.2.2.
530 // 4. If the instruction that sets a new-value register is conditional, then
531 // the instruction that uses the new-value register must also be conditional,
532 // and both must always have their predicates evaluate identically.
533 // Arch Spec 5.4.2.3.
534 // 5. There is an implied restriction of a packet can not have another store,
535 // if there is a new value store in the packet. Corollary, if there is
536 // already a store in a packet, there can not be a new value store.
537 // Arch Spec: 3.4.4.2
538 bool HexagonPacketizerList::CanPromoteToNewValueStore( MachineInstr *MI,
539  MachineInstr *PacketMI, unsigned DepReg,
540  std::map <MachineInstr*, SUnit*> MIToSUnit) {
541  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
542  // Make sure we are looking at the store, that can be promoted.
543  if (!QII->mayBeNewStore(MI))
544  return false;
545 
546  // Make sure there is dependency and can be new value'ed
547  if (GetStoreValueOperand(MI).isReg() &&
548  GetStoreValueOperand(MI).getReg() != DepReg)
549  return false;
550 
551  const HexagonRegisterInfo* QRI =
552  (const HexagonRegisterInfo *) TM.getRegisterInfo();
553  const MCInstrDesc& MCID = PacketMI->getDesc();
554  // first operand is always the result
555 
556  const TargetRegisterClass* PacketRC = QII->getRegClass(MCID, 0, QRI, MF);
557 
558  // if there is already an store in the packet, no can do new value store
559  // Arch Spec 3.4.4.2.
560  for (std::vector<MachineInstr*>::iterator VI = CurrentPacketMIs.begin(),
561  VE = CurrentPacketMIs.end();
562  (VI != VE); ++VI) {
563  SUnit* PacketSU = MIToSUnit[*VI];
564  if (PacketSU->getInstr()->getDesc().mayStore() ||
565  // if we have mayStore = 1 set on ALLOCFRAME and DEALLOCFRAME,
566  // then we don't need this
567  PacketSU->getInstr()->getOpcode() == Hexagon::ALLOCFRAME ||
568  PacketSU->getInstr()->getOpcode() == Hexagon::DEALLOCFRAME)
569  return false;
570  }
571 
572  if (PacketRC == &Hexagon::DoubleRegsRegClass) {
573  // new value store constraint: double regs can not feed into new value store
574  // arch spec section: 5.4.2.2
575  return false;
576  }
577 
578  // Make sure it's NOT the post increment register that we are going to
579  // new value.
580  if (QII->isPostIncrement(MI) &&
581  MI->getDesc().mayStore() &&
582  GetPostIncrementOperand(MI, QII).getReg() == DepReg) {
583  return false;
584  }
585 
586  if (QII->isPostIncrement(PacketMI) &&
587  PacketMI->getDesc().mayLoad() &&
588  GetPostIncrementOperand(PacketMI, QII).getReg() == DepReg) {
589  // if source is post_inc, or absolute-set addressing,
590  // it can not feed into new value store
591  // r3 = memw(r2++#4)
592  // memw(r30 + #-1404) = r2.new -> can not be new value store
593  // arch spec section: 5.4.2.1
594  return false;
595  }
596 
597  // If the source that feeds the store is predicated, new value store must
598  // also be predicated.
599  if (QII->isPredicated(PacketMI)) {
600  if (!QII->isPredicated(MI))
601  return false;
602 
603  // Check to make sure that they both will have their predicates
604  // evaluate identically
605  unsigned predRegNumSrc = 0;
606  unsigned predRegNumDst = 0;
607  const TargetRegisterClass* predRegClass = NULL;
608 
609  // Get predicate register used in the source instruction
610  for(unsigned opNum = 0; opNum < PacketMI->getNumOperands(); opNum++) {
611  if ( PacketMI->getOperand(opNum).isReg())
612  predRegNumSrc = PacketMI->getOperand(opNum).getReg();
613  predRegClass = QRI->getMinimalPhysRegClass(predRegNumSrc);
614  if (predRegClass == &Hexagon::PredRegsRegClass) {
615  break;
616  }
617  }
618  assert ((predRegClass == &Hexagon::PredRegsRegClass ) &&
619  ("predicate register not found in a predicated PacketMI instruction"));
620 
621  // Get predicate register used in new-value store instruction
622  for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++) {
623  if ( MI->getOperand(opNum).isReg())
624  predRegNumDst = MI->getOperand(opNum).getReg();
625  predRegClass = QRI->getMinimalPhysRegClass(predRegNumDst);
626  if (predRegClass == &Hexagon::PredRegsRegClass) {
627  break;
628  }
629  }
630  assert ((predRegClass == &Hexagon::PredRegsRegClass ) &&
631  ("predicate register not found in a predicated MI instruction"));
632 
633  // New-value register producer and user (store) need to satisfy these
634  // constraints:
635  // 1) Both instructions should be predicated on the same register.
636  // 2) If producer of the new-value register is .new predicated then store
637  // should also be .new predicated and if producer is not .new predicated
638  // then store should not be .new predicated.
639  // 3) Both new-value register producer and user should have same predicate
640  // sense, i.e, either both should be negated or both should be none negated.
641 
642  if (( predRegNumDst != predRegNumSrc) ||
643  QII->isDotNewInst(PacketMI) != QII->isDotNewInst(MI) ||
644  getPredicateSense(MI, QII) != getPredicateSense(PacketMI, QII)) {
645  return false;
646  }
647  }
648 
649  // Make sure that other than the new-value register no other store instruction
650  // register has been modified in the same packet. Predicate registers can be
651  // modified by they should not be modified between the producer and the store
652  // instruction as it will make them both conditional on different values.
653  // We already know this to be true for all the instructions before and
654  // including PacketMI. Howerver, we need to perform the check for the
655  // remaining instructions in the packet.
656 
657  std::vector<MachineInstr*>::iterator VI;
658  std::vector<MachineInstr*>::iterator VE;
659  unsigned StartCheck = 0;
660 
661  for (VI=CurrentPacketMIs.begin(), VE = CurrentPacketMIs.end();
662  (VI != VE); ++VI) {
663  SUnit* TempSU = MIToSUnit[*VI];
664  MachineInstr* TempMI = TempSU->getInstr();
665 
666  // Following condition is true for all the instructions until PacketMI is
667  // reached (StartCheck is set to 0 before the for loop).
668  // StartCheck flag is 1 for all the instructions after PacketMI.
669  if (TempMI != PacketMI && !StartCheck) // start processing only after
670  continue; // encountering PacketMI
671 
672  StartCheck = 1;
673  if (TempMI == PacketMI) // We don't want to check PacketMI for dependence
674  continue;
675 
676  for(unsigned opNum = 0; opNum < MI->getNumOperands(); opNum++) {
677  if (MI->getOperand(opNum).isReg() &&
678  TempSU->getInstr()->modifiesRegister(MI->getOperand(opNum).getReg(),
679  QRI))
680  return false;
681  }
682  }
683 
684  // Make sure that for non POST_INC stores:
685  // 1. The only use of reg is DepReg and no other registers.
686  // This handles V4 base+index registers.
687  // The following store can not be dot new.
688  // Eg. r0 = add(r0, #3)a
689  // memw(r1+r0<<#2) = r0
690  if (!QII->isPostIncrement(MI) &&
691  GetStoreValueOperand(MI).isReg() &&
692  GetStoreValueOperand(MI).getReg() == DepReg) {
693  for(unsigned opNum = 0; opNum < MI->getNumOperands()-1; opNum++) {
694  if (MI->getOperand(opNum).isReg() &&
695  MI->getOperand(opNum).getReg() == DepReg) {
696  return false;
697  }
698  }
699  // 2. If data definition is because of implicit definition of the register,
700  // do not newify the store. Eg.
701  // %R9<def> = ZXTH %R12, %D6<imp-use>, %R12<imp-def>
702  // STrih_indexed %R8, 2, %R12<kill>; mem:ST2[%scevgep343]
703  for(unsigned opNum = 0; opNum < PacketMI->getNumOperands(); opNum++) {
704  if (PacketMI->getOperand(opNum).isReg() &&
705  PacketMI->getOperand(opNum).getReg() == DepReg &&
706  PacketMI->getOperand(opNum).isDef() &&
707  PacketMI->getOperand(opNum).isImplicit()) {
708  return false;
709  }
710  }
711  }
712 
713  // Can be dot new store.
714  return true;
715 }
716 
717 // can this MI to promoted to either
718 // new value store or new value jump
719 bool HexagonPacketizerList::CanPromoteToNewValue( MachineInstr *MI,
720  SUnit *PacketSU, unsigned DepReg,
721  std::map <MachineInstr*, SUnit*> MIToSUnit,
723 {
724 
725  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
726  const HexagonRegisterInfo* QRI =
727  (const HexagonRegisterInfo *) TM.getRegisterInfo();
728  if (!QRI->Subtarget.hasV4TOps() ||
729  !QII->mayBeNewStore(MI))
730  return false;
731 
732  MachineInstr *PacketMI = PacketSU->getInstr();
733 
734  // Check to see the store can be new value'ed.
735  if (CanPromoteToNewValueStore(MI, PacketMI, DepReg, MIToSUnit))
736  return true;
737 
738  // Check to see the compare/jump can be new value'ed.
739  // This is done as a pass on its own. Don't need to check it here.
740  return false;
741 }
742 
743 // Check to see if an instruction can be dot new
744 // There are three kinds.
745 // 1. dot new on predicate - V2/V3/V4
746 // 2. dot new on stores NV/ST - V4
747 // 3. dot new on jump NV/J - V4 -- This is generated in a pass.
748 bool HexagonPacketizerList::CanPromoteToDotNew( MachineInstr *MI,
749  SUnit *PacketSU, unsigned DepReg,
750  std::map <MachineInstr*, SUnit*> MIToSUnit,
752  const TargetRegisterClass* RC )
753 {
754  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
755  // Already a dot new instruction.
756  if (QII->isDotNewInst(MI) && !QII->mayBeNewStore(MI))
757  return false;
758 
759  if (!isNewifiable(MI))
760  return false;
761 
762  // predicate .new
763  if (RC == &Hexagon::PredRegsRegClass && isCondInst(MI))
764  return true;
765  else if (RC != &Hexagon::PredRegsRegClass &&
766  !QII->mayBeNewStore(MI)) // MI is not a new-value store
767  return false;
768  else {
769  // Create a dot new machine instruction to see if resources can be
770  // allocated. If not, bail out now.
771  int NewOpcode = QII->GetDotNewOp(MI);
772  const MCInstrDesc &desc = QII->get(NewOpcode);
773  DebugLoc dl;
774  MachineInstr *NewMI =
775  MI->getParent()->getParent()->CreateMachineInstr(desc, dl);
776  bool ResourcesAvailable = ResourceTracker->canReserveResources(NewMI);
777  MI->getParent()->getParent()->DeleteMachineInstr(NewMI);
778 
779  if (!ResourcesAvailable)
780  return false;
781 
782  // new value store only
783  // new new value jump generated as a passes
784  if (!CanPromoteToNewValue(MI, PacketSU, DepReg, MIToSUnit, MII)) {
785  return false;
786  }
787  }
788  return true;
789 }
790 
791 // Go through the packet instructions and search for anti dependency
792 // between them and DepReg from MI
793 // Consider this case:
794 // Trying to add
795 // a) %R1<def> = TFRI_cdNotPt %P3, 2
796 // to this packet:
797 // {
798 // b) %P0<def> = OR_pp %P3<kill>, %P0<kill>
799 // c) %P3<def> = TFR_PdRs %R23
800 // d) %R1<def> = TFRI_cdnPt %P3, 4
801 // }
802 // The P3 from a) and d) will be complements after
803 // a)'s P3 is converted to .new form
804 // Anti Dep between c) and b) is irrelevant for this case
805 bool HexagonPacketizerList::RestrictingDepExistInPacket (MachineInstr* MI,
806  unsigned DepReg,
807  std::map <MachineInstr*, SUnit*> MIToSUnit) {
808 
809  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
810  SUnit* PacketSUDep = MIToSUnit[MI];
811 
812  for (std::vector<MachineInstr*>::iterator VIN = CurrentPacketMIs.begin(),
813  VEN = CurrentPacketMIs.end(); (VIN != VEN); ++VIN) {
814 
815  // We only care for dependencies to predicated instructions
816  if(!QII->isPredicated(*VIN)) continue;
817 
818  // Scheduling Unit for current insn in the packet
819  SUnit* PacketSU = MIToSUnit[*VIN];
820 
821  // Look at dependencies between current members of the packet
822  // and predicate defining instruction MI.
823  // Make sure that dependency is on the exact register
824  // we care about.
825  if (PacketSU->isSucc(PacketSUDep)) {
826  for (unsigned i = 0; i < PacketSU->Succs.size(); ++i) {
827  if ((PacketSU->Succs[i].getSUnit() == PacketSUDep) &&
828  (PacketSU->Succs[i].getKind() == SDep::Anti) &&
829  (PacketSU->Succs[i].getReg() == DepReg)) {
830  return true;
831  }
832  }
833  }
834  }
835 
836  return false;
837 }
838 
839 
840 /// Gets the predicate register of a predicated instruction.
842  const HexagonInstrInfo *QII) {
843  /// We use the following rule: The first predicate register that is a use is
844  /// the predicate register of a predicated instruction.
845 
846  assert(QII->isPredicated(MI) && "Must be predicated instruction");
847 
849  OE = MI->operands_end(); OI != OE; ++OI) {
850  MachineOperand &Op = *OI;
851  if (Op.isReg() && Op.getReg() && Op.isUse() &&
852  Hexagon::PredRegsRegClass.contains(Op.getReg()))
853  return Op.getReg();
854  }
855 
856  llvm_unreachable("Unknown instruction operand layout");
857 
858  return 0;
859 }
860 
861 // Given two predicated instructions, this function detects whether
862 // the predicates are complements
863 bool HexagonPacketizerList::ArePredicatesComplements (MachineInstr* MI1,
864  MachineInstr* MI2, std::map <MachineInstr*, SUnit*> MIToSUnit) {
865 
866  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
867 
868  // If we don't know the predicate sense of the instructions bail out early, we
869  // need it later.
870  if (getPredicateSense(MI1, QII) == PK_Unknown ||
871  getPredicateSense(MI2, QII) == PK_Unknown)
872  return false;
873 
874  // Scheduling unit for candidate
875  SUnit* SU = MIToSUnit[MI1];
876 
877  // One corner case deals with the following scenario:
878  // Trying to add
879  // a) %R24<def> = TFR_cPt %P0, %R25
880  // to this packet:
881  //
882  // {
883  // b) %R25<def> = TFR_cNotPt %P0, %R24
884  // c) %P0<def> = CMPEQri %R26, 1
885  // }
886  //
887  // On general check a) and b) are complements, but
888  // presence of c) will convert a) to .new form, and
889  // then it is not a complement
890  // We attempt to detect it by analyzing existing
891  // dependencies in the packet
892 
893  // Analyze relationships between all existing members of the packet.
894  // Look for Anti dependecy on the same predicate reg
895  // as used in the candidate
896  for (std::vector<MachineInstr*>::iterator VIN = CurrentPacketMIs.begin(),
897  VEN = CurrentPacketMIs.end(); (VIN != VEN); ++VIN) {
898 
899  // Scheduling Unit for current insn in the packet
900  SUnit* PacketSU = MIToSUnit[*VIN];
901 
902  // If this instruction in the packet is succeeded by the candidate...
903  if (PacketSU->isSucc(SU)) {
904  for (unsigned i = 0; i < PacketSU->Succs.size(); ++i) {
905  // The corner case exist when there is true data
906  // dependency between candidate and one of current
907  // packet members, this dep is on predicate reg, and
908  // there already exist anti dep on the same pred in
909  // the packet.
910  if (PacketSU->Succs[i].getSUnit() == SU &&
911  PacketSU->Succs[i].getKind() == SDep::Data &&
912  Hexagon::PredRegsRegClass.contains(
913  PacketSU->Succs[i].getReg()) &&
914  // Here I know that *VIN is predicate setting instruction
915  // with true data dep to candidate on the register
916  // we care about - c) in the above example.
917  // Now I need to see if there is an anti dependency
918  // from c) to any other instruction in the
919  // same packet on the pred reg of interest
920  RestrictingDepExistInPacket(*VIN,PacketSU->Succs[i].getReg(),
921  MIToSUnit)) {
922  return false;
923  }
924  }
925  }
926  }
927 
928  // If the above case does not apply, check regular
929  // complement condition.
930  // Check that the predicate register is the same and
931  // that the predicate sense is different
932  // We also need to differentiate .old vs. .new:
933  // !p0 is not complimentary to p0.new
934  unsigned PReg1 = getPredicatedRegister(MI1, QII);
935  unsigned PReg2 = getPredicatedRegister(MI2, QII);
936  return ((PReg1 == PReg2) &&
937  Hexagon::PredRegsRegClass.contains(PReg1) &&
938  Hexagon::PredRegsRegClass.contains(PReg2) &&
939  (getPredicateSense(MI1, QII) != getPredicateSense(MI2, QII)) &&
940  (QII->isDotNewInst(MI1) == QII->isDotNewInst(MI2)));
941 }
942 
943 // initPacketizerState - Initialize packetizer flags
944 void HexagonPacketizerList::initPacketizerState() {
945 
946  Dependence = false;
947  PromotedToDotNew = false;
948  GlueToNewValueJump = false;
949  GlueAllocframeStore = false;
950  FoundSequentialDependence = false;
951 
952  return;
953 }
954 
955 // ignorePseudoInstruction - Ignore bundling of pseudo instructions.
956 bool HexagonPacketizerList::ignorePseudoInstruction(MachineInstr *MI,
957  MachineBasicBlock *MBB) {
958  if (MI->isDebugValue())
959  return true;
960 
961  // We must print out inline assembly
962  if (MI->isInlineAsm())
963  return false;
964 
965  // We check if MI has any functional units mapped to it.
966  // If it doesn't, we ignore the instruction.
967  const MCInstrDesc& TID = MI->getDesc();
968  unsigned SchedClass = TID.getSchedClass();
969  const InstrStage* IS =
970  ResourceTracker->getInstrItins()->beginStage(SchedClass);
971  unsigned FuncUnits = IS->getUnits();
972  return !FuncUnits;
973 }
974 
975 // isSoloInstruction: - Returns true for instructions that must be
976 // scheduled in their own packet.
977 bool HexagonPacketizerList::isSoloInstruction(MachineInstr *MI) {
978 
979  if (MI->isInlineAsm())
980  return true;
981 
982  if (MI->isEHLabel())
983  return true;
984 
985  // From Hexagon V4 Programmer's Reference Manual 3.4.4 Grouping constraints:
986  // trap, pause, barrier, icinva, isync, and syncht are solo instructions.
987  // They must not be grouped with other instructions in a packet.
988  if (IsSchedBarrier(MI))
989  return true;
990 
991  return false;
992 }
993 
994 // isLegalToPacketizeTogether:
995 // SUI is the current instruction that is out side of the current packet.
996 // SUJ is the current instruction inside the current packet against which that
997 // SUI will be packetized.
998 bool HexagonPacketizerList::isLegalToPacketizeTogether(SUnit *SUI, SUnit *SUJ) {
999  MachineInstr *I = SUI->getInstr();
1000  MachineInstr *J = SUJ->getInstr();
1001  assert(I && J && "Unable to packetize null instruction!");
1002 
1003  const MCInstrDesc &MCIDI = I->getDesc();
1004  const MCInstrDesc &MCIDJ = J->getDesc();
1005 
1007 
1008  const unsigned FrameSize = MF.getFrameInfo()->getStackSize();
1009  const HexagonRegisterInfo* QRI =
1010  (const HexagonRegisterInfo *) TM.getRegisterInfo();
1011  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
1012 
1013  // Inline asm cannot go in the packet.
1014  if (I->getOpcode() == Hexagon::INLINEASM)
1015  llvm_unreachable("Should not meet inline asm here!");
1016 
1017  if (isSoloInstruction(I))
1018  llvm_unreachable("Should not meet solo instr here!");
1019 
1020  // A save callee-save register function call can only be in a packet
1021  // with instructions that don't write to the callee-save registers.
1022  if ((QII->isSaveCalleeSavedRegsCall(I) &&
1023  DoesModifyCalleeSavedReg(J, QRI)) ||
1024  (QII->isSaveCalleeSavedRegsCall(J) &&
1025  DoesModifyCalleeSavedReg(I, QRI))) {
1026  Dependence = true;
1027  return false;
1028  }
1029 
1030  // Two control flow instructions cannot go in the same packet.
1031  if (IsControlFlow(I) && IsControlFlow(J)) {
1032  Dependence = true;
1033  return false;
1034  }
1035 
1036  // A LoopN instruction cannot appear in the same packet as a jump or call.
1037  if (IsLoopN(I) &&
1038  (IsDirectJump(J) || MCIDJ.isCall() || QII->isDeallocRet(J))) {
1039  Dependence = true;
1040  return false;
1041  }
1042  if (IsLoopN(J) &&
1043  (IsDirectJump(I) || MCIDI.isCall() || QII->isDeallocRet(I))) {
1044  Dependence = true;
1045  return false;
1046  }
1047 
1048  // dealloc_return cannot appear in the same packet as a conditional or
1049  // unconditional jump.
1050  if (QII->isDeallocRet(I) &&
1051  (MCIDJ.isBranch() || MCIDJ.isCall() || MCIDJ.isBarrier())) {
1052  Dependence = true;
1053  return false;
1054  }
1055 
1056 
1057  // V4 allows dual store. But does not allow second store, if the
1058  // first store is not in SLOT0. New value store, new value jump,
1059  // dealloc_return and memop always take SLOT0.
1060  // Arch spec 3.4.4.2
1061  if (QRI->Subtarget.hasV4TOps()) {
1062  if (MCIDI.mayStore() && MCIDJ.mayStore() &&
1063  (QII->isNewValueInst(J) || QII->isMemOp(J) || QII->isMemOp(I))) {
1064  Dependence = true;
1065  return false;
1066  }
1067 
1068  if ((QII->isMemOp(J) && MCIDI.mayStore())
1069  || (MCIDJ.mayStore() && QII->isMemOp(I))
1070  || (QII->isMemOp(J) && QII->isMemOp(I))) {
1071  Dependence = true;
1072  return false;
1073  }
1074 
1075  //if dealloc_return
1076  if (MCIDJ.mayStore() && QII->isDeallocRet(I)) {
1077  Dependence = true;
1078  return false;
1079  }
1080 
1081  // If an instruction feeds new value jump, glue it.
1082  MachineBasicBlock::iterator NextMII = I;
1083  ++NextMII;
1084  if (NextMII != I->getParent()->end() && QII->isNewValueJump(NextMII)) {
1085  MachineInstr *NextMI = NextMII;
1086 
1087  bool secondRegMatch = false;
1088  bool maintainNewValueJump = false;
1089 
1090  if (NextMI->getOperand(1).isReg() &&
1091  I->getOperand(0).getReg() == NextMI->getOperand(1).getReg()) {
1092  secondRegMatch = true;
1093  maintainNewValueJump = true;
1094  }
1095 
1096  if (!secondRegMatch &&
1097  I->getOperand(0).getReg() == NextMI->getOperand(0).getReg()) {
1098  maintainNewValueJump = true;
1099  }
1100 
1101  for (std::vector<MachineInstr*>::iterator
1102  VI = CurrentPacketMIs.begin(),
1103  VE = CurrentPacketMIs.end();
1104  (VI != VE && maintainNewValueJump); ++VI) {
1105  SUnit* PacketSU = MIToSUnit[*VI];
1106 
1107  // NVJ can not be part of the dual jump - Arch Spec: section 7.8
1108  if (PacketSU->getInstr()->getDesc().isCall()) {
1109  Dependence = true;
1110  break;
1111  }
1112  // Validate
1113  // 1. Packet does not have a store in it.
1114  // 2. If the first operand of the nvj is newified, and the second
1115  // operand is also a reg, it (second reg) is not defined in
1116  // the same packet.
1117  // 3. If the second operand of the nvj is newified, (which means
1118  // first operand is also a reg), first reg is not defined in
1119  // the same packet.
1120  if (PacketSU->getInstr()->getDesc().mayStore() ||
1121  PacketSU->getInstr()->getOpcode() == Hexagon::ALLOCFRAME ||
1122  // Check #2.
1123  (!secondRegMatch && NextMI->getOperand(1).isReg() &&
1124  PacketSU->getInstr()->modifiesRegister(
1125  NextMI->getOperand(1).getReg(), QRI)) ||
1126  // Check #3.
1127  (secondRegMatch &&
1128  PacketSU->getInstr()->modifiesRegister(
1129  NextMI->getOperand(0).getReg(), QRI))) {
1130  Dependence = true;
1131  break;
1132  }
1133  }
1134  if (!Dependence)
1135  GlueToNewValueJump = true;
1136  else
1137  return false;
1138  }
1139  }
1140 
1141  if (SUJ->isSucc(SUI)) {
1142  for (unsigned i = 0;
1143  (i < SUJ->Succs.size()) && !FoundSequentialDependence;
1144  ++i) {
1145 
1146  if (SUJ->Succs[i].getSUnit() != SUI) {
1147  continue;
1148  }
1149 
1150  SDep::Kind DepType = SUJ->Succs[i].getKind();
1151 
1152  // For direct calls:
1153  // Ignore register dependences for call instructions for
1154  // packetization purposes except for those due to r31 and
1155  // predicate registers.
1156  //
1157  // For indirect calls:
1158  // Same as direct calls + check for true dependences to the register
1159  // used in the indirect call.
1160  //
1161  // We completely ignore Order dependences for call instructions
1162  //
1163  // For returns:
1164  // Ignore register dependences for return instructions like jumpr,
1165  // dealloc return unless we have dependencies on the explicit uses
1166  // of the registers used by jumpr (like r31) or dealloc return
1167  // (like r29 or r30).
1168  //
1169  // TODO: Currently, jumpr is handling only return of r31. So, the
1170  // following logic (specificaly IsCallDependent) is working fine.
1171  // We need to enable jumpr for register other than r31 and then,
1172  // we need to rework the last part, where it handles indirect call
1173  // of that (IsCallDependent) function. Bug 6216 is opened for this.
1174  //
1175  unsigned DepReg = 0;
1176  const TargetRegisterClass* RC = NULL;
1177  if (DepType == SDep::Data) {
1178  DepReg = SUJ->Succs[i].getReg();
1179  RC = QRI->getMinimalPhysRegClass(DepReg);
1180  }
1181  if ((MCIDI.isCall() || MCIDI.isReturn()) &&
1182  (!IsRegDependence(DepType) ||
1183  !IsCallDependent(I, DepType, SUJ->Succs[i].getReg()))) {
1184  /* do nothing */
1185  }
1186 
1187  // For instructions that can be promoted to dot-new, try to promote.
1188  else if ((DepType == SDep::Data) &&
1189  CanPromoteToDotNew(I, SUJ, DepReg, MIToSUnit, II, RC) &&
1190  PromoteToDotNew(I, DepType, II, RC)) {
1191  PromotedToDotNew = true;
1192  /* do nothing */
1193  }
1194 
1195  else if ((DepType == SDep::Data) &&
1196  (QII->isNewValueJump(I))) {
1197  /* do nothing */
1198  }
1199 
1200  // For predicated instructions, if the predicates are complements
1201  // then there can be no dependence.
1202  else if (QII->isPredicated(I) &&
1203  QII->isPredicated(J) &&
1204  ArePredicatesComplements(I, J, MIToSUnit)) {
1205  /* do nothing */
1206 
1207  }
1208  else if (IsDirectJump(I) &&
1209  !MCIDJ.isBranch() &&
1210  !MCIDJ.isCall() &&
1211  (DepType == SDep::Order)) {
1212  // Ignore Order dependences between unconditional direct branches
1213  // and non-control-flow instructions
1214  /* do nothing */
1215  }
1216  else if (MCIDI.isConditionalBranch() && (DepType != SDep::Data) &&
1217  (DepType != SDep::Output)) {
1218  // Ignore all dependences for jumps except for true and output
1219  // dependences
1220  /* do nothing */
1221  }
1222 
1223  // Ignore output dependences due to superregs. We can
1224  // write to two different subregisters of R1:0 for instance
1225  // in the same cycle
1226  //
1227 
1228  //
1229  // Let the
1230  // If neither I nor J defines DepReg, then this is a
1231  // superfluous output dependence. The dependence must be of the
1232  // form:
1233  // R0 = ...
1234  // R1 = ...
1235  // and there is an output dependence between the two instructions
1236  // with
1237  // DepReg = D0
1238  // We want to ignore these dependences.
1239  // Ideally, the dependence constructor should annotate such
1240  // dependences. We can then avoid this relatively expensive check.
1241  //
1242  else if (DepType == SDep::Output) {
1243  // DepReg is the register that's responsible for the dependence.
1244  unsigned DepReg = SUJ->Succs[i].getReg();
1245 
1246  // Check if I and J really defines DepReg.
1247  if (I->definesRegister(DepReg) ||
1248  J->definesRegister(DepReg)) {
1249  FoundSequentialDependence = true;
1250  break;
1251  }
1252  }
1253 
1254  // We ignore Order dependences for
1255  // 1. Two loads unless they are volatile.
1256  // 2. Two stores in V4 unless they are volatile.
1257  else if ((DepType == SDep::Order) &&
1258  !I->hasOrderedMemoryRef() &&
1259  !J->hasOrderedMemoryRef()) {
1260  if (QRI->Subtarget.hasV4TOps() &&
1261  // hexagonv4 allows dual store.
1262  MCIDI.mayStore() && MCIDJ.mayStore()) {
1263  /* do nothing */
1264  }
1265  // store followed by store-- not OK on V2
1266  // store followed by load -- not OK on all (OK if addresses
1267  // are not aliased)
1268  // load followed by store -- OK on all
1269  // load followed by load -- OK on all
1270  else if ( !MCIDJ.mayStore()) {
1271  /* do nothing */
1272  }
1273  else {
1274  FoundSequentialDependence = true;
1275  break;
1276  }
1277  }
1278 
1279  // For V4, special case ALLOCFRAME. Even though there is dependency
1280  // between ALLOCAFRAME and subsequent store, allow it to be
1281  // packetized in a same packet. This implies that the store is using
1282  // caller's SP. Hense, offset needs to be updated accordingly.
1283  else if (DepType == SDep::Data
1284  && QRI->Subtarget.hasV4TOps()
1285  && J->getOpcode() == Hexagon::ALLOCFRAME
1286  && (I->getOpcode() == Hexagon::STrid
1287  || I->getOpcode() == Hexagon::STriw
1288  || I->getOpcode() == Hexagon::STrib)
1289  && I->getOperand(0).getReg() == QRI->getStackRegister()
1290  && QII->isValidOffset(I->getOpcode(),
1291  I->getOperand(1).getImm() -
1292  (FrameSize + HEXAGON_LRFP_SIZE)))
1293  {
1294  GlueAllocframeStore = true;
1295  // Since this store is to be glued with allocframe in the same
1296  // packet, it will use SP of the previous stack frame, i.e
1297  // caller's SP. Therefore, we need to recalculate offset according
1298  // to this change.
1299  I->getOperand(1).setImm(I->getOperand(1).getImm() -
1300  (FrameSize + HEXAGON_LRFP_SIZE));
1301  }
1302 
1303  //
1304  // Skip over anti-dependences. Two instructions that are
1305  // anti-dependent can share a packet
1306  //
1307  else if (DepType != SDep::Anti) {
1308  FoundSequentialDependence = true;
1309  break;
1310  }
1311  }
1312 
1313  if (FoundSequentialDependence) {
1314  Dependence = true;
1315  return false;
1316  }
1317  }
1318 
1319  return true;
1320 }
1321 
1322 // isLegalToPruneDependencies
1323 bool HexagonPacketizerList::isLegalToPruneDependencies(SUnit *SUI, SUnit *SUJ) {
1324  MachineInstr *I = SUI->getInstr();
1325  assert(I && SUJ->getInstr() && "Unable to packetize null instruction!");
1326 
1327  const unsigned FrameSize = MF.getFrameInfo()->getStackSize();
1328 
1329  if (Dependence) {
1330 
1331  // Check if the instruction was promoted to a dot-new. If so, demote it
1332  // back into a dot-old.
1333  if (PromotedToDotNew) {
1334  DemoteToDotOld(I);
1335  }
1336 
1337  // Check if the instruction (must be a store) was glued with an Allocframe
1338  // instruction. If so, restore its offset to its original value, i.e. use
1339  // curent SP instead of caller's SP.
1340  if (GlueAllocframeStore) {
1341  I->getOperand(1).setImm(I->getOperand(1).getImm() +
1342  FrameSize + HEXAGON_LRFP_SIZE);
1343  }
1344 
1345  return false;
1346  }
1347  return true;
1348 }
1349 
1351 HexagonPacketizerList::addToPacket(MachineInstr *MI) {
1352 
1354  MachineBasicBlock *MBB = MI->getParent();
1355 
1356  const HexagonInstrInfo *QII = (const HexagonInstrInfo *) TII;
1357 
1358  if (GlueToNewValueJump) {
1359 
1360  ++MII;
1361  MachineInstr *nvjMI = MII;
1362  assert(ResourceTracker->canReserveResources(MI));
1363  ResourceTracker->reserveResources(MI);
1364  if ((QII->isExtended(MI) || QII->isConstExtended(MI)) &&
1365  !tryAllocateResourcesForConstExt(MI)) {
1366  endPacket(MBB, MI);
1367  ResourceTracker->reserveResources(MI);
1368  assert(canReserveResourcesForConstExt(MI) &&
1369  "Ensure that there is a slot");
1370  reserveResourcesForConstExt(MI);
1371  // Reserve resources for new value jump constant extender.
1372  assert(canReserveResourcesForConstExt(MI) &&
1373  "Ensure that there is a slot");
1374  reserveResourcesForConstExt(nvjMI);
1375  assert(ResourceTracker->canReserveResources(nvjMI) &&
1376  "Ensure that there is a slot");
1377 
1378  } else if ( // Extended instruction takes two slots in the packet.
1379  // Try reserve and allocate 4-byte in the current packet first.
1380  (QII->isExtended(nvjMI)
1381  && (!tryAllocateResourcesForConstExt(nvjMI)
1382  || !ResourceTracker->canReserveResources(nvjMI)))
1383  || // For non-extended instruction, no need to allocate extra 4 bytes.
1384  (!QII->isExtended(nvjMI) &&
1385  !ResourceTracker->canReserveResources(nvjMI)))
1386  {
1387  endPacket(MBB, MI);
1388  // A new and empty packet starts.
1389  // We are sure that the resources requirements can be satisfied.
1390  // Therefore, do not need to call "canReserveResources" anymore.
1391  ResourceTracker->reserveResources(MI);
1392  if (QII->isExtended(nvjMI))
1393  reserveResourcesForConstExt(nvjMI);
1394  }
1395  // Here, we are sure that "reserveResources" would succeed.
1396  ResourceTracker->reserveResources(nvjMI);
1397  CurrentPacketMIs.push_back(MI);
1398  CurrentPacketMIs.push_back(nvjMI);
1399  } else {
1400  if ( (QII->isExtended(MI) || QII->isConstExtended(MI))
1401  && ( !tryAllocateResourcesForConstExt(MI)
1402  || !ResourceTracker->canReserveResources(MI)))
1403  {
1404  endPacket(MBB, MI);
1405  // Check if the instruction was promoted to a dot-new. If so, demote it
1406  // back into a dot-old
1407  if (PromotedToDotNew) {
1408  DemoteToDotOld(MI);
1409  }
1410  reserveResourcesForConstExt(MI);
1411  }
1412  // In case that "MI" is not an extended insn,
1413  // the resource availability has already been checked.
1414  ResourceTracker->reserveResources(MI);
1415  CurrentPacketMIs.push_back(MI);
1416  }
1417  return MII;
1418 }
1419 
1420 //===----------------------------------------------------------------------===//
1421 // Public Constructor Functions
1422 //===----------------------------------------------------------------------===//
1423 
1425  return new HexagonPacketizer();
1426 }
1427 
bool isImplicit() const
bool isConditionalLoad(const MachineInstr *MI) const
const MachineFunction * getParent() const
mop_iterator operands_end()
Definition: MachineInstr.h:285
AnalysisUsage & addPreserved()
MachineInstr * CreateMachineInstr(const MCInstrDesc &MCID, DebugLoc DL, bool NoImp=false)
static PassRegistry * getPassRegistry()
bool isSucc(SUnit *N)
isSucc - Test if node N is a successor of this node.
Definition: ScheduleDAG.h:446
static PredicateKind getPredicateSense(MachineInstr *MI, const HexagonInstrInfo *QII)
static bool IsLoopN(MachineInstr *MI)
bool isReturn() const
Return true if the instruction is a return.
Definition: MCInstrDesc.h:227
Hexagon Packetizer
bool mayStore() const
Return true if this instruction could possibly modify memory. Instructions with this flag set are not...
Definition: MCInstrDesc.h:376
MachineInstr * getInstr() const
Definition: ScheduleDAG.h:386
bool hasOrderedMemoryRef() const
static bool IsIndirectCall(MachineInstr *MI)
static bool IsControlFlow(MachineInstr *MI)
static cl::opt< bool > PacketizeVolatiles("hexagon-packetize-volatiles", cl::ZeroOrMore, cl::Hidden, cl::init(true), cl::desc("Allow non-solo packetization of volatile memory references"))
const MCInstrDesc & getDesc() const
Definition: MachineInstr.h:257
virtual bool isPredicated(const MachineInstr *MI) const
virtual bool isSchedulingBoundary(const MachineInstr *MI, const MachineBasicBlock *MBB, const MachineFunction &MF) const
static MachineOperand & GetStoreValueOperand(MachineInstr *MI)
bool isConstExtended(MachineInstr *MI) const
Kind
Kind - These are the different kinds of scheduling dependencies.
Definition: ScheduleDAG.h:48
bool isPostIncrement(const MachineInstr *MI) const
A register anti-dependedence (aka WAR).
Definition: ScheduleDAG.h:50
virtual const MCPhysReg * getCalleeSavedRegs(const MachineFunction *MF=0) const =0
bool isConditionalTransfer(const MachineInstr *MI) const
uint64_t getStackSize() const
AnalysisUsage & addRequired()
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:167
bool isMemOp(const MachineInstr *MI) const
const HexagonInstrInfo * TII
int GetDotOldOp(const int opc) const
#define llvm_unreachable(msg)
bool isBranch() const
Returns true if this is a conditional, unconditional, or indirect branch. Predicates below can be use...
Definition: MCInstrDesc.h:257
bool isCall() const
Return true if the instruction is a call.
Definition: MCInstrDesc.h:232
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition: PassSupport.h:172
bool isReg() const
isReg - Tests if this is a MO_Register operand.
Regular data dependence (aka true-dependence).
Definition: ScheduleDAG.h:49
unsigned getUnits() const
getUnits - returns the choice of FUs
bool isTerminator() const
Returns true if this instruction part of the terminator for a basic block. Typically this is things l...
Definition: MCInstrDesc.h:249
ID
LLVM Calling Convention Representation.
Definition: CallingConv.h:26
static bool IsDirectJump(MachineInstr *MI)
unsigned getNumOperands() const
Definition: MachineInstr.h:265
Hexagon false
A register output-dependence (aka WAW).
Definition: ScheduleDAG.h:51
bool isValidOffset(const int Opcode, const int Offset) const
bool definesRegister(unsigned Reg, const TargetRegisterInfo *TRI=NULL) const
Definition: MachineInstr.h:753
int getOpcode() const
Definition: MachineInstr.h:261
void initializeHexagonPacketizerPass(PassRegistry &)
bool isBarrier() const
Returns true if the specified instruction stops control flow from executing the instruction immediate...
Definition: MCInstrDesc.h:239
int64_t getImm() const
static unsigned getPredicatedRegister(MachineInstr *MI, const HexagonInstrInfo *QII)
Gets the predicate register of a predicated instruction.
const MachineBasicBlock * getParent() const
Definition: MachineInstr.h:119
bool isDebugValue() const
Definition: MachineInstr.h:639
bundle_iterator< MachineInstr, instr_iterator > iterator
#define true
Definition: ConvertUTF.c:65
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:314
FunctionPass * createHexagonPacketizer()
const MCInstrInfo & MII
const MachineOperand & getOperand(unsigned i) const
Definition: MachineInstr.h:267
bool isSaveCalleeSavedRegsCall(const MachineInstr *MI) const
bool isDeallocRet(const MachineInstr *MI) const
static MachineOperand & GetPostIncrementOperand(MachineInstr *MI, const HexagonInstrInfo *QII)
bool isNewValueInst(const MachineInstr *MI) const
static bool IsSchedBarrier(MachineInstr *MI)
void setImm(int64_t immVal)
virtual bool isPredicatedTrue(const MachineInstr *MI) const
bool isConditionalStore(const MachineInstr *MI) const
#define INITIALIZE_AG_DEPENDENCY(depName)
Definition: PassSupport.h:169
int GetDotNewOp(const MachineInstr *MI) const
void DeleteMachineInstr(MachineInstr *MI)
Any other ordering dependency.
Definition: ScheduleDAG.h:52
virtual const TargetInstrInfo * getInstrInfo() const
#define HEXAGON_LRFP_SIZE
Definition: Hexagon.h:74
void setDesc(const MCInstrDesc &tid)
Definition: MachineInstr.h:984
bool isInlineAsm() const
Definition: MachineInstr.h:651
INITIALIZE_PASS_BEGIN(HexagonPacketizer,"packets","Hexagon Packetizer", false, false) INITIALIZE_PASS_END(HexagonPacketizer
bool mayLoad() const
Return true if this instruction could possibly read memory. Instructions with this flag set are not n...
Definition: MCInstrDesc.h:367
static bool IsRegDependence(const SDep::Kind DepType)
MachineFrameInfo * getFrameInfo()
void setPreservesCFG()
Definition: Pass.cpp:249
int GetDotNewPredOp(MachineInstr *MI, const MachineBranchProbabilityInfo *MBPI) const
unsigned getFrameRegister(const MachineFunction &MF) const
bool isExtended(const MachineInstr *MI) const
unsigned getSchedClass() const
Return the scheduling class for this instruction. The scheduling class is an index into the InstrItin...
Definition: MCInstrDesc.h:570
virtual void getAnalysisUsage(AnalysisUsage &AU) const
#define I(x, y, z)
Definition: MD5.cpp:54
bool isConditionalALU32(const MachineInstr *MI) const
const TargetMachine & getTarget() const
bool isEHLabel() const
Definition: MachineInstr.h:637
HexagonSubtarget & Subtarget
unsigned getReg() const
getReg - Returns the register number.
mop_iterator operands_begin()
Definition: MachineInstr.h:284
SmallVector< SDep, 4 > Succs
Definition: ScheduleDAG.h:264
bool isNewValueJump(const MachineInstr *MI) const
BasicBlockListType::iterator iterator
ItTy prior(ItTy it, Dist n)
Definition: STLExtras.h:167
static bool DoesModifyCalleeSavedReg(MachineInstr *MI, const TargetRegisterInfo *TRI)
bool isDotNewInst(const MachineInstr *MI) const
bool modifiesRegister(unsigned Reg, const TargetRegisterInfo *TRI) const
Definition: MachineInstr.h:760
bool isConditionalBranch() const
Return true if this is a branch which may fall through to the next instruction or may transfer contro...
Definition: MCInstrDesc.h:271
DebugLoc getDebugLoc() const
Definition: MachineInstr.h:244
SUnit - Scheduling unit. This is a node in the scheduling DAG.
Definition: ScheduleDAG.h:249
bool mayBeNewStore(const MachineInstr *MI) const