LLVM 24.0.0git
EarlyIfConversion.cpp
Go to the documentation of this file.
1//===-- EarlyIfConversion.cpp - If-conversion on SSA form machine code ----===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// Early if-conversion is for out-of-order CPUs that don't have a lot of
10// predicable instructions. The goal is to eliminate conditional branches that
11// may mispredict.
12//
13// Instructions from both sides of the branch are executed specutatively, and a
14// cmov instruction selects the result.
15//
16//===----------------------------------------------------------------------===//
17
19#include "llvm/ADT/BitVector.h"
20#include "llvm/ADT/DenseMap.h"
21#include "llvm/ADT/DenseSet.h"
24#include "llvm/ADT/SparseSet.h"
25#include "llvm/ADT/Statistic.h"
46#include "llvm/Support/Debug.h"
48
49using namespace llvm;
50
51#define DEBUG_TYPE "early-ifcvt"
52
53// Absolute maximum number of instructions allowed per speculated block.
54// This bypasses all other heuristics, so it should be set fairly high.
56BlockInstrLimit("early-ifcvt-limit", cl::init(30), cl::Hidden,
57 cl::desc("Maximum number of instructions per speculated block."));
58
59// Stress testing mode - disable heuristics.
60static cl::opt<bool> Stress("stress-early-ifcvt", cl::Hidden,
61 cl::desc("Turn all knobs to 11"));
62
63// Enable analysis of data dependent branches (conditions derived from loads).
65 "enable-early-ifcvt-data-dependent", cl::Hidden, cl::init(false),
66 cl::desc("Enable hard-to-predict branch analysis for if-conversion"));
67
68// Limit the number steps we take when searching conditions that depend on
69// values recently loaded from memory.
71 MaxNumSteps("early-ifcvt-max-steps", cl::Hidden, cl::init(16),
72 cl::desc("Limit the number of steps taken when searching for a "
73 "recently loaded value"));
74
75// Limit the work done when looking for calls between a load and the condition
76// it feeds.
78 "early-ifcvt-max-region-instrs", cl::Hidden, cl::init(64),
79 cl::desc("Limit the number of blocks and instructions examined when "
80 "searching for calls between a load and the condition it feeds"));
81
82STATISTIC(NumDiamondsSeen, "Number of diamonds");
83STATISTIC(NumDiamondsConv, "Number of diamonds converted");
84STATISTIC(NumTrianglesSeen, "Number of triangles");
85STATISTIC(NumTrianglesConv, "Number of triangles converted");
86STATISTIC(NumDataDependant,
87 "Number of data dependent conditional branches encountered");
88STATISTIC(NumLikelyBiased, "Number of branches with a hot path encountered");
89
90//===----------------------------------------------------------------------===//
91// SSAIfConv
92//===----------------------------------------------------------------------===//
93//
94// The SSAIfConv class performs if-conversion on SSA form machine code after
95// determining if it is possible. The class contains no heuristics; external
96// code should be used to determine when if-conversion is a good idea.
97//
98// SSAIfConv can convert both triangles and diamonds:
99//
100// Triangle: Head Diamond: Head
101// | \ / \_
102// | \ / |
103// | [TF]BB FBB TBB
104// | / \ /
105// | / \ /
106// Tail Tail
107//
108// Instructions in the conditional blocks TBB and/or FBB are spliced into the
109// Head block, and phis in the Tail block are converted to select instructions.
110//
111namespace {
112class SSAIfConv {
113 const TargetInstrInfo *TII;
114 const TargetRegisterInfo *TRI;
116
117public:
118 /// The block containing the conditional branch.
119 MachineBasicBlock *Head;
120
121 /// The block containing phis after the if-then-else.
122 MachineBasicBlock *Tail;
123
124 /// The 'true' conditional block as determined by analyzeBranch.
126
127 /// The 'false' conditional block as determined by analyzeBranch.
129
130 /// isTriangle - When there is no 'else' block, either TBB or FBB will be
131 /// equal to Tail.
132 bool isTriangle() const { return TBB == Tail || FBB == Tail; }
133
134 /// Returns the Tail predecessor for the True side.
135 MachineBasicBlock *getTPred() const { return TBB == Tail ? Head : TBB; }
136
137 /// Returns the Tail predecessor for the False side.
138 MachineBasicBlock *getFPred() const { return FBB == Tail ? Head : FBB; }
139
140 /// Information about each phi in the Tail block.
141 struct PHIInfo {
142 MachineInstr *PHI;
143 Register TReg, FReg;
144 // Latencies from Cond+Branch, TReg, and FReg to DstReg.
145 int CondCycles = 0, TCycles = 0, FCycles = 0;
146
147 PHIInfo(MachineInstr *phi) : PHI(phi) {}
148 };
149
151
152 /// The branch condition determined by analyzeBranch.
153 SmallVector<MachineOperand, 4> Cond;
154
155private:
156 /// Instructions in Head that define values used by the conditional blocks.
157 /// The hoisted instructions must be inserted after these instructions.
158 SmallPtrSet<MachineInstr*, 8> InsertAfter;
159
160 /// Register units clobbered by the conditional blocks.
161 BitVector ClobberedRegUnits;
162
163 // Scratch pad for findInsertionPoint.
164 SparseSet<MCRegUnit, MCRegUnit, MCRegUnitToIndex> LiveRegUnits;
165
166 /// Insertion point in Head for speculatively executed instructions form TBB
167 /// and FBB.
168 MachineBasicBlock::iterator InsertionPoint;
169
170 /// Return true if all non-terminator instructions in MBB can be safely
171 /// speculated.
172 bool canSpeculateInstrs(MachineBasicBlock *MBB);
173
174 /// Return true if all non-terminator instructions in MBB can be safely
175 /// predicated.
176 bool canPredicateInstrs(MachineBasicBlock *MBB);
177
178 /// Scan through instruction dependencies and update InsertAfter array.
179 /// Return false if any dependency is incompatible with if conversion.
180 bool InstrDependenciesAllowIfConv(MachineInstr *I);
181
182 /// Predicate all instructions of the basic block with current condition
183 /// except for terminators. Reverse the condition if ReversePredicate is set.
184 void PredicateBlock(MachineBasicBlock *MBB, bool ReversePredicate);
185
186 /// Find a valid insertion point in Head.
187 bool findInsertionPoint();
188
189 /// Replace PHI instructions in Tail with selects.
190 void replacePHIInstrs();
191
192 /// Insert selects and rewrite PHI operands to use them.
193 void rewritePHIOperands();
194
195 /// If virtual register has "killed" flag in TBB and FBB basic blocks, remove
196 /// the flag in TBB instruction.
197 void clearRepeatedKillFlagsFromTBB(MachineBasicBlock *TBB,
198 MachineBasicBlock *FBB);
199
200public:
201 /// init - Initialize per-function data structures.
202 void init(MachineFunction &MF) {
203 TII = MF.getSubtarget().getInstrInfo();
204 TRI = MF.getSubtarget().getRegisterInfo();
205 MRI = &MF.getRegInfo();
206 LiveRegUnits.clear();
207 LiveRegUnits.setUniverse(TRI->getNumRegUnits());
208 ClobberedRegUnits.clear();
209 ClobberedRegUnits.resize(TRI->getNumRegUnits());
210 }
211
212 /// canConvertIf - If the sub-CFG headed by MBB can be if-converted,
213 /// initialize the internal state, and return true.
214 /// If predicate is set try to predicate the block otherwise try to
215 /// speculatively execute it.
216 bool canConvertIf(MachineBasicBlock *MBB, bool Predicate = false);
217
218 /// convertIf - If-convert the last block passed to canConvertIf(), assuming
219 /// it is possible. Add any blocks that are to be erased to RemoveBlocks.
220 void convertIf(SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks,
221 bool Predicate = false);
222};
223} // end anonymous namespace
224
225/// canSpeculateInstrs - Returns true if all the instructions in MBB can safely
226/// be speculated. The terminators are not considered.
227///
228/// If instructions use any values that are defined in the head basic block,
229/// the defining instructions are added to InsertAfter.
230///
231/// Any clobbered regunits are added to ClobberedRegUnits.
232///
233bool SSAIfConv::canSpeculateInstrs(MachineBasicBlock *MBB) {
234 // Reject any live-in physregs. It's probably CPSR/EFLAGS, and very hard to
235 // get right.
236 if (!MBB->livein_empty()) {
237 LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << " has live-ins.\n");
238 return false;
239 }
240
241 unsigned InstrCount = 0;
242
243 // Check all instructions, except the terminators. It is assumed that
244 // terminators never have side effects or define any used register values.
245 for (MachineInstr &MI :
247 if (MI.isDebugInstr())
248 continue;
249
250 if (++InstrCount > BlockInstrLimit && !Stress) {
251 LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << " has more than "
252 << BlockInstrLimit << " instructions.\n");
253 return false;
254 }
255
256 // There shouldn't normally be any phis in a single-predecessor block.
257 if (MI.isPHI()) {
258 LLVM_DEBUG(dbgs() << "Can't hoist: " << MI);
259 return false;
260 }
261
262 // Don't speculate loads. Note that it may be possible and desirable to
263 // speculate GOT or constant pool loads that are guaranteed not to trap,
264 // but we don't support that for now.
265 if (MI.mayLoad()) {
266 LLVM_DEBUG(dbgs() << "Won't speculate load: " << MI);
267 return false;
268 }
269
270 // We never speculate stores, so an AA pointer isn't necessary.
271 bool DontMoveAcrossStore = true;
272 if (!MI.isSafeToMove(DontMoveAcrossStore)) {
273 LLVM_DEBUG(dbgs() << "Can't speculate: " << MI);
274 return false;
275 }
276
277 // Check for any dependencies on Head instructions.
278 if (!InstrDependenciesAllowIfConv(&MI))
279 return false;
280 }
281 return true;
282}
283
284/// Check that there is no dependencies preventing if conversion.
285///
286/// If instruction uses any values that are defined in the head basic block,
287/// the defining instructions are added to InsertAfter.
288bool SSAIfConv::InstrDependenciesAllowIfConv(MachineInstr *I) {
289 for (const MachineOperand &MO : I->operands()) {
290 if (MO.isRegMask()) {
291 LLVM_DEBUG(dbgs() << "Won't speculate regmask: " << *I);
292 return false;
293 }
294 if (!MO.isReg())
295 continue;
296 Register Reg = MO.getReg();
297
298 // Remember clobbered regunits.
299 if (MO.isDef() && Reg.isPhysical())
300 for (MCRegUnit Unit : TRI->regunits(Reg.asMCReg()))
301 ClobberedRegUnits.set(static_cast<unsigned>(Unit));
302
303 if (!MO.readsReg() || !Reg.isVirtual())
304 continue;
305 MachineInstr *DefMI = MRI->getVRegDef(Reg);
306 if (!DefMI || DefMI->getParent() != Head)
307 continue;
308 if (InsertAfter.insert(DefMI).second)
309 LLVM_DEBUG(dbgs() << printMBBReference(*I->getParent()) << " depends on "
310 << *DefMI);
311 if (DefMI->isTerminator()) {
312 LLVM_DEBUG(dbgs() << "Can't insert instructions below terminator.\n");
313 return false;
314 }
315 }
316 return true;
317}
318
319/// canPredicateInstrs - Returns true if all the instructions in MBB can safely
320/// be predicates. The terminators are not considered.
321///
322/// If instructions use any values that are defined in the head basic block,
323/// the defining instructions are added to InsertAfter.
324///
325/// Any clobbered regunits are added to ClobberedRegUnits.
326///
327bool SSAIfConv::canPredicateInstrs(MachineBasicBlock *MBB) {
328 // Reject any live-in physregs. It's probably CPSR/EFLAGS, and very hard to
329 // get right.
330 if (!MBB->livein_empty()) {
331 LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << " has live-ins.\n");
332 return false;
333 }
334
335 unsigned InstrCount = 0;
336
337 // Check all instructions, except the terminators. It is assumed that
338 // terminators never have side effects or define any used register values.
341 I != E; ++I) {
342 if (I->isDebugInstr())
343 continue;
344
345 if (++InstrCount > BlockInstrLimit && !Stress) {
346 LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << " has more than "
347 << BlockInstrLimit << " instructions.\n");
348 return false;
349 }
350
351 // There shouldn't normally be any phis in a single-predecessor block.
352 if (I->isPHI()) {
353 LLVM_DEBUG(dbgs() << "Can't predicate: " << *I);
354 return false;
355 }
356
357 // Check that instruction is predicable
358 if (!TII->isPredicable(*I)) {
359 LLVM_DEBUG(dbgs() << "Isn't predicable: " << *I);
360 return false;
361 }
362
363 // Check that instruction is not already predicated.
364 if (TII->isPredicated(*I) && !TII->canPredicatePredicatedInstr(*I)) {
365 LLVM_DEBUG(dbgs() << "Is already predicated: " << *I);
366 return false;
367 }
368
369 // Check for any dependencies on Head instructions.
370 if (!InstrDependenciesAllowIfConv(&(*I)))
371 return false;
372 }
373 return true;
374}
375
376// Apply predicate to all instructions in the machine block.
377void SSAIfConv::PredicateBlock(MachineBasicBlock *MBB, bool ReversePredicate) {
378 auto Condition = Cond;
379 if (ReversePredicate) {
380 bool CanRevCond = !TII->reverseBranchCondition(Condition);
381 assert(CanRevCond && "Reversed predicate is not supported");
382 (void)CanRevCond;
383 }
384 // Terminators don't need to be predicated as they will be removed.
387 I != E; ++I) {
388 if (I->isDebugInstr())
389 continue;
390 TII->PredicateInstruction(*I, Condition);
391 }
392}
393
394/// Find an insertion point in Head for the speculated instructions. The
395/// insertion point must be:
396///
397/// 1. Before any terminators.
398/// 2. After any instructions in InsertAfter.
399/// 3. Not have any clobbered regunits live.
400///
401/// This function sets InsertionPoint and returns true when successful, it
402/// returns false if no valid insertion point could be found.
403///
404bool SSAIfConv::findInsertionPoint() {
405 // Keep track of live regunits before the current position.
406 // Only track RegUnits that are also in ClobberedRegUnits.
407 LiveRegUnits.clear();
412 while (I != B) {
413 --I;
414 // Some of the conditional code depends in I.
415 if (InsertAfter.count(&*I)) {
416 LLVM_DEBUG(dbgs() << "Can't insert code after " << *I);
417 return false;
418 }
419
420 // Update live regunits.
421 for (const MachineOperand &MO : I->operands()) {
422 // We're ignoring regmask operands. That is conservatively correct.
423 if (!MO.isReg())
424 continue;
425 Register Reg = MO.getReg();
426 if (!Reg.isPhysical())
427 continue;
428 // I clobbers Reg, so it isn't live before I.
429 if (MO.isDef())
430 for (MCRegUnit Unit : TRI->regunits(Reg.asMCReg()))
431 LiveRegUnits.erase(Unit);
432 // Unless I reads Reg.
433 if (MO.readsReg())
434 Reads.push_back(Reg.asMCReg());
435 }
436 // Anything read by I is live before I.
437 while (!Reads.empty())
438 for (MCRegUnit Unit : TRI->regunits(Reads.pop_back_val()))
439 if (ClobberedRegUnits.test(static_cast<unsigned>(Unit)))
440 LiveRegUnits.insert(Unit);
441
442 // We can't insert before a terminator.
443 if (I != FirstTerm && I->isTerminator())
444 continue;
445
446 // Some of the clobbered registers are live before I, not a valid insertion
447 // point.
448 if (!LiveRegUnits.empty()) {
449 LLVM_DEBUG({
450 dbgs() << "Would clobber";
451 for (MCRegUnit LRU : LiveRegUnits)
452 dbgs() << ' ' << printRegUnit(LRU, TRI);
453 dbgs() << " live before " << *I;
454 });
455 continue;
456 }
457
458 // This is a valid insertion point.
459 InsertionPoint = I;
460 LLVM_DEBUG(dbgs() << "Can insert before " << *I);
461 return true;
462 }
463 LLVM_DEBUG(dbgs() << "No legal insertion point found.\n");
464 return false;
465}
466
467
468
469/// canConvertIf - analyze the sub-cfg rooted in MBB, and return true if it is
470/// a potential candidate for if-conversion. Fill out the internal state.
471///
472bool SSAIfConv::canConvertIf(MachineBasicBlock *MBB, bool Predicate) {
473 Head = MBB;
474 TBB = FBB = Tail = nullptr;
475
476 if (Head->succ_size() != 2)
477 return false;
478 MachineBasicBlock *Succ0 = Head->succ_begin()[0];
479 MachineBasicBlock *Succ1 = Head->succ_begin()[1];
480
481 // Canonicalize so Succ0 has MBB as its single predecessor.
482 if (Succ0->pred_size() != 1)
483 std::swap(Succ0, Succ1);
484
485 if (Succ0->pred_size() != 1 || Succ0->succ_size() != 1)
486 return false;
487
488 Tail = Succ0->succ_begin()[0];
489
490 // This is not a triangle.
491 if (Tail != Succ1) {
492 // Check for a diamond. We won't deal with any critical edges.
493 if (Succ1->pred_size() != 1 || Succ1->succ_size() != 1 ||
494 Succ1->succ_begin()[0] != Tail)
495 return false;
496 LLVM_DEBUG(dbgs() << "\nDiamond: " << printMBBReference(*Head) << " -> "
497 << printMBBReference(*Succ0) << "/"
498 << printMBBReference(*Succ1) << " -> "
499 << printMBBReference(*Tail) << '\n');
500
501 // Live-in physregs are tricky to get right when speculating code.
502 if (!Tail->livein_empty()) {
503 LLVM_DEBUG(dbgs() << "Tail has live-ins.\n");
504 return false;
505 }
506 } else {
507 LLVM_DEBUG(dbgs() << "\nTriangle: " << printMBBReference(*Head) << " -> "
508 << printMBBReference(*Succ0) << " -> "
509 << printMBBReference(*Tail) << '\n');
510 }
511
512 // This is a triangle or a diamond.
513 // Skip if we cannot predicate and there are no phis skip as there must be
514 // side effects that can only be handled with predication.
515 if (!Predicate && (Tail->empty() || !Tail->front().isPHI())) {
516 LLVM_DEBUG(dbgs() << "No phis in tail.\n");
517 return false;
518 }
519
520 // The branch we're looking to eliminate must be analyzable.
521 Cond.clear();
522 if (TII->analyzeBranch(*Head, TBB, FBB, Cond)) {
523 LLVM_DEBUG(dbgs() << "Branch not analyzable.\n");
524 return false;
525 }
526
527 // This is weird, probably some sort of degenerate CFG.
528 if (!TBB) {
529 LLVM_DEBUG(dbgs() << "analyzeBranch didn't find conditional branch.\n");
530 return false;
531 }
532
533 // Make sure the analyzed branch is conditional; one of the successors
534 // could be a landing pad. (Empty landing pads can be generated on Windows.)
535 if (Cond.empty()) {
536 LLVM_DEBUG(dbgs() << "analyzeBranch found an unconditional branch.\n");
537 return false;
538 }
539
540 // analyzeBranch doesn't set FBB on a fall-through branch.
541 // Make sure it is always set.
542 FBB = TBB == Succ0 ? Succ1 : Succ0;
543
544 // Any phis in the tail block must be convertible to selects.
545 PHIs.clear();
546 MachineBasicBlock *TPred = getTPred();
547 MachineBasicBlock *FPred = getFPred();
548 for (MachineBasicBlock::iterator I = Tail->begin(), E = Tail->end();
549 I != E && I->isPHI(); ++I) {
550 PHIs.push_back(&*I);
551 PHIInfo &PI = PHIs.back();
552 // Find PHI operands corresponding to TPred and FPred.
553 for (unsigned i = 1; i != PI.PHI->getNumOperands(); i += 2) {
554 if (PI.PHI->getOperand(i+1).getMBB() == TPred)
555 PI.TReg = PI.PHI->getOperand(i).getReg();
556 if (PI.PHI->getOperand(i+1).getMBB() == FPred)
557 PI.FReg = PI.PHI->getOperand(i).getReg();
558 }
559 assert(PI.TReg.isVirtual() && "Bad PHI");
560 assert(PI.FReg.isVirtual() && "Bad PHI");
561
562 // Get target information.
563 if (!TII->canInsertSelect(*Head, Cond, PI.PHI->getOperand(0).getReg(),
564 PI.TReg, PI.FReg, PI.CondCycles, PI.TCycles,
565 PI.FCycles)) {
566 LLVM_DEBUG(dbgs() << "Can't convert: " << *PI.PHI);
567 return false;
568 }
569 }
570
571 // Check that the conditional instructions can be speculated.
572 InsertAfter.clear();
573 ClobberedRegUnits.reset();
574 if (Predicate) {
575 if (TBB != Tail && !canPredicateInstrs(TBB))
576 return false;
577 if (FBB != Tail && !canPredicateInstrs(FBB))
578 return false;
579 } else {
580 if (TBB != Tail && !canSpeculateInstrs(TBB))
581 return false;
582 if (FBB != Tail && !canSpeculateInstrs(FBB))
583 return false;
584 }
585
586 // Try to find a valid insertion point for the speculated instructions in the
587 // head basic block.
588 if (!findInsertionPoint())
589 return false;
590
591 if (isTriangle())
592 ++NumTrianglesSeen;
593 else
594 ++NumDiamondsSeen;
595 return true;
596}
597
598/// \return true iff the two registers are known to have the same value.
599static bool hasSameValue(const MachineRegisterInfo &MRI,
600 const TargetInstrInfo *TII, Register TReg,
601 Register FReg) {
602 if (TReg == FReg)
603 return true;
604
605 if (!TReg.isVirtual() || !FReg.isVirtual())
606 return false;
607
608 const MachineInstr *TDef = MRI.getUniqueVRegDef(TReg);
609 const MachineInstr *FDef = MRI.getUniqueVRegDef(FReg);
610 if (!TDef || !FDef)
611 return false;
612
613 // If there are side-effects, all bets are off.
614 if (TDef->hasUnmodeledSideEffects())
615 return false;
616
617 // If the instruction could modify memory, or there may be some intervening
618 // store between the two, we can't consider them to be equal.
619 if (TDef->mayLoadOrStore() && !TDef->isDereferenceableInvariantLoad())
620 return false;
621
622 // We also can't guarantee that they are the same if, for example, the
623 // instructions are both a copy from a physical reg, because some other
624 // instruction may have modified the value in that reg between the two
625 // defining insts.
626 if (any_of(TDef->uses(), [](const MachineOperand &MO) {
627 return MO.isReg() && MO.getReg().isPhysical();
628 }))
629 return false;
630
631 // Check whether the two defining instructions produce the same value(s).
632 if (!TII->produceSameValue(*TDef, *FDef, &MRI))
633 return false;
634
635 // Further, check that the two defs come from corresponding operands.
636 int TIdx = TDef->findRegisterDefOperandIdx(TReg, /*TRI=*/nullptr);
637 int FIdx = FDef->findRegisterDefOperandIdx(FReg, /*TRI=*/nullptr);
638 if (TIdx == -1 || FIdx == -1)
639 return false;
640
641 return TIdx == FIdx;
642}
643
644/// replacePHIInstrs - Completely replace PHI instructions with selects.
645/// This is possible when the only Tail predecessors are the if-converted
646/// blocks.
647void SSAIfConv::replacePHIInstrs() {
648 assert(Tail->pred_size() == 2 && "Cannot replace PHIs");
650 assert(FirstTerm != Head->end() && "No terminators");
651 DebugLoc HeadDL = FirstTerm->getDebugLoc();
652
653 // Convert all PHIs to select instructions inserted before FirstTerm.
654 for (PHIInfo &PI : PHIs) {
655 LLVM_DEBUG(dbgs() << "If-converting " << *PI.PHI);
656 Register DstReg = PI.PHI->getOperand(0).getReg();
657 if (hasSameValue(*MRI, TII, PI.TReg, PI.FReg)) {
658 // We do not need the select instruction if both incoming values are
659 // equal, but we do need a COPY.
660 BuildMI(*Head, FirstTerm, HeadDL, TII->get(TargetOpcode::COPY), DstReg)
661 .addReg(PI.TReg);
662 } else {
663 TII->insertSelect(*Head, FirstTerm, HeadDL, DstReg, Cond, PI.TReg,
664 PI.FReg);
665 }
666 LLVM_DEBUG(dbgs() << " --> " << *std::prev(FirstTerm));
667 PI.PHI->eraseFromParent();
668 PI.PHI = nullptr;
669 }
670}
671
672/// rewritePHIOperands - When there are additional Tail predecessors, insert
673/// select instructions in Head and rewrite PHI operands to use the selects.
674/// Keep the PHI instructions in Tail to handle the other predecessors.
675void SSAIfConv::rewritePHIOperands() {
677 assert(FirstTerm != Head->end() && "No terminators");
678 DebugLoc HeadDL = FirstTerm->getDebugLoc();
679
680 // Convert all PHIs to select instructions inserted before FirstTerm.
681 for (PHIInfo &PI : PHIs) {
682 Register DstReg;
683
684 LLVM_DEBUG(dbgs() << "If-converting " << *PI.PHI);
685 if (hasSameValue(*MRI, TII, PI.TReg, PI.FReg)) {
686 // We do not need the select instruction if both incoming values are
687 // equal.
688 DstReg = PI.TReg;
689 } else {
690 Register PHIDst = PI.PHI->getOperand(0).getReg();
691 DstReg = MRI->createVirtualRegister(MRI->getRegClass(PHIDst));
692 TII->insertSelect(*Head, FirstTerm, HeadDL,
693 DstReg, Cond, PI.TReg, PI.FReg);
694 LLVM_DEBUG(dbgs() << " --> " << *std::prev(FirstTerm));
695 }
696
697 // Rewrite PHI operands TPred -> (DstReg, Head), remove FPred.
698 for (unsigned i = PI.PHI->getNumOperands(); i != 1; i -= 2) {
699 MachineBasicBlock *MBB = PI.PHI->getOperand(i-1).getMBB();
700 if (MBB == getTPred()) {
701 PI.PHI->getOperand(i-1).setMBB(Head);
702 PI.PHI->getOperand(i-2).setReg(DstReg);
703 } else if (MBB == getFPred()) {
704 PI.PHI->removeOperand(i-1);
705 PI.PHI->removeOperand(i-2);
706 }
707 }
708 LLVM_DEBUG(dbgs() << " --> " << *PI.PHI);
709 }
710}
711
712void SSAIfConv::clearRepeatedKillFlagsFromTBB(MachineBasicBlock *TBB,
713 MachineBasicBlock *FBB) {
714 assert(TBB != FBB);
715
716 // Collect virtual registers killed in FBB.
717 SmallDenseSet<Register> FBBKilledRegs;
718 for (MachineInstr &MI : FBB->instrs()) {
719 for (MachineOperand &MO : MI.operands()) {
720 if (MO.isReg() && MO.isKill() && MO.getReg().isVirtual())
721 FBBKilledRegs.insert(MO.getReg());
722 }
723 }
724
725 if (FBBKilledRegs.empty())
726 return;
727
728 // Find the same killed registers in TBB and clear kill flags for them.
729 for (MachineInstr &MI : TBB->instrs()) {
730 for (MachineOperand &MO : MI.operands()) {
731 if (MO.isReg() && MO.isKill() && FBBKilledRegs.contains(MO.getReg()))
732 MO.setIsKill(false);
733 }
734 }
735}
736
737/// convertIf - Execute the if conversion after canConvertIf has determined the
738/// feasibility.
739///
740/// Any basic blocks that need to be erased will be added to RemoveBlocks.
741///
742void SSAIfConv::convertIf(SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks,
743 bool Predicate) {
744 assert(Head && Tail && TBB && FBB && "Call canConvertIf first.");
745
746 // Update statistics.
747 if (isTriangle())
748 ++NumTrianglesConv;
749 else
750 ++NumDiamondsConv;
751
752 // If both blocks are going to be merged into Head, remove "killed" flag in
753 // TBB for registers, which are killed in TBB and FBB. Otherwise, register
754 // will be killed twice in Head after splice. Register killed twice is an
755 // incorrect MIR.
756 if (TBB != Tail && FBB != Tail)
757 clearRepeatedKillFlagsFromTBB(TBB, FBB);
758
759 // Move all instructions into Head, except for the terminators.
760 if (TBB != Tail) {
761 if (Predicate)
762 PredicateBlock(TBB, /*ReversePredicate=*/false);
763 Head->splice(InsertionPoint, TBB, TBB->begin(), TBB->getFirstTerminator());
764 }
765 if (FBB != Tail) {
766 if (Predicate)
767 PredicateBlock(FBB, /*ReversePredicate=*/true);
768 Head->splice(InsertionPoint, FBB, FBB->begin(), FBB->getFirstTerminator());
769 }
770 // Are there extra Tail predecessors?
771 bool ExtraPreds = Tail->pred_size() != 2;
772 if (ExtraPreds)
773 rewritePHIOperands();
774 else
775 replacePHIInstrs();
776
777 // Fix up the CFG, temporarily leave Head without any successors.
778 Head->removeSuccessor(TBB);
779 Head->removeSuccessor(FBB, true);
780 if (TBB != Tail)
781 TBB->removeSuccessor(Tail, true);
782 if (FBB != Tail)
783 FBB->removeSuccessor(Tail, true);
784
785 // Fix up Head's terminators.
786 // It should become a single branch or a fallthrough.
787 DebugLoc HeadDL = Head->getFirstTerminator()->getDebugLoc();
788 TII->removeBranch(*Head);
789
790 // Mark the now empty conditional blocks for removal and move them to the end.
791 // It is likely that Head can fall
792 // through to Tail, and we can join the two blocks.
793 if (TBB != Tail) {
794 RemoveBlocks.push_back(TBB);
795 if (TBB != &TBB->getParent()->back())
796 TBB->moveAfter(&TBB->getParent()->back());
797 }
798 if (FBB != Tail) {
799 RemoveBlocks.push_back(FBB);
800 if (FBB != &FBB->getParent()->back())
801 FBB->moveAfter(&FBB->getParent()->back());
802 }
803
804 assert(Head->succ_empty() && "Additional head successors?");
805 if (!ExtraPreds && Head->isLayoutSuccessor(Tail)) {
806 // Splice Tail onto the end of Head.
807 LLVM_DEBUG(dbgs() << "Joining tail " << printMBBReference(*Tail)
808 << " into head " << printMBBReference(*Head) << '\n');
809 Head->splice(Head->end(), Tail,
810 Tail->begin(), Tail->end());
812 RemoveBlocks.push_back(Tail);
813 if (Tail != &Tail->getParent()->back())
814 Tail->moveAfter(&Tail->getParent()->back());
815 } else {
816 // We need a branch to Tail, let code placement work it out later.
817 LLVM_DEBUG(dbgs() << "Converting to unconditional branch.\n");
819 TII->insertBranch(*Head, Tail, nullptr, EmptyCond, HeadDL);
820 Head->addSuccessor(Tail);
821 }
822 LLVM_DEBUG(dbgs() << *Head);
823}
824
825//===----------------------------------------------------------------------===//
826// EarlyIfConverter Pass
827//===----------------------------------------------------------------------===//
828
829namespace {
830class EarlyIfConverter {
831 const TargetInstrInfo *TII = nullptr;
832 const TargetRegisterInfo *TRI = nullptr;
833 const TargetSubtargetInfo *STI = nullptr;
834 MachineRegisterInfo *MRI = nullptr;
835 MachineDominatorTree *DomTree = nullptr;
836 MachineLoopInfo *Loops = nullptr;
837 MachineTraceMetrics *Traces = nullptr;
838 MachineTraceMetrics::Ensemble *MinInstr = nullptr;
839 MachineBranchProbabilityInfo *MBPI = nullptr;
840 SSAIfConv IfConv;
841
842 /// Cache of basic blocks verified to contain no call instructions, mapping
843 /// each block to the number of instructions scanned in it.
844 DenseMap<const MachineBasicBlock *, unsigned> NoCallBlocksCache;
845
846public:
847 EarlyIfConverter(MachineDominatorTree &DT, MachineLoopInfo &LI,
848 MachineTraceMetrics &MTM, MachineBranchProbabilityInfo *MBPI)
849 : DomTree(&DT), Loops(&LI), Traces(&MTM), MBPI(MBPI) {}
850 EarlyIfConverter() = delete;
851
852 bool run(MachineFunction &MF);
853
854private:
855 bool tryConvertIf(MachineBasicBlock *);
856 void invalidateTraces();
857 bool shouldConvertIf();
858 bool isConditionDataDependent();
859 bool doOperandsComeFromMemory(const MachineInstr *ConditionDef);
860 bool hasCallOrLoopInRange(const MachineInstr *From, const MachineInstr *To);
861};
862
863class EarlyIfConverterLegacy : public MachineFunctionPass {
864public:
865 static char ID;
866 EarlyIfConverterLegacy() : MachineFunctionPass(ID) {}
867 void getAnalysisUsage(AnalysisUsage &AU) const override;
868 bool runOnMachineFunction(MachineFunction &MF) override;
869 StringRef getPassName() const override { return "Early If-Conversion"; }
870};
871} // end anonymous namespace
872
873char EarlyIfConverterLegacy::ID = 0;
874char &llvm::EarlyIfConverterLegacyID = EarlyIfConverterLegacy::ID;
875
876INITIALIZE_PASS_BEGIN(EarlyIfConverterLegacy, DEBUG_TYPE, "Early If Converter",
877 false, false)
881INITIALIZE_PASS_END(EarlyIfConverterLegacy, DEBUG_TYPE, "Early If Converter",
883
884void EarlyIfConverterLegacy::getAnalysisUsage(AnalysisUsage &AU) const {
885 AU.addPreserved<MachineRegisterClassInfoWrapperPass>();
887 AU.addRequired<MachineDominatorTreeWrapperPass>();
888 AU.addPreserved<MachineDominatorTreeWrapperPass>();
889 AU.addRequired<MachineLoopInfoWrapperPass>();
890 AU.addPreserved<MachineLoopInfoWrapperPass>();
891 AU.addRequired<MachineTraceMetricsWrapperPass>();
892 AU.addPreserved<MachineTraceMetricsWrapperPass>();
894}
895
896namespace {
897/// Update the dominator tree after if-conversion erased some blocks.
898void updateDomTree(MachineDominatorTree *DomTree, const SSAIfConv &IfConv,
900 // convertIf can remove TBB, FBB, and Tail can be merged into Head.
901 // TBB and FBB should not dominate any blocks.
902 // Tail children should be transferred to Head.
903 MachineDomTreeNode *HeadNode = DomTree->getNode(IfConv.Head);
904 for (auto *B : Removed) {
905 MachineDomTreeNode *Node = DomTree->getNode(B);
906 assert(Node != HeadNode && "Cannot erase the head node");
907 while (!Node->isLeaf()) {
908 assert(Node->getBlock() == IfConv.Tail && "Unexpected children");
909 DomTree->changeImmediateDominator(*Node->begin(), HeadNode);
910 }
911 DomTree->eraseNode(B);
912 }
913}
914
915/// Update LoopInfo after if-conversion.
916void updateLoops(MachineLoopInfo *Loops,
918 // If-conversion doesn't change loop structure, and it doesn't mess with back
919 // edges, so updating LoopInfo is simply removing the dead blocks.
920 for (auto *B : Removed)
921 Loops->removeBlock(B);
922}
923} // namespace
924
925/// Invalidate MachineTraceMetrics before if-conversion.
926void EarlyIfConverter::invalidateTraces() {
927 Traces->verifyAnalysis();
928 Traces->invalidate(IfConv.Head);
929 Traces->invalidate(IfConv.Tail);
930 Traces->invalidate(IfConv.TBB);
931 Traces->invalidate(IfConv.FBB);
932 Traces->verifyAnalysis();
933}
934
935static bool isConstantPoolLoad(const MachineInstr *MI) {
936 return MI->mayLoad() && any_of(MI->memoperands(), [](MachineMemOperand *MOp) {
937 const PseudoSourceValue *PSV = MOp->getPseudoValue();
938 return PSV && PSV->isConstantPool();
939 });
940}
941
942/// Check whether the load in From and the condition in To are far apart, i.e.
943/// whether a call or a loop can be executed between them. This is done by first
944/// scanning the instructions within From and To MBBs. If no call is found, we
945/// then scan all blocks which are dominated by From (the load) and can reach To
946/// (the condition), looking for calls and for blocks belonging to a loop the
947/// condition is not part of.
948bool EarlyIfConverter::hasCallOrLoopInRange(const MachineInstr *From,
949 const MachineInstr *To) {
950 if (From == To)
951 return false;
952
953 LLVM_DEBUG(dbgs() << " checking for a call or loop between " << *From
954 << " and " << *To);
955 assert(DomTree->dominates(From, To) && "From is expected to dominate To");
956
957 const MachineBasicBlock *FromBB = From->getParent();
958 const MachineBasicBlock *ToBB = To->getParent();
959
960 unsigned NumScanned = 0;
961 auto HitSearchLimit = [&](unsigned N) {
962 NumScanned += N;
963 if (NumScanned <= MaxRegionInstrs)
964 return false;
965 LLVM_DEBUG(dbgs() << " hasCallOrLoopInRange scanned more than "
966 << MaxRegionInstrs << " instructions\n");
967 return true;
968 };
969 auto FoundCall = [](const MachineInstr &MI) {
970 LLVM_DEBUG(dbgs() << " found a call before the condition: " << MI);
971 return true;
972 };
973 auto IsCallOrHitSearchLimit = [&](const MachineInstr &MI) {
974 if (HitSearchLimit(1))
975 return true;
976 if (!MI.isCall())
977 return false;
978 return FoundCall(MI);
979 };
980
981 // If From and To are in the same block, just check (From, To).
982 if (FromBB == ToBB) {
983 for (const MachineInstr &MI : instructionsWithoutDebug(
984 std::next(From->getIterator()), To->getIterator(),
985 /*SkipPseudoOp=*/false))
986 if (IsCallOrHitSearchLimit(MI))
987 return true;
988 return false;
989 }
990
991 // Check (From, end of From's block] and [start of To's block, To).
992 for (const MachineInstr &MI : instructionsWithoutDebug(
993 std::next(From->getIterator()), FromBB->instr_end(),
994 /*SkipPseudoOp=*/false))
995 if (IsCallOrHitSearchLimit(MI))
996 return true;
997 for (const MachineInstr &MI :
999 /*SkipPseudoOp=*/false))
1000 if (IsCallOrHitSearchLimit(MI))
1001 return true;
1002
1003 // Enqueued guards the traversal: the endpoint blocks are traversed through
1004 // but their instructions were already handled above.
1005 SmallPtrSet<const MachineBasicBlock *, 16> Enqueued = {FromBB, ToBB};
1007 auto Enqueue = [&](const MachineBasicBlock *BB) {
1008 if (DomTree->dominates(FromBB, BB) && Enqueued.insert(BB).second)
1009 Worklist.push_back(BB);
1010 };
1011
1012 for (const MachineBasicBlock *Pred : ToBB->predecessors())
1013 Enqueue(Pred);
1014
1015 while (!Worklist.empty()) {
1016 const MachineBasicBlock *BB = Worklist.pop_back_val();
1017
1018 // If the block belongs to a loop containing neither the load nor the
1019 // condition, that loop is executed entirely between the two, so consider
1020 // them far apart.
1021 if (const MachineLoop *BBLoop = Loops->getLoopFor(BB)) {
1022 if (!BBLoop->contains(ToBB) && !BBLoop->contains(FromBB)) {
1023 LLVM_DEBUG(dbgs() << " found a loop before the condition in "
1024 << printMBBReference(*BB) << '\n');
1025 return true;
1026 }
1027 }
1028
1029 // Next check for calls in the block.
1030 auto CacheIt = NoCallBlocksCache.find(BB);
1031 if (CacheIt != NoCallBlocksCache.end()) {
1032 if (HitSearchLimit(CacheIt->second))
1033 return true;
1034 } else {
1035 unsigned NumBlockInstrs = 0;
1036 for (const MachineInstr &MI :
1038 /*SkipPseudoOp=*/false)) {
1039 ++NumBlockInstrs;
1040 if (IsCallOrHitSearchLimit(MI))
1041 return true;
1042 }
1043 NoCallBlocksCache[BB] = NumBlockInstrs;
1044 }
1045
1046 for (const MachineBasicBlock *Pred : BB->predecessors())
1047 Enqueue(Pred);
1048 }
1049
1050 return false;
1051}
1052
1053/// Check if a register's value comes from a memory load by walking the
1054/// def-use chain. We want to prioritize converting branches which
1055/// depend on values loaded from memory (unless they are loop invariant,
1056/// or come from a constant pool). The walk starts from the definition of
1057/// ConditionDef's first operand, which is not ConditionDef itself for
1058/// instructions such as FCMPSrr, where that operand is a use.
1059bool EarlyIfConverter::doOperandsComeFromMemory(
1060 const MachineInstr *ConditionDef) {
1061 Register Reg = ConditionDef->getOperand(0).getReg();
1062 if (!Reg.isVirtual())
1063 return false;
1064
1065 LLVM_DEBUG(dbgs() << " doOperandsComeFromMemory starting from reg "
1066 << printReg(Reg) << "\n");
1067
1068 // The condition is consumed by the branch terminating Head, so this is the
1069 // end of the interval a load has to survive without a call in between.
1070 const MachineInstr *Br = &*IfConv.Head->getFirstTerminator();
1071 MachineLoop *IfConvLoop = Loops->getLoopFor(IfConv.Head);
1072
1073 // Walk the def-use chain.
1074 SmallPtrSet<const MachineInstr *, 8> VisitedInstrs;
1075 SmallVector<const MachineInstr *> Worklist;
1076
1077 MachineInstr *DefMI = MRI->getVRegDef(Reg);
1078 // The operand is defined outside of the function - it does not
1079 // come from memory access.
1080 if (!DefMI)
1081 return false;
1082
1083 Worklist.push_back(DefMI);
1084
1085 while (!Worklist.empty() && VisitedInstrs.size() < MaxNumSteps) {
1086 const MachineInstr *MI = Worklist.pop_back_val();
1087 if (!VisitedInstrs.insert(MI).second)
1088 continue;
1089
1090 // Don't walk through PHIs: a value arriving on a back edge is loaded in a
1091 // previous iteration, so the interval between the load and the branch is
1092 // not the one hasCallOrLoopInRange measures.
1093 if (MI->isPHI())
1094 continue;
1095
1096 const MachineBasicBlock *Parent = MI->getParent();
1097 MachineLoop *ParentLoop = Loops->getLoopFor(Parent);
1098
1099 // If the instruction is outside the loop, skip it (loop-invariant).
1100 if (IfConvLoop && ParentLoop != IfConvLoop)
1101 continue;
1102
1103 // Check if this instruction is a load, and there are no calls or loops
1104 // between the load and the condition (which would break the "close in
1105 // time" assumption).
1106 if (MI->mayLoad() && !isConstantPoolLoad(MI) &&
1107 !MI->isDereferenceableInvariantLoad()) {
1108 // If the load doesn't dominate the branch (e.g., comes after it in
1109 // the same block via a loop back-edge), it can't affect this iteration.
1110 // If not - check if there is a call or a loop between the load
1111 // instruction and the branch.
1112 if (!DomTree->dominates(MI, Br) || hasCallOrLoopInRange(MI, Br))
1113 continue;
1114
1115 return true;
1116 }
1117
1118 // Walk through all register use operands and find their definitions.
1119 for (const MachineOperand &MO : MI->operands()) {
1120 if (!MO.isReg() || !MO.isUse())
1121 continue;
1122 Register UseReg = MO.getReg();
1123 if (!UseReg.isVirtual())
1124 continue;
1125
1126 if (MachineInstr *UseDef = MRI->getVRegDef(UseReg)) {
1127 if (!VisitedInstrs.count(UseDef)) {
1128 Worklist.push_back(UseDef);
1129 }
1130 }
1131 }
1132 }
1133
1134 return false;
1135}
1136
1137/// Check if the branch condition is data-dependent (comes from memory loads).
1138bool EarlyIfConverter::isConditionDataDependent() {
1139 TargetInstrInfo::MachineBranchPredicate MBP;
1140 if (TII->analyzeBranchPredicate(*IfConv.Head, MBP, /*AllowModify=*/false))
1141 return false;
1142
1143 if (!MBP.ConditionDef)
1144 return false;
1145
1146 // If the branch is biased (not 50/50), don't consider it data dependent.
1147 // This is to prevent converting unprofitable checks such as
1148 // `x[i] != 0;`
1149 auto TBBProb = MBPI->getEdgeProbability(IfConv.Head, IfConv.TBB);
1150 auto FBBProb = MBPI->getEdgeProbability(IfConv.Head, IfConv.FBB);
1151 if (TBBProb != FBBProb) {
1152 ++NumLikelyBiased;
1153 return false;
1154 }
1155
1156 // Check if operands used to compute the branch condition were loaded recently
1157 // from memory, starting by the ConditionDef itself and walking up the use-def
1158 // chain.
1159 if (doOperandsComeFromMemory(MBP.ConditionDef)) {
1160 ++NumDataDependant;
1161 return true;
1162 }
1163
1164 return false;
1165}
1166
1167// Adjust cycles with downward saturation.
1168static unsigned adjCycles(unsigned Cyc, int Delta) {
1169 if (Delta < 0 && Cyc + Delta > Cyc)
1170 return 0;
1171 return Cyc + Delta;
1172}
1173
1174namespace {
1175/// Helper class to simplify emission of cycle counts into optimization remarks.
1176struct Cycles {
1177 const char *Key;
1178 unsigned Value;
1179};
1180template <typename Remark> Remark &operator<<(Remark &R, Cycles C) {
1181 return R << ore::NV(C.Key, C.Value) << (C.Value == 1 ? " cycle" : " cycles");
1182}
1183} // anonymous namespace
1184
1185/// Apply cost model and heuristics to the if-conversion in IfConv.
1186/// Return true if the conversion is a good idea.
1187///
1188bool EarlyIfConverter::shouldConvertIf() {
1189 // Stress testing mode disables all cost considerations.
1190 if (Stress)
1191 return true;
1192
1193 // Do not try to if-convert if the condition has a high chance of being
1194 // predictable.
1195 MachineLoop *CurrentLoop = Loops->getLoopFor(IfConv.Head);
1196 // If the condition is in a loop, consider it predictable if the condition
1197 // itself or all its operands are loop-invariant. E.g. this considers a load
1198 // from a loop-invariant address predictable; we were unable to prove that it
1199 // doesn't alias any of the memory-writes in the loop, but it is likely to
1200 // read to same value multiple times.
1201 if (CurrentLoop && any_of(IfConv.Cond, [&](MachineOperand &MO) {
1202 if (!MO.isReg() || !MO.isUse())
1203 return false;
1204 Register Reg = MO.getReg();
1205 if (Reg.isPhysical())
1206 return false;
1207
1208 MachineInstr *Def = MRI->getVRegDef(Reg);
1209 return CurrentLoop->isLoopInvariant(*Def) ||
1210 all_of(Def->operands(), [&](MachineOperand &Op) {
1211 if (Op.isImm())
1212 return true;
1213 if (!Op.isReg() || !Op.isUse())
1214 return true;
1215 Register Reg = Op.getReg();
1216 if (Reg.isPhysical())
1217 return false;
1218
1219 MachineInstr *Def = MRI->getVRegDef(Reg);
1220 return CurrentLoop->isLoopInvariant(*Def);
1221 });
1222 }))
1223 return false;
1224
1225 if (!MinInstr)
1226 MinInstr = Traces->getEnsemble(MachineTraceStrategy::TS_MinInstrCount);
1227
1228 MachineTraceMetrics::Trace TBBTrace = MinInstr->getTrace(IfConv.getTPred());
1229 MachineTraceMetrics::Trace FBBTrace = MinInstr->getTrace(IfConv.getFPred());
1230 LLVM_DEBUG(dbgs() << "TBB: " << TBBTrace << "FBB: " << FBBTrace);
1231 unsigned MinCrit = std::min(TBBTrace.getCriticalPath(),
1232 FBBTrace.getCriticalPath());
1233
1234 // Set a somewhat arbitrary limit on the critical path extension we accept.
1235 // When hard-to-predict analysis is enabled, use full MispredictPenalty for
1236 // hard-to-predict branches, half for others. Otherwise use half for all.
1237 bool DataDependent = false;
1239 DataDependent = isConditionDataDependent();
1240
1241 unsigned CritLimit = DataDependent ? STI->getMispredictionPenalty()
1242 : STI->getMispredictionPenalty() / 2;
1243
1244 MachineBasicBlock &MBB = *IfConv.Head;
1245 MachineOptimizationRemarkEmitter MORE(*MBB.getParent(), nullptr);
1246
1247 // Emit analysis remark about data-dependent condition.
1248 if (DataDependent) {
1249 MORE.emit([&]() {
1250 return MachineOptimizationRemarkAnalysis(DEBUG_TYPE,
1251 "DataDependentCondition",
1252 MBB.back().getDebugLoc(), &MBB)
1253 << "branch condition is data-dependent (from memory load), "
1254 << "using higher CritLimit of " << ore::NV("CritLimit", CritLimit)
1255 << " cycles";
1256 });
1257 }
1258
1259 // If-conversion only makes sense when there is unexploited ILP. Compute the
1260 // maximum-ILP resource length of the trace after if-conversion. Compare it
1261 // to the shortest critical path.
1263 if (IfConv.TBB != IfConv.Tail)
1264 ExtraBlocks.push_back(IfConv.TBB);
1265 unsigned ResLength = FBBTrace.getResourceLength(ExtraBlocks);
1266 LLVM_DEBUG(dbgs() << "Resource length " << ResLength
1267 << ", minimal critical path " << MinCrit << '\n');
1268 if (ResLength > MinCrit + CritLimit) {
1269 LLVM_DEBUG(dbgs() << "Not enough available ILP.\n");
1270 MORE.emit([&]() {
1271 MachineOptimizationRemarkMissed R(DEBUG_TYPE, "IfConversion",
1272 MBB.findDebugLoc(MBB.back()), &MBB);
1273 R << "did not if-convert branch: the resulting critical path ("
1274 << Cycles{"ResLength", ResLength}
1275 << ") would extend the shorter leg's critical path ("
1276 << Cycles{"MinCrit", MinCrit} << ") by more than the threshold of "
1277 << Cycles{"CritLimit", CritLimit}
1278 << ", which cannot be hidden by available ILP.";
1279 return R;
1280 });
1281 return false;
1282 }
1283
1284 // Assume that the depth of the first head terminator will also be the depth
1285 // of the select instruction inserted, as determined by the flag dependency.
1286 // TBB / FBB data dependencies may delay the select even more.
1287 MachineTraceMetrics::Trace HeadTrace = MinInstr->getTrace(IfConv.Head);
1288 unsigned BranchDepth =
1289 HeadTrace.getInstrCycles(*IfConv.Head->getFirstTerminator()).Depth;
1290 LLVM_DEBUG(dbgs() << "Branch depth: " << BranchDepth << '\n');
1291
1292 // Look at all the tail phis, and compute the critical path extension caused
1293 // by inserting select instructions.
1294 MachineTraceMetrics::Trace TailTrace = MinInstr->getTrace(IfConv.Tail);
1295 struct CriticalPathInfo {
1296 unsigned Extra; // Count of extra cycles that the component adds.
1297 unsigned Depth; // Absolute depth of the component in cycles.
1298 };
1299 CriticalPathInfo Cond{};
1300 CriticalPathInfo TBlock{};
1301 CriticalPathInfo FBlock{};
1302 bool ShouldConvert = true;
1303 for (SSAIfConv::PHIInfo &PI : IfConv.PHIs) {
1304 unsigned Slack = TailTrace.getInstrSlack(*PI.PHI);
1305 unsigned MaxDepth = Slack + TailTrace.getInstrCycles(*PI.PHI).Depth;
1306 LLVM_DEBUG(dbgs() << "Slack " << Slack << ":\t" << *PI.PHI);
1307
1308 // The condition is pulled into the critical path.
1309 unsigned CondDepth = adjCycles(BranchDepth, PI.CondCycles);
1310 if (CondDepth > MaxDepth) {
1311 unsigned Extra = CondDepth - MaxDepth;
1312 LLVM_DEBUG(dbgs() << "Condition adds " << Extra << " cycles.\n");
1313 if (Extra > Cond.Extra)
1314 Cond = {Extra, CondDepth};
1315 if (Extra > CritLimit) {
1316 LLVM_DEBUG(dbgs() << "Exceeds limit of " << CritLimit << '\n');
1317 ShouldConvert = false;
1318 }
1319 }
1320
1321 // The TBB value is pulled into the critical path.
1322 unsigned TDepth = adjCycles(TBBTrace.getPHIDepth(*PI.PHI), PI.TCycles);
1323 if (TDepth > MaxDepth) {
1324 unsigned Extra = TDepth - MaxDepth;
1325 LLVM_DEBUG(dbgs() << "TBB data adds " << Extra << " cycles.\n");
1326 if (Extra > TBlock.Extra)
1327 TBlock = {Extra, TDepth};
1328 if (Extra > CritLimit) {
1329 LLVM_DEBUG(dbgs() << "Exceeds limit of " << CritLimit << '\n');
1330 ShouldConvert = false;
1331 }
1332 }
1333
1334 // The FBB value is pulled into the critical path.
1335 unsigned FDepth = adjCycles(FBBTrace.getPHIDepth(*PI.PHI), PI.FCycles);
1336 if (FDepth > MaxDepth) {
1337 unsigned Extra = FDepth - MaxDepth;
1338 LLVM_DEBUG(dbgs() << "FBB data adds " << Extra << " cycles.\n");
1339 if (Extra > FBlock.Extra)
1340 FBlock = {Extra, FDepth};
1341 if (Extra > CritLimit) {
1342 LLVM_DEBUG(dbgs() << "Exceeds limit of " << CritLimit << '\n');
1343 ShouldConvert = false;
1344 }
1345 }
1346 }
1347
1348 // Organize by "short" and "long" legs, since the diagnostics get confusing
1349 // when referring to the "true" and "false" sides of the branch, given that
1350 // those don't always correlate with what the user wrote in source-terms.
1351 const CriticalPathInfo Short = TBlock.Extra > FBlock.Extra ? FBlock : TBlock;
1352 const CriticalPathInfo Long = TBlock.Extra > FBlock.Extra ? TBlock : FBlock;
1353
1354 if (ShouldConvert) {
1355 MORE.emit([&]() {
1356 MachineOptimizationRemark R(DEBUG_TYPE, "IfConversion",
1357 MBB.back().getDebugLoc(), &MBB);
1358 R << "performing if-conversion on branch: the condition adds "
1359 << Cycles{"CondCycles", Cond.Extra} << " to the critical path";
1360 if (Short.Extra > 0)
1361 R << ", and the short leg adds another "
1362 << Cycles{"ShortCycles", Short.Extra};
1363 if (Long.Extra > 0)
1364 R << ", and the long leg adds another "
1365 << Cycles{"LongCycles", Long.Extra};
1366 R << ", each staying under the threshold of "
1367 << Cycles{"CritLimit", CritLimit} << ".";
1368 return R;
1369 });
1370 } else {
1371 MORE.emit([&]() {
1372 MachineOptimizationRemarkMissed R(DEBUG_TYPE, "IfConversion",
1373 MBB.back().getDebugLoc(), &MBB);
1374 R << "did not if-convert branch: the condition would add "
1375 << Cycles{"CondCycles", Cond.Extra} << " to the critical path";
1376 if (Cond.Extra > CritLimit)
1377 R << " exceeding the limit of " << Cycles{"CritLimit", CritLimit};
1378 if (Short.Extra > 0) {
1379 R << ", and the short leg would add another "
1380 << Cycles{"ShortCycles", Short.Extra};
1381 if (Short.Extra > CritLimit)
1382 R << " exceeding the limit of " << Cycles{"CritLimit", CritLimit};
1383 }
1384 if (Long.Extra > 0) {
1385 R << ", and the long leg would add another "
1386 << Cycles{"LongCycles", Long.Extra};
1387 if (Long.Extra > CritLimit)
1388 R << " exceeding the limit of " << Cycles{"CritLimit", CritLimit};
1389 }
1390 R << ".";
1391 return R;
1392 });
1393 }
1394
1395 return ShouldConvert;
1396}
1397
1398/// Attempt repeated if-conversion on MBB, return true if successful.
1399///
1400bool EarlyIfConverter::tryConvertIf(MachineBasicBlock *MBB) {
1401 bool Changed = false;
1402 while (IfConv.canConvertIf(MBB) && shouldConvertIf()) {
1403 // If-convert MBB and update analyses.
1404 invalidateTraces();
1405 SmallVector<MachineBasicBlock *, 4> RemoveBlocks;
1406 IfConv.convertIf(RemoveBlocks);
1407 Changed = true;
1408 updateDomTree(DomTree, IfConv, RemoveBlocks);
1409 updateLoops(Loops, RemoveBlocks);
1410 // Head absorbs the instructions of the removed blocks, including any calls,
1411 // so a Head cached as call-free may no longer be.
1412 NoCallBlocksCache.erase(IfConv.Head);
1413 for (MachineBasicBlock *MBB : RemoveBlocks) {
1414 NoCallBlocksCache.erase(MBB);
1416 }
1417 }
1418 return Changed;
1419}
1420
1421bool EarlyIfConverter::run(MachineFunction &MF) {
1422 LLVM_DEBUG(dbgs() << "********** EARLY IF-CONVERSION **********\n"
1423 << "********** Function: " << MF.getName() << '\n');
1424
1425 STI = &MF.getSubtarget();
1426 // Only run if conversion if the target wants it.
1427 if (!STI->enableEarlyIfConversion())
1428 return false;
1429
1430 TII = STI->getInstrInfo();
1431 TRI = STI->getRegisterInfo();
1432 MRI = &MF.getRegInfo();
1433 MinInstr = nullptr;
1434
1435 bool Changed = false;
1436 IfConv.init(MF);
1437
1438 // Visit blocks in dominator tree post-order. The post-order enables nested
1439 // if-conversion in a single pass. The tryConvertIf() function may erase
1440 // blocks, but only blocks dominated by the head block. This makes it safe to
1441 // update the dominator tree while the post-order iterator is still active.
1442 for (auto *DomNode : post_order(DomTree))
1443 if (tryConvertIf(DomNode->getBlock()))
1444 Changed = true;
1445
1446 return Changed;
1447}
1448
1449PreservedAnalyses
1455 MachineBranchProbabilityInfo *MBPI = nullptr;
1458
1459 EarlyIfConverter Impl(MDT, LI, MTM, MBPI);
1460 bool Changed = Impl.run(MF);
1461 if (!Changed)
1462 return PreservedAnalyses::all();
1463
1465 PA.preserve<MachineDominatorTreeAnalysis>();
1466 PA.preserve<MachineLoopAnalysis>();
1467 PA.preserve<MachineTraceMetricsAnalysis>();
1468 return PA;
1469}
1470
1471bool EarlyIfConverterLegacy::runOnMachineFunction(MachineFunction &MF) {
1472 if (skipFunction(MF.getFunction()))
1473 return false;
1474
1476 getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
1477 MachineLoopInfo &LI = getAnalysis<MachineLoopInfoWrapperPass>().getLI();
1478 MachineTraceMetrics &MTM =
1479 getAnalysis<MachineTraceMetricsWrapperPass>().getMTM();
1480 MachineBranchProbabilityInfo *MBPI = nullptr;
1482 MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
1483
1484 return EarlyIfConverter(MDT, LI, MTM, MBPI).run(MF);
1485}
1486
1487//===----------------------------------------------------------------------===//
1488// EarlyIfPredicator Pass
1489//===----------------------------------------------------------------------===//
1490
1491namespace {
1492class EarlyIfPredicator : public MachineFunctionPass {
1493 const TargetInstrInfo *TII = nullptr;
1494 const TargetRegisterInfo *TRI = nullptr;
1495 TargetSchedModel SchedModel;
1496 MachineRegisterInfo *MRI = nullptr;
1497 MachineDominatorTree *DomTree = nullptr;
1498 MachineBranchProbabilityInfo *MBPI = nullptr;
1499 MachineLoopInfo *Loops = nullptr;
1500 SSAIfConv IfConv;
1501
1502public:
1503 static char ID;
1504 EarlyIfPredicator() : MachineFunctionPass(ID) {}
1505 void getAnalysisUsage(AnalysisUsage &AU) const override;
1506 bool runOnMachineFunction(MachineFunction &MF) override;
1507 StringRef getPassName() const override { return "Early If-predicator"; }
1508
1509protected:
1510 bool tryConvertIf(MachineBasicBlock *);
1511 bool shouldConvertIf();
1512};
1513} // end anonymous namespace
1514
1515#undef DEBUG_TYPE
1516#define DEBUG_TYPE "early-if-predicator"
1517
1518char EarlyIfPredicator::ID = 0;
1519char &llvm::EarlyIfPredicatorID = EarlyIfPredicator::ID;
1520
1521INITIALIZE_PASS_BEGIN(EarlyIfPredicator, DEBUG_TYPE, "Early If Predicator",
1522 false, false)
1525INITIALIZE_PASS_END(EarlyIfPredicator, DEBUG_TYPE, "Early If Predicator", false,
1526 false)
1527
1528void EarlyIfPredicator::getAnalysisUsage(AnalysisUsage &AU) const {
1530 AU.addRequired<MachineDominatorTreeWrapperPass>();
1531 AU.addPreserved<MachineDominatorTreeWrapperPass>();
1532 AU.addRequired<MachineLoopInfoWrapperPass>();
1533 AU.addPreserved<MachineLoopInfoWrapperPass>();
1535}
1536
1537/// Apply the target heuristic to decide if the transformation is profitable.
1538bool EarlyIfPredicator::shouldConvertIf() {
1539 auto TrueProbability = MBPI->getEdgeProbability(IfConv.Head, IfConv.TBB);
1540 if (IfConv.isTriangle()) {
1541 MachineBasicBlock &IfBlock =
1542 (IfConv.TBB == IfConv.Tail) ? *IfConv.FBB : *IfConv.TBB;
1543
1544 unsigned ExtraPredCost = 0;
1545 unsigned Cycles = 0;
1546 for (MachineInstr &I : IfBlock) {
1547 unsigned NumCycles = SchedModel.computeInstrLatency(&I, false);
1548 if (NumCycles > 1)
1549 Cycles += NumCycles - 1;
1550 ExtraPredCost += TII->getPredicationCost(I);
1551 }
1552
1553 return TII->isProfitableToIfCvt(IfBlock, Cycles, ExtraPredCost,
1554 TrueProbability);
1555 }
1556 unsigned TExtra = 0;
1557 unsigned FExtra = 0;
1558 unsigned TCycle = 0;
1559 unsigned FCycle = 0;
1560 for (MachineInstr &I : *IfConv.TBB) {
1561 unsigned NumCycles = SchedModel.computeInstrLatency(&I, false);
1562 if (NumCycles > 1)
1563 TCycle += NumCycles - 1;
1564 TExtra += TII->getPredicationCost(I);
1565 }
1566 for (MachineInstr &I : *IfConv.FBB) {
1567 unsigned NumCycles = SchedModel.computeInstrLatency(&I, false);
1568 if (NumCycles > 1)
1569 FCycle += NumCycles - 1;
1570 FExtra += TII->getPredicationCost(I);
1571 }
1572 return TII->isProfitableToIfCvt(*IfConv.TBB, TCycle, TExtra, *IfConv.FBB,
1573 FCycle, FExtra, TrueProbability);
1574}
1575
1576/// Attempt repeated if-conversion on MBB, return true if successful.
1577///
1578bool EarlyIfPredicator::tryConvertIf(MachineBasicBlock *MBB) {
1579 bool Changed = false;
1580 while (IfConv.canConvertIf(MBB, /*Predicate*/ true) && shouldConvertIf()) {
1581 // If-convert MBB and update analyses.
1582 SmallVector<MachineBasicBlock *, 4> RemoveBlocks;
1583 IfConv.convertIf(RemoveBlocks, /*Predicate*/ true);
1584 Changed = true;
1585 updateDomTree(DomTree, IfConv, RemoveBlocks);
1586 updateLoops(Loops, RemoveBlocks);
1587 for (MachineBasicBlock *MBB : RemoveBlocks)
1589 }
1590 return Changed;
1591}
1592
1593bool EarlyIfPredicator::runOnMachineFunction(MachineFunction &MF) {
1594 LLVM_DEBUG(dbgs() << "********** EARLY IF-PREDICATOR **********\n"
1595 << "********** Function: " << MF.getName() << '\n');
1596 if (skipFunction(MF.getFunction()))
1597 return false;
1598
1599 const TargetSubtargetInfo &STI = MF.getSubtarget();
1600 TII = STI.getInstrInfo();
1601 TRI = STI.getRegisterInfo();
1602 MRI = &MF.getRegInfo();
1603 SchedModel.init(&STI);
1604 DomTree = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
1605 Loops = &getAnalysis<MachineLoopInfoWrapperPass>().getLI();
1606 MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
1607
1608 bool Changed = false;
1609 IfConv.init(MF);
1610
1611 // Visit blocks in dominator tree post-order. The post-order enables nested
1612 // if-conversion in a single pass. The tryConvertIf() function may erase
1613 // blocks, but only blocks dominated by the head block. This makes it safe to
1614 // update the dominator tree while the post-order iterator is still active.
1615 for (auto *DomNode : post_order(DomTree))
1616 if (tryConvertIf(DomNode->getBlock()))
1617 Changed = true;
1618
1619 return Changed;
1620}
MachineInstrBuilder MachineInstrBuilder & DefMI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
MachineBasicBlock & MBB
This file implements the BitVector class.
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static unsigned InstrCount
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
static cl::opt< unsigned > MaxRegionInstrs("early-ifcvt-max-region-instrs", cl::Hidden, cl::init(64), cl::desc("Limit the number of blocks and instructions examined when " "searching for calls between a load and the condition it feeds"))
static cl::opt< unsigned > MaxNumSteps("early-ifcvt-max-steps", cl::Hidden, cl::init(16), cl::desc("Limit the number of steps taken when searching for a " "recently loaded value"))
static bool hasSameValue(const MachineRegisterInfo &MRI, const TargetInstrInfo *TII, Register TReg, Register FReg)
static unsigned adjCycles(unsigned Cyc, int Delta)
static cl::opt< bool > Stress("stress-early-ifcvt", cl::Hidden, cl::desc("Turn all knobs to 11"))
static cl::opt< unsigned > BlockInstrLimit("early-ifcvt-limit", cl::init(30), cl::Hidden, cl::desc("Maximum number of instructions per speculated block."))
static bool isConstantPoolLoad(const MachineInstr *MI)
static cl::opt< bool > EnableDataDependentBranchAnalysis("enable-early-ifcvt-data-dependent", cl::Hidden, cl::init(false), cl::desc("Enable hard-to-predict branch analysis for if-conversion"))
#define DEBUG_TYPE
static Register UseReg(const MachineOperand &MO)
const HexagonInstrInfo * TII
Hexagon Hardware Loops
IRTranslator LLVM IR MI
#define I(x, y, z)
Definition MD5.cpp:57
===- MachineOptimizationRemarkEmitter.h - Opt Diagnostics -*- C++ -*-—===//
Register Reg
Register const TargetRegisterInfo * TRI
Promote Memory to Register
Definition Mem2Reg.cpp:110
#define INITIALIZE_PASS_DEPENDENCY(depName)
Definition PassSupport.h:42
#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis)
Definition PassSupport.h:44
#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis)
Definition PassSupport.h:39
This file builds on the ADT/GraphTraits.h file to build a generic graph post order iterator.
const SmallVectorImpl< MachineOperand > MachineBasicBlock * TBB
const SmallVectorImpl< MachineOperand > & Cond
This file defines the SmallPtrSet class.
This file defines the SparseSet class derived from the version described in Briggs,...
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
Represent the analysis usage information of a pass.
bool test(unsigned Idx) const
Returns true if bit Idx is set.
Definition BitVector.h:482
BitVector & reset()
Reset all bits in the bitvector.
Definition BitVector.h:409
BitVector & set()
Set all bits in the bitvector.
Definition BitVector.h:366
void changeImmediateDominator(DomTreeNodeBase< NodeT > *N, DomTreeNodeBase< NodeT > *NewIDom)
changeImmediateDominator - This method is used to update the dominator tree information when a node's...
void eraseNode(NodeT *BB)
eraseNode - Removes a node from the dominator tree.
DomTreeNodeBase< NodeT > * getNode(const NodeT *BB) const
getNode - return the (Post)DominatorTree node for the specified basic block.
LLVM_ABI PreservedAnalyses run(MachineFunction &MF, MachineFunctionAnalysisManager &MFAM)
unsigned removeBranch(MachineBasicBlock &MBB, int *BytesRemoved=nullptr) const override
Remove the branching code at the end of the specific MBB.
bool isPredicated(const MachineInstr &MI) const override
Returns true if the instruction is already predicated.
bool analyzeBranch(MachineBasicBlock &MBB, MachineBasicBlock *&TBB, MachineBasicBlock *&FBB, SmallVectorImpl< MachineOperand > &Cond, bool AllowModify) const override
Analyze the branching code at the end of MBB, returning true if it cannot be understood (e....
bool reverseBranchCondition(SmallVectorImpl< MachineOperand > &Cond) const override
Reverses the branch condition of the specified condition list, returning false on success and true if...
unsigned insertBranch(MachineBasicBlock &MBB, MachineBasicBlock *TBB, MachineBasicBlock *FBB, ArrayRef< MachineOperand > Cond, const DebugLoc &DL, int *BytesAdded=nullptr) const override
Insert branch code into the end of the specified MachineBasicBlock.
bool isProfitableToIfCvt(MachineBasicBlock &MBB, unsigned NumCycles, unsigned ExtraPredCycles, BranchProbability Probability) const override
Return true if it's profitable to predicate instructions with accumulated instruction latency of "Num...
bool PredicateInstruction(MachineInstr &MI, ArrayRef< MachineOperand > Cond) const override
Convert the instruction into a predicated instruction.
bool isPredicable(const MachineInstr &MI) const override
Return true if the specified instruction can be predicated.
LLVM_ABI void transferSuccessorsAndUpdatePHIs(MachineBasicBlock *FromMBB)
Transfers all the successors, as in transferSuccessors, and update PHI operands in the successor bloc...
LLVM_ABI iterator getFirstTerminator()
Returns an iterator to the first terminator instruction of this basic block.
LLVM_ABI void addSuccessor(MachineBasicBlock *Succ, BranchProbability Prob=BranchProbability::getUnknown())
Add Succ as a successor of this MachineBasicBlock.
LLVM_ABI void removeSuccessor(MachineBasicBlock *Succ, bool NormalizeSuccProbs=false)
Remove successor from the successors list of this MachineBasicBlock.
LLVM_ABI DebugLoc findDebugLoc(instr_iterator MBBI)
Find the next valid DebugLoc starting at MBBI, skipping any debug instructions.
LLVM_ABI bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
LLVM_ABI void eraseFromParent()
This method unlinks 'this' from the containing function and deletes it.
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
iterator_range< pred_iterator > predecessors()
void splice(iterator Where, MachineBasicBlock *Other, iterator From)
Take an instruction from MBB 'Other' at the position From, and insert it into this MBB right before '...
MachineInstrBundleIterator< MachineInstr > iterator
LLVM_ABI void moveAfter(MachineBasicBlock *NewBefore)
LLVM_ABI BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
Analysis pass which computes a MachineDominatorTree.
Analysis pass which computes a MachineDominatorTree.
DominatorTree Class - Concrete subclass of DominatorTreeBase that is used to compute a normal dominat...
bool dominates(const MachineInstr *A, const MachineInstr *B) const
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineRegisterInfo & getRegInfo()
getRegInfo - Return information about the registers currently in use.
Function & getFunction()
Return the LLVM function that this machine code represents.
const MachineBasicBlock & back() const
const MachineInstrBuilder & addReg(Register RegNo, RegState Flags={}, unsigned SubReg=0) const
Add a new virtual register operand.
Representation of each machine instruction.
bool isTerminator(QueryType Type=AnyInBundle) const
Returns true if this instruction part of the terminator for a basic block.
bool mayLoadOrStore(QueryType Type=AnyInBundle) const
Return true if this instruction could possibly read or modify memory.
const MachineBasicBlock * getParent() const
LLVM_ABI bool isDereferenceableInvariantLoad() const
Return true if this load instruction never traps and points to a memory location whose value doesn't ...
LLVM_ABI bool hasUnmodeledSideEffects() const
Return true if this instruction has side effects that are not modeled by mayLoad / mayStore,...
mop_range uses()
Returns all operands which may be register uses.
const DebugLoc & getDebugLoc() const
Returns the debug location id of this MachineInstr.
const MachineOperand & getOperand(unsigned i) const
LLVM_ABI int findRegisterDefOperandIdx(Register Reg, const TargetRegisterInfo *TRI, bool isDead=false, bool Overlap=false) const
Returns the operand index that is a def of the specified register or -1 if it is not found.
Analysis pass that exposes the MachineLoopInfo for a machine function.
A description of a memory reference used in the backend.
MachineOperand class - Representation of each machine instruction operand.
Register getReg() const
getReg - Returns the register number.
MachineRegisterInfo - Keep track of information for virtual and physical registers,...
const TargetRegisterClass * getRegClass(Register Reg) const
Return the register class of the specified virtual register.
LLVM_ABI LLVM_READONLY MachineInstr * getVRegDef(Register Reg) const
getVRegDef - Return the machine instr that defines the specified virtual register or null if none is ...
LLVM_ABI Register createVirtualRegister(const TargetRegisterClass *RegClass, StringRef Name="")
createVirtualRegister - Create and return a new virtual register in the function with the specified r...
LLVM_ABI LLVM_READONLY MachineInstr * getUniqueVRegDef(Register Reg) const
getUniqueVRegDef - Return the unique machine instr that defines the specified virtual register or nul...
LLVM_ABI unsigned getResourceLength(ArrayRef< const MachineBasicBlock * > Extrablocks={}, ArrayRef< const MCSchedClassDesc * > ExtraInstrs={}, ArrayRef< const MCSchedClassDesc * > RemoveInstrs={}) const
Return the resource length of the trace.
InstrCycles getInstrCycles(const MachineInstr &MI) const
Return the depth and height of MI.
LLVM_ABI unsigned getInstrSlack(const MachineInstr &MI) const
Return the slack of MI.
unsigned getCriticalPath() const
Return the length of the (data dependency) critical path through the trace.
LLVM_ABI unsigned getPHIDepth(const MachineInstr &PHI) const
Return the Depth of a PHI instruction in a trace center block successor.
LLVM_ABI void verifyAnalysis() const
LLVM_ABI void invalidate(const MachineBasicBlock *MBB)
Invalidate cached information about MBB.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
Definition Analysis.h:118
Wrapper class representing virtual and physical registers.
Definition Register.h:20
MCRegister asMCReg() const
Utility to check-convert this value to a MCRegister.
Definition Register.h:107
constexpr bool isVirtual() const
Return true if the specified register number is in the virtual register namespace.
Definition Register.h:79
constexpr bool isPhysical() const
Return true if the specified register number is in the physical register namespace.
Definition Register.h:83
size_type size() const
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
void push_back(const T &Elt)
iterator erase(iterator I)
erase - Erases an existing element identified by a valid iterator.
Definition SparseSet.h:287
void clear()
clear - Clears the set.
Definition SparseSet.h:190
std::pair< iterator, bool > insert(const ValueT &Val)
insert - Attempts to insert a new element.
Definition SparseSet.h:253
bool empty() const
empty - Returns true if the set is empty.
Definition SparseSet.h:179
TargetInstrInfo - Interface to description of machine instruction set.
TargetRegisterInfo base class - We assume that the target defines a static array of TargetRegisterDes...
Provide an instruction scheduling machine model to CodeGen passes.
LLVM_ABI void init(const TargetSubtargetInfo *TSInfo, bool EnableSModel=true, bool EnableSItins=true)
Initialize the machine model for instruction scheduling.
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetRegisterInfo * getRegisterInfo() const =0
Return the target's register information.
virtual bool enableEarlyIfConversion() const
Enable the use of the early if conversion pass.
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
bool contains(const_arg_type_t< ValueT > V) const
Check if the set contains the given element.
Definition DenseSet.h:182
self_iterator getIterator()
Definition ilist_node.h:123
Changed
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
Definition CallingConv.h:76
initializer< Ty > init(const Ty &Val)
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
constexpr double phi
DiagnosticInfoOptimizationBase::Argument NV
NodeAddr< NodeBase * > Node
Definition RDFGraph.h:381
This is an optimization pass for GlobalISel generic memory operations.
MachineInstrBuilder BuildMI(MachineFunction &MF, const MIMetadata &MIMD, const MCInstrDesc &MCID)
Builder interface. Specify how to create the initial instruction itself.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI Printable printRegUnit(MCRegUnit Unit, const TargetRegisterInfo *TRI)
Create Printable object to print register units on a raw_ostream.
AnalysisManager< MachineFunction > MachineFunctionAnalysisManager
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
LLVM_ABI char & EarlyIfConverterLegacyID
EarlyIfConverter - This pass performs if-conversion on SSA form by inserting cmov instructions.
LLVM_ABI PreservedAnalyses getMachineFunctionPassPreservedAnalyses()
Returns the minimum set of Analyses that all machine function passes must preserve.
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1762
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
auto post_order(const T &G)
Post-order traversal of a graph.
auto instructionsWithoutDebug(IterT It, IterT End, bool SkipPseudoOp=true)
Construct a range iterator which begins at It and moves forwards until End is reached,...
LLVM_ABI char & EarlyIfPredicatorID
EarlyIfPredicator - This pass performs if-conversion on SSA form by predicating if/else block and ins...
DomTreeNodeBase< MachineBasicBlock > MachineDomTreeNode
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
ArrayRef(const T &OneElt) -> ArrayRef< T >
LLVM_ABI Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
LLVM_ABI Printable printMBBReference(const MachineBasicBlock &MBB)
Prints a machine basic block reference.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
Definition BitVector.h:880
#define N
#define MORE()
Definition regcomp.c:247
unsigned Depth
Earliest issue cycle as determined by data dependencies and instruction latencies from the beginning ...