LLVM  8.0.1
EarlyIfConversion.cpp
Go to the documentation of this file.
1 //===-- EarlyIfConversion.cpp - If-conversion on SSA form machine code ----===//
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 // Early if-conversion is for out-of-order CPUs that don't have a lot of
11 // predicable instructions. The goal is to eliminate conditional branches that
12 // may mispredict.
13 //
14 // Instructions from both sides of the branch are executed specutatively, and a
15 // cmov instruction selects the result.
16 //
17 //===----------------------------------------------------------------------===//
18 
19 #include "llvm/ADT/BitVector.h"
21 #include "llvm/ADT/SetVector.h"
22 #include "llvm/ADT/SmallPtrSet.h"
23 #include "llvm/ADT/SparseSet.h"
24 #include "llvm/ADT/Statistic.h"
32 #include "llvm/CodeGen/Passes.h"
37 #include "llvm/Support/Debug.h"
39 
40 using namespace llvm;
41 
42 #define DEBUG_TYPE "early-ifcvt"
43 
44 // Absolute maximum number of instructions allowed per speculated block.
45 // This bypasses all other heuristics, so it should be set fairly high.
46 static cl::opt<unsigned>
47 BlockInstrLimit("early-ifcvt-limit", cl::init(30), cl::Hidden,
48  cl::desc("Maximum number of instructions per speculated block."));
49 
50 // Stress testing mode - disable heuristics.
51 static cl::opt<bool> Stress("stress-early-ifcvt", cl::Hidden,
52  cl::desc("Turn all knobs to 11"));
53 
54 STATISTIC(NumDiamondsSeen, "Number of diamonds");
55 STATISTIC(NumDiamondsConv, "Number of diamonds converted");
56 STATISTIC(NumTrianglesSeen, "Number of triangles");
57 STATISTIC(NumTrianglesConv, "Number of triangles converted");
58 
59 //===----------------------------------------------------------------------===//
60 // SSAIfConv
61 //===----------------------------------------------------------------------===//
62 //
63 // The SSAIfConv class performs if-conversion on SSA form machine code after
64 // determining if it is possible. The class contains no heuristics; external
65 // code should be used to determine when if-conversion is a good idea.
66 //
67 // SSAIfConv can convert both triangles and diamonds:
68 //
69 // Triangle: Head Diamond: Head
70 // | \ / \_
71 // | \ / |
72 // | [TF]BB FBB TBB
73 // | / \ /
74 // | / \ /
75 // Tail Tail
76 //
77 // Instructions in the conditional blocks TBB and/or FBB are spliced into the
78 // Head block, and phis in the Tail block are converted to select instructions.
79 //
80 namespace {
81 class SSAIfConv {
82  const TargetInstrInfo *TII;
83  const TargetRegisterInfo *TRI;
85 
86 public:
87  /// The block containing the conditional branch.
88  MachineBasicBlock *Head;
89 
90  /// The block containing phis after the if-then-else.
91  MachineBasicBlock *Tail;
92 
93  /// The 'true' conditional block as determined by AnalyzeBranch.
94  MachineBasicBlock *TBB;
95 
96  /// The 'false' conditional block as determined by AnalyzeBranch.
97  MachineBasicBlock *FBB;
98 
99  /// isTriangle - When there is no 'else' block, either TBB or FBB will be
100  /// equal to Tail.
101  bool isTriangle() const { return TBB == Tail || FBB == Tail; }
102 
103  /// Returns the Tail predecessor for the True side.
104  MachineBasicBlock *getTPred() const { return TBB == Tail ? Head : TBB; }
105 
106  /// Returns the Tail predecessor for the False side.
107  MachineBasicBlock *getFPred() const { return FBB == Tail ? Head : FBB; }
108 
109  /// Information about each phi in the Tail block.
110  struct PHIInfo {
111  MachineInstr *PHI;
112  unsigned TReg, FReg;
113  // Latencies from Cond+Branch, TReg, and FReg to DstReg.
114  int CondCycles, TCycles, FCycles;
115 
116  PHIInfo(MachineInstr *phi)
117  : PHI(phi), TReg(0), FReg(0), CondCycles(0), TCycles(0), FCycles(0) {}
118  };
119 
121 
122 private:
123  /// The branch condition determined by AnalyzeBranch.
125 
126  /// Instructions in Head that define values used by the conditional blocks.
127  /// The hoisted instructions must be inserted after these instructions.
128  SmallPtrSet<MachineInstr*, 8> InsertAfter;
129 
130  /// Register units clobbered by the conditional blocks.
131  BitVector ClobberedRegUnits;
132 
133  // Scratch pad for findInsertionPoint.
135 
136  /// Insertion point in Head for speculatively executed instructions form TBB
137  /// and FBB.
138  MachineBasicBlock::iterator InsertionPoint;
139 
140  /// Return true if all non-terminator instructions in MBB can be safely
141  /// speculated.
142  bool canSpeculateInstrs(MachineBasicBlock *MBB);
143 
144  /// Find a valid insertion point in Head.
145  bool findInsertionPoint();
146 
147  /// Replace PHI instructions in Tail with selects.
148  void replacePHIInstrs();
149 
150  /// Insert selects and rewrite PHI operands to use them.
151  void rewritePHIOperands();
152 
153 public:
154  /// runOnMachineFunction - Initialize per-function data structures.
155  void runOnMachineFunction(MachineFunction &MF) {
156  TII = MF.getSubtarget().getInstrInfo();
157  TRI = MF.getSubtarget().getRegisterInfo();
158  MRI = &MF.getRegInfo();
159  LiveRegUnits.clear();
160  LiveRegUnits.setUniverse(TRI->getNumRegUnits());
161  ClobberedRegUnits.clear();
162  ClobberedRegUnits.resize(TRI->getNumRegUnits());
163  }
164 
165  /// canConvertIf - If the sub-CFG headed by MBB can be if-converted,
166  /// initialize the internal state, and return true.
167  bool canConvertIf(MachineBasicBlock *MBB);
168 
169  /// convertIf - If-convert the last block passed to canConvertIf(), assuming
170  /// it is possible. Add any erased blocks to RemovedBlocks.
171  void convertIf(SmallVectorImpl<MachineBasicBlock*> &RemovedBlocks);
172 };
173 } // end anonymous namespace
174 
175 
176 /// canSpeculateInstrs - Returns true if all the instructions in MBB can safely
177 /// be speculated. The terminators are not considered.
178 ///
179 /// If instructions use any values that are defined in the head basic block,
180 /// the defining instructions are added to InsertAfter.
181 ///
182 /// Any clobbered regunits are added to ClobberedRegUnits.
183 ///
184 bool SSAIfConv::canSpeculateInstrs(MachineBasicBlock *MBB) {
185  // Reject any live-in physregs. It's probably CPSR/EFLAGS, and very hard to
186  // get right.
187  if (!MBB->livein_empty()) {
188  LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << " has live-ins.\n");
189  return false;
190  }
191 
192  unsigned InstrCount = 0;
193 
194  // Check all instructions, except the terminators. It is assumed that
195  // terminators never have side effects or define any used register values.
196  for (MachineBasicBlock::iterator I = MBB->begin(),
197  E = MBB->getFirstTerminator(); I != E; ++I) {
198  if (I->isDebugInstr())
199  continue;
200 
201  if (++InstrCount > BlockInstrLimit && !Stress) {
202  LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << " has more than "
203  << BlockInstrLimit << " instructions.\n");
204  return false;
205  }
206 
207  // There shouldn't normally be any phis in a single-predecessor block.
208  if (I->isPHI()) {
209  LLVM_DEBUG(dbgs() << "Can't hoist: " << *I);
210  return false;
211  }
212 
213  // Don't speculate loads. Note that it may be possible and desirable to
214  // speculate GOT or constant pool loads that are guaranteed not to trap,
215  // but we don't support that for now.
216  if (I->mayLoad()) {
217  LLVM_DEBUG(dbgs() << "Won't speculate load: " << *I);
218  return false;
219  }
220 
221  // We never speculate stores, so an AA pointer isn't necessary.
222  bool DontMoveAcrossStore = true;
223  if (!I->isSafeToMove(nullptr, DontMoveAcrossStore)) {
224  LLVM_DEBUG(dbgs() << "Can't speculate: " << *I);
225  return false;
226  }
227 
228  // Check for any dependencies on Head instructions.
229  for (const MachineOperand &MO : I->operands()) {
230  if (MO.isRegMask()) {
231  LLVM_DEBUG(dbgs() << "Won't speculate regmask: " << *I);
232  return false;
233  }
234  if (!MO.isReg())
235  continue;
236  unsigned Reg = MO.getReg();
237 
238  // Remember clobbered regunits.
239  if (MO.isDef() && TargetRegisterInfo::isPhysicalRegister(Reg))
240  for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units)
241  ClobberedRegUnits.set(*Units);
242 
243  if (!MO.readsReg() || !TargetRegisterInfo::isVirtualRegister(Reg))
244  continue;
245  MachineInstr *DefMI = MRI->getVRegDef(Reg);
246  if (!DefMI || DefMI->getParent() != Head)
247  continue;
248  if (InsertAfter.insert(DefMI).second)
249  LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << " depends on "
250  << *DefMI);
251  if (DefMI->isTerminator()) {
252  LLVM_DEBUG(dbgs() << "Can't insert instructions below terminator.\n");
253  return false;
254  }
255  }
256  }
257  return true;
258 }
259 
260 
261 /// Find an insertion point in Head for the speculated instructions. The
262 /// insertion point must be:
263 ///
264 /// 1. Before any terminators.
265 /// 2. After any instructions in InsertAfter.
266 /// 3. Not have any clobbered regunits live.
267 ///
268 /// This function sets InsertionPoint and returns true when successful, it
269 /// returns false if no valid insertion point could be found.
270 ///
271 bool SSAIfConv::findInsertionPoint() {
272  // Keep track of live regunits before the current position.
273  // Only track RegUnits that are also in ClobberedRegUnits.
274  LiveRegUnits.clear();
279  while (I != B) {
280  --I;
281  // Some of the conditional code depends in I.
282  if (InsertAfter.count(&*I)) {
283  LLVM_DEBUG(dbgs() << "Can't insert code after " << *I);
284  return false;
285  }
286 
287  // Update live regunits.
288  for (const MachineOperand &MO : I->operands()) {
289  // We're ignoring regmask operands. That is conservatively correct.
290  if (!MO.isReg())
291  continue;
292  unsigned Reg = MO.getReg();
294  continue;
295  // I clobbers Reg, so it isn't live before I.
296  if (MO.isDef())
297  for (MCRegUnitIterator Units(Reg, TRI); Units.isValid(); ++Units)
298  LiveRegUnits.erase(*Units);
299  // Unless I reads Reg.
300  if (MO.readsReg())
301  Reads.push_back(Reg);
302  }
303  // Anything read by I is live before I.
304  while (!Reads.empty())
305  for (MCRegUnitIterator Units(Reads.pop_back_val(), TRI); Units.isValid();
306  ++Units)
307  if (ClobberedRegUnits.test(*Units))
308  LiveRegUnits.insert(*Units);
309 
310  // We can't insert before a terminator.
311  if (I != FirstTerm && I->isTerminator())
312  continue;
313 
314  // Some of the clobbered registers are live before I, not a valid insertion
315  // point.
316  if (!LiveRegUnits.empty()) {
317  LLVM_DEBUG({
318  dbgs() << "Would clobber";
320  i = LiveRegUnits.begin(), e = LiveRegUnits.end(); i != e; ++i)
321  dbgs() << ' ' << printRegUnit(*i, TRI);
322  dbgs() << " live before " << *I;
323  });
324  continue;
325  }
326 
327  // This is a valid insertion point.
328  InsertionPoint = I;
329  LLVM_DEBUG(dbgs() << "Can insert before " << *I);
330  return true;
331  }
332  LLVM_DEBUG(dbgs() << "No legal insertion point found.\n");
333  return false;
334 }
335 
336 
337 
338 /// canConvertIf - analyze the sub-cfg rooted in MBB, and return true if it is
339 /// a potential candidate for if-conversion. Fill out the internal state.
340 ///
341 bool SSAIfConv::canConvertIf(MachineBasicBlock *MBB) {
342  Head = MBB;
343  TBB = FBB = Tail = nullptr;
344 
345  if (Head->succ_size() != 2)
346  return false;
347  MachineBasicBlock *Succ0 = Head->succ_begin()[0];
348  MachineBasicBlock *Succ1 = Head->succ_begin()[1];
349 
350  // Canonicalize so Succ0 has MBB as its single predecessor.
351  if (Succ0->pred_size() != 1)
352  std::swap(Succ0, Succ1);
353 
354  if (Succ0->pred_size() != 1 || Succ0->succ_size() != 1)
355  return false;
356 
357  Tail = Succ0->succ_begin()[0];
358 
359  // This is not a triangle.
360  if (Tail != Succ1) {
361  // Check for a diamond. We won't deal with any critical edges.
362  if (Succ1->pred_size() != 1 || Succ1->succ_size() != 1 ||
363  Succ1->succ_begin()[0] != Tail)
364  return false;
365  LLVM_DEBUG(dbgs() << "\nDiamond: " << printMBBReference(*Head) << " -> "
366  << printMBBReference(*Succ0) << "/"
367  << printMBBReference(*Succ1) << " -> "
368  << printMBBReference(*Tail) << '\n');
369 
370  // Live-in physregs are tricky to get right when speculating code.
371  if (!Tail->livein_empty()) {
372  LLVM_DEBUG(dbgs() << "Tail has live-ins.\n");
373  return false;
374  }
375  } else {
376  LLVM_DEBUG(dbgs() << "\nTriangle: " << printMBBReference(*Head) << " -> "
377  << printMBBReference(*Succ0) << " -> "
378  << printMBBReference(*Tail) << '\n');
379  }
380 
381  // This is a triangle or a diamond.
382  // If Tail doesn't have any phis, there must be side effects.
383  if (Tail->empty() || !Tail->front().isPHI()) {
384  LLVM_DEBUG(dbgs() << "No phis in tail.\n");
385  return false;
386  }
387 
388  // The branch we're looking to eliminate must be analyzable.
389  Cond.clear();
390  if (TII->analyzeBranch(*Head, TBB, FBB, Cond)) {
391  LLVM_DEBUG(dbgs() << "Branch not analyzable.\n");
392  return false;
393  }
394 
395  // This is weird, probably some sort of degenerate CFG.
396  if (!TBB) {
397  LLVM_DEBUG(dbgs() << "AnalyzeBranch didn't find conditional branch.\n");
398  return false;
399  }
400 
401  // Make sure the analyzed branch is conditional; one of the successors
402  // could be a landing pad. (Empty landing pads can be generated on Windows.)
403  if (Cond.empty()) {
404  LLVM_DEBUG(dbgs() << "AnalyzeBranch found an unconditional branch.\n");
405  return false;
406  }
407 
408  // AnalyzeBranch doesn't set FBB on a fall-through branch.
409  // Make sure it is always set.
410  FBB = TBB == Succ0 ? Succ1 : Succ0;
411 
412  // Any phis in the tail block must be convertible to selects.
413  PHIs.clear();
414  MachineBasicBlock *TPred = getTPred();
415  MachineBasicBlock *FPred = getFPred();
416  for (MachineBasicBlock::iterator I = Tail->begin(), E = Tail->end();
417  I != E && I->isPHI(); ++I) {
418  PHIs.push_back(&*I);
419  PHIInfo &PI = PHIs.back();
420  // Find PHI operands corresponding to TPred and FPred.
421  for (unsigned i = 1; i != PI.PHI->getNumOperands(); i += 2) {
422  if (PI.PHI->getOperand(i+1).getMBB() == TPred)
423  PI.TReg = PI.PHI->getOperand(i).getReg();
424  if (PI.PHI->getOperand(i+1).getMBB() == FPred)
425  PI.FReg = PI.PHI->getOperand(i).getReg();
426  }
427  assert(TargetRegisterInfo::isVirtualRegister(PI.TReg) && "Bad PHI");
428  assert(TargetRegisterInfo::isVirtualRegister(PI.FReg) && "Bad PHI");
429 
430  // Get target information.
431  if (!TII->canInsertSelect(*Head, Cond, PI.TReg, PI.FReg,
432  PI.CondCycles, PI.TCycles, PI.FCycles)) {
433  LLVM_DEBUG(dbgs() << "Can't convert: " << *PI.PHI);
434  return false;
435  }
436  }
437 
438  // Check that the conditional instructions can be speculated.
439  InsertAfter.clear();
440  ClobberedRegUnits.reset();
441  if (TBB != Tail && !canSpeculateInstrs(TBB))
442  return false;
443  if (FBB != Tail && !canSpeculateInstrs(FBB))
444  return false;
445 
446  // Try to find a valid insertion point for the speculated instructions in the
447  // head basic block.
448  if (!findInsertionPoint())
449  return false;
450 
451  if (isTriangle())
452  ++NumTrianglesSeen;
453  else
454  ++NumDiamondsSeen;
455  return true;
456 }
457 
458 /// replacePHIInstrs - Completely replace PHI instructions with selects.
459 /// This is possible when the only Tail predecessors are the if-converted
460 /// blocks.
461 void SSAIfConv::replacePHIInstrs() {
462  assert(Tail->pred_size() == 2 && "Cannot replace PHIs");
464  assert(FirstTerm != Head->end() && "No terminators");
465  DebugLoc HeadDL = FirstTerm->getDebugLoc();
466 
467  // Convert all PHIs to select instructions inserted before FirstTerm.
468  for (unsigned i = 0, e = PHIs.size(); i != e; ++i) {
469  PHIInfo &PI = PHIs[i];
470  LLVM_DEBUG(dbgs() << "If-converting " << *PI.PHI);
471  unsigned DstReg = PI.PHI->getOperand(0).getReg();
472  TII->insertSelect(*Head, FirstTerm, HeadDL, DstReg, Cond, PI.TReg, PI.FReg);
473  LLVM_DEBUG(dbgs() << " --> " << *std::prev(FirstTerm));
474  PI.PHI->eraseFromParent();
475  PI.PHI = nullptr;
476  }
477 }
478 
479 /// rewritePHIOperands - When there are additional Tail predecessors, insert
480 /// select instructions in Head and rewrite PHI operands to use the selects.
481 /// Keep the PHI instructions in Tail to handle the other predecessors.
482 void SSAIfConv::rewritePHIOperands() {
484  assert(FirstTerm != Head->end() && "No terminators");
485  DebugLoc HeadDL = FirstTerm->getDebugLoc();
486 
487  // Convert all PHIs to select instructions inserted before FirstTerm.
488  for (unsigned i = 0, e = PHIs.size(); i != e; ++i) {
489  PHIInfo &PI = PHIs[i];
490  unsigned DstReg = 0;
491 
492  LLVM_DEBUG(dbgs() << "If-converting " << *PI.PHI);
493  if (PI.TReg == PI.FReg) {
494  // We do not need the select instruction if both incoming values are
495  // equal.
496  DstReg = PI.TReg;
497  } else {
498  unsigned PHIDst = PI.PHI->getOperand(0).getReg();
499  DstReg = MRI->createVirtualRegister(MRI->getRegClass(PHIDst));
500  TII->insertSelect(*Head, FirstTerm, HeadDL,
501  DstReg, Cond, PI.TReg, PI.FReg);
502  LLVM_DEBUG(dbgs() << " --> " << *std::prev(FirstTerm));
503  }
504 
505  // Rewrite PHI operands TPred -> (DstReg, Head), remove FPred.
506  for (unsigned i = PI.PHI->getNumOperands(); i != 1; i -= 2) {
507  MachineBasicBlock *MBB = PI.PHI->getOperand(i-1).getMBB();
508  if (MBB == getTPred()) {
509  PI.PHI->getOperand(i-1).setMBB(Head);
510  PI.PHI->getOperand(i-2).setReg(DstReg);
511  } else if (MBB == getFPred()) {
512  PI.PHI->RemoveOperand(i-1);
513  PI.PHI->RemoveOperand(i-2);
514  }
515  }
516  LLVM_DEBUG(dbgs() << " --> " << *PI.PHI);
517  }
518 }
519 
520 /// convertIf - Execute the if conversion after canConvertIf has determined the
521 /// feasibility.
522 ///
523 /// Any basic blocks erased will be added to RemovedBlocks.
524 ///
525 void SSAIfConv::convertIf(SmallVectorImpl<MachineBasicBlock*> &RemovedBlocks) {
526  assert(Head && Tail && TBB && FBB && "Call canConvertIf first.");
527 
528  // Update statistics.
529  if (isTriangle())
530  ++NumTrianglesConv;
531  else
532  ++NumDiamondsConv;
533 
534  // Move all instructions into Head, except for the terminators.
535  if (TBB != Tail)
536  Head->splice(InsertionPoint, TBB, TBB->begin(), TBB->getFirstTerminator());
537  if (FBB != Tail)
538  Head->splice(InsertionPoint, FBB, FBB->begin(), FBB->getFirstTerminator());
539 
540  // Are there extra Tail predecessors?
541  bool ExtraPreds = Tail->pred_size() != 2;
542  if (ExtraPreds)
543  rewritePHIOperands();
544  else
545  replacePHIInstrs();
546 
547  // Fix up the CFG, temporarily leave Head without any successors.
548  Head->removeSuccessor(TBB);
549  Head->removeSuccessor(FBB, true);
550  if (TBB != Tail)
551  TBB->removeSuccessor(Tail, true);
552  if (FBB != Tail)
553  FBB->removeSuccessor(Tail, true);
554 
555  // Fix up Head's terminators.
556  // It should become a single branch or a fallthrough.
557  DebugLoc HeadDL = Head->getFirstTerminator()->getDebugLoc();
558  TII->removeBranch(*Head);
559 
560  // Erase the now empty conditional blocks. It is likely that Head can fall
561  // through to Tail, and we can join the two blocks.
562  if (TBB != Tail) {
563  RemovedBlocks.push_back(TBB);
564  TBB->eraseFromParent();
565  }
566  if (FBB != Tail) {
567  RemovedBlocks.push_back(FBB);
568  FBB->eraseFromParent();
569  }
570 
571  assert(Head->succ_empty() && "Additional head successors?");
572  if (!ExtraPreds && Head->isLayoutSuccessor(Tail)) {
573  // Splice Tail onto the end of Head.
574  LLVM_DEBUG(dbgs() << "Joining tail " << printMBBReference(*Tail)
575  << " into head " << printMBBReference(*Head) << '\n');
576  Head->splice(Head->end(), Tail,
577  Tail->begin(), Tail->end());
579  RemovedBlocks.push_back(Tail);
580  Tail->eraseFromParent();
581  } else {
582  // We need a branch to Tail, let code placement work it out later.
583  LLVM_DEBUG(dbgs() << "Converting to unconditional branch.\n");
585  TII->insertBranch(*Head, Tail, nullptr, EmptyCond, HeadDL);
586  Head->addSuccessor(Tail);
587  }
588  LLVM_DEBUG(dbgs() << *Head);
589 }
590 
591 
592 //===----------------------------------------------------------------------===//
593 // EarlyIfConverter Pass
594 //===----------------------------------------------------------------------===//
595 
596 namespace {
597 class EarlyIfConverter : public MachineFunctionPass {
598  const TargetInstrInfo *TII;
599  const TargetRegisterInfo *TRI;
600  MCSchedModel SchedModel;
602  MachineDominatorTree *DomTree;
604  MachineTraceMetrics *Traces;
606  SSAIfConv IfConv;
607 
608 public:
609  static char ID;
610  EarlyIfConverter() : MachineFunctionPass(ID) {}
611  void getAnalysisUsage(AnalysisUsage &AU) const override;
612  bool runOnMachineFunction(MachineFunction &MF) override;
613  StringRef getPassName() const override { return "Early If-Conversion"; }
614 
615 private:
616  bool tryConvertIf(MachineBasicBlock*);
617  void updateDomTree(ArrayRef<MachineBasicBlock*> Removed);
618  void updateLoops(ArrayRef<MachineBasicBlock*> Removed);
619  void invalidateTraces();
620  bool shouldConvertIf();
621 };
622 } // end anonymous namespace
623 
624 char EarlyIfConverter::ID = 0;
626 
627 INITIALIZE_PASS_BEGIN(EarlyIfConverter, DEBUG_TYPE,
628  "Early If Converter", false, false)
632 INITIALIZE_PASS_END(EarlyIfConverter, DEBUG_TYPE,
633  "Early If Converter", false, false)
634 
635 void EarlyIfConverter::getAnalysisUsage(AnalysisUsage &AU) const {
636  AU.addRequired<MachineBranchProbabilityInfo>();
637  AU.addRequired<MachineDominatorTree>();
638  AU.addPreserved<MachineDominatorTree>();
639  AU.addRequired<MachineLoopInfo>();
640  AU.addPreserved<MachineLoopInfo>();
641  AU.addRequired<MachineTraceMetrics>();
642  AU.addPreserved<MachineTraceMetrics>();
644 }
645 
646 /// Update the dominator tree after if-conversion erased some blocks.
647 void EarlyIfConverter::updateDomTree(ArrayRef<MachineBasicBlock*> Removed) {
648  // convertIf can remove TBB, FBB, and Tail can be merged into Head.
649  // TBB and FBB should not dominate any blocks.
650  // Tail children should be transferred to Head.
651  MachineDomTreeNode *HeadNode = DomTree->getNode(IfConv.Head);
652  for (unsigned i = 0, e = Removed.size(); i != e; ++i) {
653  MachineDomTreeNode *Node = DomTree->getNode(Removed[i]);
654  assert(Node != HeadNode && "Cannot erase the head node");
655  while (Node->getNumChildren()) {
656  assert(Node->getBlock() == IfConv.Tail && "Unexpected children");
657  DomTree->changeImmediateDominator(Node->getChildren().back(), HeadNode);
658  }
659  DomTree->eraseNode(Removed[i]);
660  }
661 }
662 
663 /// Update LoopInfo after if-conversion.
664 void EarlyIfConverter::updateLoops(ArrayRef<MachineBasicBlock*> Removed) {
665  if (!Loops)
666  return;
667  // If-conversion doesn't change loop structure, and it doesn't mess with back
668  // edges, so updating LoopInfo is simply removing the dead blocks.
669  for (unsigned i = 0, e = Removed.size(); i != e; ++i)
670  Loops->removeBlock(Removed[i]);
671 }
672 
673 /// Invalidate MachineTraceMetrics before if-conversion.
674 void EarlyIfConverter::invalidateTraces() {
675  Traces->verifyAnalysis();
676  Traces->invalidate(IfConv.Head);
677  Traces->invalidate(IfConv.Tail);
678  Traces->invalidate(IfConv.TBB);
679  Traces->invalidate(IfConv.FBB);
680  Traces->verifyAnalysis();
681 }
682 
683 // Adjust cycles with downward saturation.
684 static unsigned adjCycles(unsigned Cyc, int Delta) {
685  if (Delta < 0 && Cyc + Delta > Cyc)
686  return 0;
687  return Cyc + Delta;
688 }
689 
690 /// Apply cost model and heuristics to the if-conversion in IfConv.
691 /// Return true if the conversion is a good idea.
692 ///
693 bool EarlyIfConverter::shouldConvertIf() {
694  // Stress testing mode disables all cost considerations.
695  if (Stress)
696  return true;
697 
698  if (!MinInstr)
699  MinInstr = Traces->getEnsemble(MachineTraceMetrics::TS_MinInstrCount);
700 
701  MachineTraceMetrics::Trace TBBTrace = MinInstr->getTrace(IfConv.getTPred());
702  MachineTraceMetrics::Trace FBBTrace = MinInstr->getTrace(IfConv.getFPred());
703  LLVM_DEBUG(dbgs() << "TBB: " << TBBTrace << "FBB: " << FBBTrace);
704  unsigned MinCrit = std::min(TBBTrace.getCriticalPath(),
705  FBBTrace.getCriticalPath());
706 
707  // Set a somewhat arbitrary limit on the critical path extension we accept.
708  unsigned CritLimit = SchedModel.MispredictPenalty/2;
709 
710  // If-conversion only makes sense when there is unexploited ILP. Compute the
711  // maximum-ILP resource length of the trace after if-conversion. Compare it
712  // to the shortest critical path.
714  if (IfConv.TBB != IfConv.Tail)
715  ExtraBlocks.push_back(IfConv.TBB);
716  unsigned ResLength = FBBTrace.getResourceLength(ExtraBlocks);
717  LLVM_DEBUG(dbgs() << "Resource length " << ResLength
718  << ", minimal critical path " << MinCrit << '\n');
719  if (ResLength > MinCrit + CritLimit) {
720  LLVM_DEBUG(dbgs() << "Not enough available ILP.\n");
721  return false;
722  }
723 
724  // Assume that the depth of the first head terminator will also be the depth
725  // of the select instruction inserted, as determined by the flag dependency.
726  // TBB / FBB data dependencies may delay the select even more.
727  MachineTraceMetrics::Trace HeadTrace = MinInstr->getTrace(IfConv.Head);
728  unsigned BranchDepth =
729  HeadTrace.getInstrCycles(*IfConv.Head->getFirstTerminator()).Depth;
730  LLVM_DEBUG(dbgs() << "Branch depth: " << BranchDepth << '\n');
731 
732  // Look at all the tail phis, and compute the critical path extension caused
733  // by inserting select instructions.
734  MachineTraceMetrics::Trace TailTrace = MinInstr->getTrace(IfConv.Tail);
735  for (unsigned i = 0, e = IfConv.PHIs.size(); i != e; ++i) {
736  SSAIfConv::PHIInfo &PI = IfConv.PHIs[i];
737  unsigned Slack = TailTrace.getInstrSlack(*PI.PHI);
738  unsigned MaxDepth = Slack + TailTrace.getInstrCycles(*PI.PHI).Depth;
739  LLVM_DEBUG(dbgs() << "Slack " << Slack << ":\t" << *PI.PHI);
740 
741  // The condition is pulled into the critical path.
742  unsigned CondDepth = adjCycles(BranchDepth, PI.CondCycles);
743  if (CondDepth > MaxDepth) {
744  unsigned Extra = CondDepth - MaxDepth;
745  LLVM_DEBUG(dbgs() << "Condition adds " << Extra << " cycles.\n");
746  if (Extra > CritLimit) {
747  LLVM_DEBUG(dbgs() << "Exceeds limit of " << CritLimit << '\n');
748  return false;
749  }
750  }
751 
752  // The TBB value is pulled into the critical path.
753  unsigned TDepth = adjCycles(TBBTrace.getPHIDepth(*PI.PHI), PI.TCycles);
754  if (TDepth > MaxDepth) {
755  unsigned Extra = TDepth - MaxDepth;
756  LLVM_DEBUG(dbgs() << "TBB data adds " << Extra << " cycles.\n");
757  if (Extra > CritLimit) {
758  LLVM_DEBUG(dbgs() << "Exceeds limit of " << CritLimit << '\n');
759  return false;
760  }
761  }
762 
763  // The FBB value is pulled into the critical path.
764  unsigned FDepth = adjCycles(FBBTrace.getPHIDepth(*PI.PHI), PI.FCycles);
765  if (FDepth > MaxDepth) {
766  unsigned Extra = FDepth - MaxDepth;
767  LLVM_DEBUG(dbgs() << "FBB data adds " << Extra << " cycles.\n");
768  if (Extra > CritLimit) {
769  LLVM_DEBUG(dbgs() << "Exceeds limit of " << CritLimit << '\n');
770  return false;
771  }
772  }
773  }
774  return true;
775 }
776 
777 /// Attempt repeated if-conversion on MBB, return true if successful.
778 ///
779 bool EarlyIfConverter::tryConvertIf(MachineBasicBlock *MBB) {
780  bool Changed = false;
781  while (IfConv.canConvertIf(MBB) && shouldConvertIf()) {
782  // If-convert MBB and update analyses.
783  invalidateTraces();
785  IfConv.convertIf(RemovedBlocks);
786  Changed = true;
787  updateDomTree(RemovedBlocks);
788  updateLoops(RemovedBlocks);
789  }
790  return Changed;
791 }
792 
793 bool EarlyIfConverter::runOnMachineFunction(MachineFunction &MF) {
794  LLVM_DEBUG(dbgs() << "********** EARLY IF-CONVERSION **********\n"
795  << "********** Function: " << MF.getName() << '\n');
796  if (skipFunction(MF.getFunction()))
797  return false;
798 
799  // Only run if conversion if the target wants it.
800  const TargetSubtargetInfo &STI = MF.getSubtarget();
801  if (!STI.enableEarlyIfConversion())
802  return false;
803 
804  TII = STI.getInstrInfo();
805  TRI = STI.getRegisterInfo();
806  SchedModel = STI.getSchedModel();
807  MRI = &MF.getRegInfo();
808  DomTree = &getAnalysis<MachineDominatorTree>();
809  Loops = getAnalysisIfAvailable<MachineLoopInfo>();
810  Traces = &getAnalysis<MachineTraceMetrics>();
811  MinInstr = nullptr;
812 
813  bool Changed = false;
814  IfConv.runOnMachineFunction(MF);
815 
816  // Visit blocks in dominator tree post-order. The post-order enables nested
817  // if-conversion in a single pass. The tryConvertIf() function may erase
818  // blocks, but only blocks dominated by the head block. This makes it safe to
819  // update the dominator tree while the post-order iterator is still active.
820  for (auto DomNode : post_order(DomTree))
821  if (tryConvertIf(DomNode->getBlock()))
822  Changed = true;
823 
824  return Changed;
825 }
void resize(unsigned N, bool t=false)
resize - Grow or shrink the bitvector.
Definition: BitVector.h:372
BitVector & set()
Definition: BitVector.h:398
static cl::opt< bool > Stress("stress-early-ifcvt", cl::Hidden, cl::desc("Turn all knobs to 11"))
virtual bool canInsertSelect(const MachineBasicBlock &MBB, ArrayRef< MachineOperand > Cond, unsigned TrueReg, unsigned FalseReg, int &CondCycles, int &TrueCycles, int &FalseCycles) const
Return true if it is possible to insert a select instruction that chooses between TrueReg and FalseRe...
virtual void insertSelect(MachineBasicBlock &MBB, MachineBasicBlock::iterator I, const DebugLoc &DL, unsigned DstReg, ArrayRef< MachineOperand > Cond, unsigned TrueReg, unsigned FalseReg) const
Insert a select instruction into MBB before I that will copy TrueReg to DstReg when Cond is true...
const TargetRegisterClass * getRegClass(unsigned Reg) const
Return the register class of the specified virtual register.
This class represents lattice values for constants.
Definition: AllocatorList.h:24
std::pair< iterator, bool > insert(const ValueT &Val)
insert - Attempts to insert a new element.
Definition: SparseSet.h:250
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
unsigned Depth
Earliest issue cycle as determined by data dependencies and instruction latencies from the beginning ...
void push_back(const T &Elt)
Definition: SmallVector.h:218
iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
static bool isVirtualRegister(unsigned Reg)
Return true if the specified register number is in the virtual register namespace.
void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
unsigned Reg
bool test(unsigned Idx) const
Definition: BitVector.h:502
virtual unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const
Insert branch code into the end of the specified MachineBasicBlock.
char & EarlyIfConverterID
EarlyIfConverter - This pass performs if-conversion on SSA form by inserting cmov instructions...
STATISTIC(NumFunctions, "Total number of functions")
unsigned const TargetRegisterInfo * TRI
A debug info location.
Definition: DebugLoc.h:34
A trace ensemble is a collection of traces selected using the same strategy, for example &#39;minimum res...
static unsigned InstrCount
bool isPHI() const
virtual unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const
Remove the branching code at the end of the specific MBB.
unsigned getNumRegUnits() const
Return the number of (native) register units in the target.
virtual bool enableEarlyIfConversion() const
Enable the use of the early if conversion pass.
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition: PassSupport.h:51
Hexagon Hardware Loops
void eraseFromParent()
This method unlinks &#39;this&#39; from the containing function and deletes it.
void clear()
clear - Removes all bits from the bitvector. Does not change capacity.
Definition: BitVector.h:367
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
const HexagonInstrInfo * TII
Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
Definition: APFloat.h:42
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
Definition: MachineInstr.h:649
Printable printRegUnit(unsigned Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
MachineInstr * getVRegDef(unsigned Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
Select the trace through a block that has the fewest instructions.
INITIALIZE_PASS_BEGIN(EarlyIfConverter, DEBUG_TYPE, "Early If Converter", false, false) INITIALIZE_PASS_END(EarlyIfConverter
Base class for the actual dominator tree node.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: APInt.h:33
const std::vector< DomTreeNodeBase * > & getChildren() const
virtual const TargetInstrInfo * getInstrInfo() const
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
iterator erase(iterator I)
erase - Erases an existing element identified by a valid iterator.
Definition: SparseSet.h:286
TargetInstrInfo - Interface to description of machine instruction set.
bool empty() const
empty - Returns true if the set is empty.
Definition: SparseSet.h:184
NodeT * getBlock() const
Early If Converter
initializer< Ty > init(const Ty &Val)
Definition: CommandLine.h:423
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
unsigned const MachineRegisterInfo * MRI
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
size_t size() const
size - Get the array size.
Definition: ArrayRef.h:149
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
unsigned getCriticalPath() const
Return the length of the (data dependency) critical path through the trace.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
Definition: SmallPtrSet.h:371
InstrCycles getInstrCycles(const MachineInstr &MI) const
Return the depth and height of MI.
Represent the analysis usage information of a pass.
BitVector & reset()
Definition: BitVector.h:439
iterator_range< po_iterator< T > > post_order(const T &G)
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
Definition: SmallPtrSet.h:382
void setUniverse(unsigned U)
setUniverse - Set the universe size which determines the largest key the set can hold.
Definition: SparseSet.h:156
virtual bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify=false) const
Analyze the branching code at the end of MBB, returning true if it cannot be understood (e...
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
A trace represents a plausible sequence of executed basic blocks that passes through the current basi...
size_t size() const
Definition: SmallVector.h:53
const_iterator end() const
Definition: SparseSet.h:176
#define DEBUG_TYPE
INITIALIZE_PASS_END(RegBankSelect, DEBUG_TYPE, "Assign register bank of generic virtual registers", false, false) RegBankSelect
const unsigned MaxDepth
static unsigned adjCycles(unsigned Cyc, int Delta)
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements...
Definition: SmallPtrSet.h:418
void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
MachineOperand class - Representation of each machine instruction operand.
This is a &#39;vector&#39; (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:847
size_t getNumChildren() const
MachineInstrBuilder MachineInstrBuilder & DefMI
const_iterator begin() const
Definition: SparseSet.h:175
LLVM_NODISCARD T pop_back_val()
Definition: SmallVector.h:381
unsigned pred_size() const
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
const Function & getFunction() const
Return the LLVM function that this machine code represents.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition: Debug.cpp:133
static cl::opt< unsigned > BlockInstrLimit("early-ifcvt-limit", cl::init(30), cl::Hidden, cl::desc("Maximum number of instructions per speculated block."))
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition: BitVector.h:941
bool isValid() const
isValid - returns true if this iterator is not yet at the end.
unsigned succ_size() const
const MachineBasicBlock * getParent() const
Definition: MachineInstr.h:254
MachineRegisterInfo - Keep track of information for virtual and physical registers, including vreg register classes, use/def chains for registers, etc.
TargetSubtargetInfo - Generic base class for all target subtargets.
Representation of each machine instruction.
Definition: MachineInstr.h:64
static bool isPhysicalRegister(unsigned Reg)
Return true if the specified register number is in the physical register namespace.
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB &#39;Other&#39; at the position From, and insert it into this MBB right before &#39;...
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
LLVM_NODISCARD bool empty() const
Definition: SmallVector.h:56
#define I(x, y, z)
Definition: MD5.cpp:58
A set of register units used to track register liveness.
Definition: LiveRegUnits.h:31
void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
void clear()
clear - Clears the set.
Definition: SparseSet.h:195
unsigned getPHIDepth(const MachineInstr &PHI) const
Return the Depth of a PHI instruction in a trace center block successor.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
unsigned getResourceLength(ArrayRef< const MachineBasicBlock *> Extrablocks=None, ArrayRef< const MCSchedClassDesc *> ExtraInstrs=None, ArrayRef< const MCSchedClassDesc *> RemoveInstrs=None) const
Return the resource length of the trace.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:49
unsigned getInstrSlack(const MachineInstr &MI) const
Return the slack of MI.
#define LLVM_DEBUG(X)
Definition: Debug.h:123
Machine model for scheduling, bundling, and heuristics.
Definition: MCSchedule.h:244
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
const MCSchedModel & getSchedModel() const
Get the machine model for this subtarget&#39;s CPU.
unsigned createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...