@@ -122,18 +122,6 @@ class SSAIfConv {
122122 // / The branch condition determined by analyzeBranch.
123123 SmallVector<MachineOperand, 4 > Cond;
124124
125- class PredicationStrategyBase {
126- public:
127- virtual bool canConvertIf (MachineBasicBlock *Tail) { return true ; }
128- virtual bool canPredicateInstr (const MachineInstr &I) = 0;
129- virtual void predicateBlock (MachineBasicBlock *MBB,
130- ArrayRef<MachineOperand> Cond,
131- bool Reverse) = 0;
132- virtual ~PredicationStrategyBase () = default ;
133- };
134-
135- PredicationStrategyBase &Predicate;
136-
137125private:
138126 // / Instructions in Head that define values used by the conditional blocks.
139127 // / The hoisted instructions must be inserted after these instructions.
@@ -149,6 +137,10 @@ class SSAIfConv {
149137 // / and FBB.
150138 MachineBasicBlock::iterator InsertionPoint;
151139
140+ // / Return true if all non-terminator instructions in MBB can be safely
141+ // / speculated.
142+ bool canSpeculateInstrs (MachineBasicBlock *MBB);
143+
152144 // / Return true if all non-terminator instructions in MBB can be safely
153145 // / predicated.
154146 bool canPredicateInstrs (MachineBasicBlock *MBB);
@@ -157,6 +149,10 @@ class SSAIfConv {
157149 // / Return false if any dependency is incompatible with if conversion.
158150 bool InstrDependenciesAllowIfConv (MachineInstr *I);
159151
152+ // / Predicate all instructions of the basic block with current condition
153+ // / except for terminators. Reverse the condition if ReversePredicate is set.
154+ void PredicateBlock (MachineBasicBlock *MBB, bool ReversePredicate);
155+
160156 // / Find a valid insertion point in Head.
161157 bool findInsertionPoint ();
162158
@@ -167,8 +163,7 @@ class SSAIfConv {
167163 void rewritePHIOperands ();
168164
169165public:
170- SSAIfConv (PredicationStrategyBase &Predicate, MachineFunction &MF)
171- : Predicate(Predicate) {
166+ SSAIfConv (MachineFunction &MF) {
172167 TII = MF.getSubtarget ().getInstrInfo ();
173168 TRI = MF.getSubtarget ().getRegisterInfo ();
174169 MRI = &MF.getRegInfo ();
@@ -180,14 +175,76 @@ class SSAIfConv {
180175
181176 // / canConvertIf - If the sub-CFG headed by MBB can be if-converted,
182177 // / initialize the internal state, and return true.
183- bool canConvertIf (MachineBasicBlock *MBB);
178+ // / If predicate is set try to predicate the block otherwise try to
179+ // / speculatively execute it.
180+ bool canConvertIf (MachineBasicBlock *MBB, bool Predicate = false );
184181
185182 // / convertIf - If-convert the last block passed to canConvertIf(), assuming
186183 // / it is possible. Add any blocks that are to be erased to RemoveBlocks.
187- void convertIf (SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks);
184+ void convertIf (SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks,
185+ bool Predicate = false );
188186};
189187} // end anonymous namespace
190188
189+ // / canSpeculateInstrs - Returns true if all the instructions in MBB can safely
190+ // / be speculated. The terminators are not considered.
191+ // /
192+ // / If instructions use any values that are defined in the head basic block,
193+ // / the defining instructions are added to InsertAfter.
194+ // /
195+ // / Any clobbered regunits are added to ClobberedRegUnits.
196+ // /
197+ bool SSAIfConv::canSpeculateInstrs (MachineBasicBlock *MBB) {
198+ // Reject any live-in physregs. It's probably CPSR/EFLAGS, and very hard to
199+ // get right.
200+ if (!MBB->livein_empty ()) {
201+ LLVM_DEBUG (dbgs () << printMBBReference (*MBB) << " has live-ins.\n " );
202+ return false ;
203+ }
204+
205+ unsigned InstrCount = 0 ;
206+
207+ // Check all instructions, except the terminators. It is assumed that
208+ // terminators never have side effects or define any used register values.
209+ for (MachineInstr &MI :
210+ llvm::make_range (MBB->begin (), MBB->getFirstTerminator ())) {
211+ if (MI.isDebugInstr ())
212+ continue ;
213+
214+ if (++InstrCount > BlockInstrLimit && !Stress) {
215+ LLVM_DEBUG (dbgs () << printMBBReference (*MBB) << " has more than "
216+ << BlockInstrLimit << " instructions.\n " );
217+ return false ;
218+ }
219+
220+ // There shouldn't normally be any phis in a single-predecessor block.
221+ if (MI.isPHI ()) {
222+ LLVM_DEBUG (dbgs () << " Can't hoist: " << MI);
223+ return false ;
224+ }
225+
226+ // Don't speculate loads. Note that it may be possible and desirable to
227+ // speculate GOT or constant pool loads that are guaranteed not to trap,
228+ // but we don't support that for now.
229+ if (MI.mayLoad ()) {
230+ LLVM_DEBUG (dbgs () << " Won't speculate load: " << MI);
231+ return false ;
232+ }
233+
234+ // We never speculate stores, so an AA pointer isn't necessary.
235+ bool DontMoveAcrossStore = true ;
236+ if (!MI.isSafeToMove (DontMoveAcrossStore)) {
237+ LLVM_DEBUG (dbgs () << " Can't speculate: " << MI);
238+ return false ;
239+ }
240+
241+ // Check for any dependencies on Head instructions.
242+ if (!InstrDependenciesAllowIfConv (&MI))
243+ return false ;
244+ }
245+ return true ;
246+ }
247+
191248// / Check that there is no dependencies preventing if conversion.
192249// /
193250// / If instruction uses any values that are defined in the head basic block,
@@ -261,8 +318,17 @@ bool SSAIfConv::canPredicateInstrs(MachineBasicBlock *MBB) {
261318 return false ;
262319 }
263320
264- if (!Predicate.canPredicateInstr (*I))
321+ // Check that instruction is predicable
322+ if (!TII->isPredicable (*I)) {
323+ LLVM_DEBUG (dbgs () << " Isn't predicable: " << *I);
324+ return false ;
325+ }
326+
327+ // Check that instruction is not already predicated.
328+ if (TII->isPredicated (*I) && !TII->canPredicatePredicatedInstr (*I)) {
329+ LLVM_DEBUG (dbgs () << " Is already predicated: " << *I);
265330 return false ;
331+ }
266332
267333 // Check for any dependencies on Head instructions.
268334 if (!InstrDependenciesAllowIfConv (&(*I)))
@@ -271,6 +337,24 @@ bool SSAIfConv::canPredicateInstrs(MachineBasicBlock *MBB) {
271337 return true ;
272338}
273339
340+ // Apply predicate to all instructions in the machine block.
341+ void SSAIfConv::PredicateBlock (MachineBasicBlock *MBB, bool ReversePredicate) {
342+ auto Condition = Cond;
343+ if (ReversePredicate) {
344+ bool CanRevCond = !TII->reverseBranchCondition (Condition);
345+ assert (CanRevCond && " Reversed predicate is not supported" );
346+ (void )CanRevCond;
347+ }
348+ // Terminators don't need to be predicated as they will be removed.
349+ for (MachineBasicBlock::iterator I = MBB->begin (),
350+ E = MBB->getFirstTerminator ();
351+ I != E; ++I) {
352+ if (I->isDebugInstr ())
353+ continue ;
354+ TII->PredicateInstruction (*I, Condition);
355+ }
356+ }
357+
274358// / Find an insertion point in Head for the speculated instructions. The
275359// / insertion point must be:
276360// /
@@ -349,7 +433,7 @@ bool SSAIfConv::findInsertionPoint() {
349433// / canConvertIf - analyze the sub-cfg rooted in MBB, and return true if it is
350434// / a potential candidate for if-conversion. Fill out the internal state.
351435// /
352- bool SSAIfConv::canConvertIf (MachineBasicBlock *MBB) {
436+ bool SSAIfConv::canConvertIf (MachineBasicBlock *MBB, bool Predicate ) {
353437 Head = MBB;
354438 TBB = FBB = Tail = nullptr ;
355439
@@ -389,17 +473,21 @@ bool SSAIfConv::canConvertIf(MachineBasicBlock *MBB) {
389473 << printMBBReference (*Tail) << ' \n ' );
390474 }
391475
476+ // This is a triangle or a diamond.
477+ // Skip if we cannot predicate and there are no phis skip as there must be
478+ // side effects that can only be handled with predication.
479+ if (!Predicate && (Tail->empty () || !Tail->front ().isPHI ())) {
480+ LLVM_DEBUG (dbgs () << " No phis in tail.\n " );
481+ return false ;
482+ }
483+
392484 // The branch we're looking to eliminate must be analyzable.
393485 Cond.clear ();
394486 if (TII->analyzeBranch (*Head, TBB, FBB, Cond)) {
395487 LLVM_DEBUG (dbgs () << " Branch not analyzable.\n " );
396488 return false ;
397489 }
398490
399- if (!Predicate.canConvertIf (Tail)) {
400- return false ;
401- }
402-
403491 // This is weird, probably some sort of degenerate CFG.
404492 if (!TBB) {
405493 LLVM_DEBUG (dbgs () << " analyzeBranch didn't find conditional branch.\n " );
@@ -447,9 +535,17 @@ bool SSAIfConv::canConvertIf(MachineBasicBlock *MBB) {
447535 // Check that the conditional instructions can be speculated.
448536 InsertAfter.clear ();
449537 ClobberedRegUnits.reset ();
450- for (MachineBasicBlock *MBB : {TBB, FBB})
451- if (MBB != Tail && !canPredicateInstrs (MBB ))
538+ if (Predicate) {
539+ if (TBB != Tail && !canPredicateInstrs (TBB ))
452540 return false ;
541+ if (FBB != Tail && !canPredicateInstrs (FBB))
542+ return false ;
543+ } else {
544+ if (TBB != Tail && !canSpeculateInstrs (TBB))
545+ return false ;
546+ if (FBB != Tail && !canSpeculateInstrs (FBB))
547+ return false ;
548+ }
453549
454550 // Try to find a valid insertion point for the speculated instructions in the
455551 // head basic block.
@@ -582,7 +678,8 @@ void SSAIfConv::rewritePHIOperands() {
582678// /
583679// / Any basic blocks that need to be erased will be added to RemoveBlocks.
584680// /
585- void SSAIfConv::convertIf (SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks) {
681+ void SSAIfConv::convertIf (SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks,
682+ bool Predicate) {
586683 assert (Head && Tail && TBB && FBB && " Call canConvertIf first." );
587684
588685 // Update statistics.
@@ -592,15 +689,16 @@ void SSAIfConv::convertIf(SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks) {
592689 ++NumDiamondsConv;
593690
594691 // Move all instructions into Head, except for the terminators.
595- for (MachineBasicBlock *MBB : {TBB, FBB}) {
596- if (MBB != Tail) {
597- // reverse the condition for the false bb
598- Predicate.predicateBlock (MBB, Cond, MBB == FBB);
599- Head->splice (InsertionPoint, MBB, MBB->begin (),
600- MBB->getFirstTerminator ());
601- }
692+ if (TBB != Tail) {
693+ if (Predicate)
694+ PredicateBlock (TBB, /* ReversePredicate=*/ false );
695+ Head->splice (InsertionPoint, TBB, TBB->begin (), TBB->getFirstTerminator ());
696+ }
697+ if (FBB != Tail) {
698+ if (Predicate)
699+ PredicateBlock (FBB, /* ReversePredicate=*/ true );
700+ Head->splice (InsertionPoint, FBB, FBB->begin (), FBB->getFirstTerminator ());
602701 }
603-
604702 // Are there extra Tail predecessors?
605703 bool ExtraPreds = Tail->pred_size () != 2 ;
606704 if (ExtraPreds)
@@ -764,46 +862,6 @@ template <typename Remark> Remark &operator<<(Remark &R, Cycles C) {
764862}
765863} // anonymous namespace
766864
767- class SpeculateStrategy : public SSAIfConv ::PredicationStrategyBase {
768- public:
769- bool canConvertIf (MachineBasicBlock *Tail) override {
770- // This is a triangle or a diamond.
771- // Skip if we cannot predicate and there are no phis skip as there must
772- // be side effects that can only be handled with predication.
773- if (Tail->empty () || !Tail->front ().isPHI ()) {
774- LLVM_DEBUG (dbgs () << " No phis in tail.\n " );
775- return false ;
776- }
777- return true ;
778- }
779-
780- bool canPredicateInstr (const MachineInstr &I) override {
781- // Don't speculate loads. Note that it may be possible and desirable to
782- // speculate GOT or constant pool loads that are guaranteed not to trap,
783- // but we don't support that for now.
784- if (I.mayLoad ()) {
785- LLVM_DEBUG (dbgs () << " Won't speculate load: " << I);
786- return false ;
787- }
788-
789- // We never speculate stores, so an AA pointer isn't necessary.
790- bool DontMoveAcrossStore = true ;
791- if (!I.isSafeToMove (DontMoveAcrossStore)) {
792- LLVM_DEBUG (dbgs () << " Can't speculate: " << I);
793- return false ;
794- }
795- return true ;
796- }
797-
798- void predicateBlock (MachineBasicBlock *MBB, ArrayRef<MachineOperand> Cond,
799- bool Reverse)
800- override { /* do nothing, everything is speculatable and it's valid to
801- move the instructions into the head */
802- }
803-
804- ~SpeculateStrategy () override = default ;
805- };
806-
807865// / Apply cost model and heuristics to the if-conversion in IfConv.
808866// / Return true if the conversion is a good idea.
809867// /
@@ -1037,8 +1095,7 @@ bool EarlyIfConverter::runOnMachineFunction(MachineFunction &MF) {
10371095 MinInstr = nullptr ;
10381096
10391097 bool Changed = false ;
1040- SpeculateStrategy Speculate;
1041- SSAIfConv IfConv (Speculate, MF);
1098+ SSAIfConv IfConv (MF);
10421099
10431100 // Visit blocks in dominator tree post-order. The post-order enables nested
10441101 // if-conversion in a single pass. The tryConvertIf() function may erase
@@ -1100,48 +1157,6 @@ void EarlyIfPredicator::getAnalysisUsage(AnalysisUsage &AU) const {
11001157 MachineFunctionPass::getAnalysisUsage (AU);
11011158}
11021159
1103- class PredicatorStrategy : public SSAIfConv ::PredicationStrategyBase {
1104- const TargetInstrInfo *TII = nullptr ;
1105-
1106- public:
1107- PredicatorStrategy (const TargetInstrInfo *TII) : TII(TII) {}
1108-
1109- bool canPredicateInstr (const MachineInstr &I) override {
1110- // Check that instruction is predicable
1111- if (!TII->isPredicable (I)) {
1112- LLVM_DEBUG (dbgs () << " Isn't predicable: " << I);
1113- return false ;
1114- }
1115-
1116- // Check that instruction is not already predicated.
1117- if (TII->isPredicated (I) && !TII->canPredicatePredicatedInstr (I)) {
1118- LLVM_DEBUG (dbgs () << " Is already predicated: " << I);
1119- return false ;
1120- }
1121- return true ;
1122- }
1123-
1124- void predicateBlock (MachineBasicBlock *MBB, ArrayRef<MachineOperand> Cond,
1125- bool Reverse) override {
1126- SmallVector<MachineOperand> Condition (Cond);
1127- if (Reverse) {
1128- bool CanRevCond = !TII->reverseBranchCondition (Condition);
1129- assert (CanRevCond && " Reversed predicate is not supported" );
1130- (void )CanRevCond;
1131- }
1132- // Terminators don't need to be predicated as they will be removed.
1133- for (MachineBasicBlock::iterator I = MBB->begin (),
1134- E = MBB->getFirstTerminator ();
1135- I != E; ++I) {
1136- if (I->isDebugInstr ())
1137- continue ;
1138- TII->PredicateInstruction (*I, Condition);
1139- }
1140- }
1141-
1142- ~PredicatorStrategy () override = default ;
1143- };
1144-
11451160// / Apply the target heuristic to decide if the transformation is profitable.
11461161bool EarlyIfPredicator::shouldConvertIf (SSAIfConv &IfConv) {
11471162 auto TrueProbability = MBPI->getEdgeProbability (IfConv.Head , IfConv.TBB );
@@ -1186,10 +1201,11 @@ bool EarlyIfPredicator::shouldConvertIf(SSAIfConv &IfConv) {
11861201bool EarlyIfPredicator::tryConvertIf (SSAIfConv &IfConv,
11871202 MachineBasicBlock *MBB) {
11881203 bool Changed = false ;
1189- while (IfConv.canConvertIf (MBB) && shouldConvertIf (IfConv)) {
1204+ while (IfConv.canConvertIf (MBB, /* Predicate=*/ true ) &&
1205+ shouldConvertIf (IfConv)) {
11901206 // If-convert MBB and update analyses.
11911207 SmallVector<MachineBasicBlock *, 4 > RemoveBlocks;
1192- IfConv.convertIf (RemoveBlocks);
1208+ IfConv.convertIf (RemoveBlocks, /* Predicate= */ true );
11931209 Changed = true ;
11941210 updateDomTree (DomTree, IfConv, RemoveBlocks);
11951211 for (MachineBasicBlock *MBB : RemoveBlocks)
@@ -1215,8 +1231,7 @@ bool EarlyIfPredicator::runOnMachineFunction(MachineFunction &MF) {
12151231 MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI ();
12161232
12171233 bool Changed = false ;
1218- PredicatorStrategy Predicate (TII);
1219- SSAIfConv IfConv (Predicate, MF);
1234+ SSAIfConv IfConv (MF);
12201235
12211236 // Visit blocks in dominator tree post-order. The post-order enables nested
12221237 // if-conversion in a single pass. The tryConvertIf() function may erase
0 commit comments