Skip to content

Commit 99278ad

Browse files
committed
Revert "[NFC][EarlyIfConverter] Replace boolean Predicate for a class (#108519)"
This reverts commit 9e73159.
1 parent a018353 commit 99278ad

File tree

1 file changed

+137
-121
lines changed

1 file changed

+137
-121
lines changed

llvm/lib/CodeGen/EarlyIfConversion.cpp

Lines changed: 137 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -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-
137125
private:
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

169165
public:
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,77 @@ 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+
190+
/// canSpeculateInstrs - Returns true if all the instructions in MBB can safely
191+
/// be speculated. The terminators are not considered.
192+
///
193+
/// If instructions use any values that are defined in the head basic block,
194+
/// the defining instructions are added to InsertAfter.
195+
///
196+
/// Any clobbered regunits are added to ClobberedRegUnits.
197+
///
198+
bool SSAIfConv::canSpeculateInstrs(MachineBasicBlock *MBB) {
199+
// Reject any live-in physregs. It's probably CPSR/EFLAGS, and very hard to
200+
// get right.
201+
if (!MBB->livein_empty()) {
202+
LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << " has live-ins.\n");
203+
return false;
204+
}
205+
206+
unsigned InstrCount = 0;
207+
208+
// Check all instructions, except the terminators. It is assumed that
209+
// terminators never have side effects or define any used register values.
210+
for (MachineInstr &MI :
211+
llvm::make_range(MBB->begin(), MBB->getFirstTerminator())) {
212+
if (MI.isDebugInstr())
213+
continue;
214+
215+
if (++InstrCount > BlockInstrLimit && !Stress) {
216+
LLVM_DEBUG(dbgs() << printMBBReference(*MBB) << " has more than "
217+
<< BlockInstrLimit << " instructions.\n");
218+
return false;
219+
}
220+
221+
// There shouldn't normally be any phis in a single-predecessor block.
222+
if (MI.isPHI()) {
223+
LLVM_DEBUG(dbgs() << "Can't hoist: " << MI);
224+
return false;
225+
}
226+
227+
// Don't speculate loads. Note that it may be possible and desirable to
228+
// speculate GOT or constant pool loads that are guaranteed not to trap,
229+
// but we don't support that for now.
230+
if (MI.mayLoad()) {
231+
LLVM_DEBUG(dbgs() << "Won't speculate load: " << MI);
232+
return false;
233+
}
234+
235+
// We never speculate stores, so an AA pointer isn't necessary.
236+
bool DontMoveAcrossStore = true;
237+
if (!MI.isSafeToMove(DontMoveAcrossStore)) {
238+
LLVM_DEBUG(dbgs() << "Can't speculate: " << MI);
239+
return false;
240+
}
241+
242+
// Check for any dependencies on Head instructions.
243+
if (!InstrDependenciesAllowIfConv(&MI))
244+
return false;
245+
}
246+
return true;
247+
}
248+
191249
/// Check that there is no dependencies preventing if conversion.
192250
///
193251
/// If instruction uses any values that are defined in the head basic block,
@@ -261,8 +319,17 @@ bool SSAIfConv::canPredicateInstrs(MachineBasicBlock *MBB) {
261319
return false;
262320
}
263321

264-
if (!Predicate.canPredicateInstr(*I))
322+
// Check that instruction is predicable
323+
if (!TII->isPredicable(*I)) {
324+
LLVM_DEBUG(dbgs() << "Isn't predicable: " << *I);
325+
return false;
326+
}
327+
328+
// Check that instruction is not already predicated.
329+
if (TII->isPredicated(*I) && !TII->canPredicatePredicatedInstr(*I)) {
330+
LLVM_DEBUG(dbgs() << "Is already predicated: " << *I);
265331
return false;
332+
}
266333

267334
// Check for any dependencies on Head instructions.
268335
if (!InstrDependenciesAllowIfConv(&(*I)))
@@ -271,6 +338,24 @@ bool SSAIfConv::canPredicateInstrs(MachineBasicBlock *MBB) {
271338
return true;
272339
}
273340

341+
// Apply predicate to all instructions in the machine block.
342+
void SSAIfConv::PredicateBlock(MachineBasicBlock *MBB, bool ReversePredicate) {
343+
auto Condition = Cond;
344+
if (ReversePredicate) {
345+
bool CanRevCond = !TII->reverseBranchCondition(Condition);
346+
assert(CanRevCond && "Reversed predicate is not supported");
347+
(void)CanRevCond;
348+
}
349+
// Terminators don't need to be predicated as they will be removed.
350+
for (MachineBasicBlock::iterator I = MBB->begin(),
351+
E = MBB->getFirstTerminator();
352+
I != E; ++I) {
353+
if (I->isDebugInstr())
354+
continue;
355+
TII->PredicateInstruction(*I, Condition);
356+
}
357+
}
358+
274359
/// Find an insertion point in Head for the speculated instructions. The
275360
/// insertion point must be:
276361
///
@@ -349,7 +434,7 @@ bool SSAIfConv::findInsertionPoint() {
349434
/// canConvertIf - analyze the sub-cfg rooted in MBB, and return true if it is
350435
/// a potential candidate for if-conversion. Fill out the internal state.
351436
///
352-
bool SSAIfConv::canConvertIf(MachineBasicBlock *MBB) {
437+
bool SSAIfConv::canConvertIf(MachineBasicBlock *MBB, bool Predicate) {
353438
Head = MBB;
354439
TBB = FBB = Tail = nullptr;
355440

@@ -389,17 +474,21 @@ bool SSAIfConv::canConvertIf(MachineBasicBlock *MBB) {
389474
<< printMBBReference(*Tail) << '\n');
390475
}
391476

477+
// This is a triangle or a diamond.
478+
// Skip if we cannot predicate and there are no phis skip as there must be
479+
// side effects that can only be handled with predication.
480+
if (!Predicate && (Tail->empty() || !Tail->front().isPHI())) {
481+
LLVM_DEBUG(dbgs() << "No phis in tail.\n");
482+
return false;
483+
}
484+
392485
// The branch we're looking to eliminate must be analyzable.
393486
Cond.clear();
394487
if (TII->analyzeBranch(*Head, TBB, FBB, Cond)) {
395488
LLVM_DEBUG(dbgs() << "Branch not analyzable.\n");
396489
return false;
397490
}
398491

399-
if (!Predicate.canConvertIf(Tail)) {
400-
return false;
401-
}
402-
403492
// This is weird, probably some sort of degenerate CFG.
404493
if (!TBB) {
405494
LLVM_DEBUG(dbgs() << "analyzeBranch didn't find conditional branch.\n");
@@ -447,9 +536,17 @@ bool SSAIfConv::canConvertIf(MachineBasicBlock *MBB) {
447536
// Check that the conditional instructions can be speculated.
448537
InsertAfter.clear();
449538
ClobberedRegUnits.reset();
450-
for (MachineBasicBlock *MBB : {TBB, FBB})
451-
if (MBB != Tail && !canPredicateInstrs(MBB))
539+
if (Predicate) {
540+
if (TBB != Tail && !canPredicateInstrs(TBB))
452541
return false;
542+
if (FBB != Tail && !canPredicateInstrs(FBB))
543+
return false;
544+
} else {
545+
if (TBB != Tail && !canSpeculateInstrs(TBB))
546+
return false;
547+
if (FBB != Tail && !canSpeculateInstrs(FBB))
548+
return false;
549+
}
453550

454551
// Try to find a valid insertion point for the speculated instructions in the
455552
// head basic block.
@@ -582,7 +679,8 @@ void SSAIfConv::rewritePHIOperands() {
582679
///
583680
/// Any basic blocks that need to be erased will be added to RemoveBlocks.
584681
///
585-
void SSAIfConv::convertIf(SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks) {
682+
void SSAIfConv::convertIf(SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks,
683+
bool Predicate) {
586684
assert(Head && Tail && TBB && FBB && "Call canConvertIf first.");
587685

588686
// Update statistics.
@@ -592,15 +690,16 @@ void SSAIfConv::convertIf(SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks) {
592690
++NumDiamondsConv;
593691

594692
// 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-
}
693+
if (TBB != Tail) {
694+
if (Predicate)
695+
PredicateBlock(TBB, /*ReversePredicate=*/false);
696+
Head->splice(InsertionPoint, TBB, TBB->begin(), TBB->getFirstTerminator());
697+
}
698+
if (FBB != Tail) {
699+
if (Predicate)
700+
PredicateBlock(FBB, /*ReversePredicate=*/true);
701+
Head->splice(InsertionPoint, FBB, FBB->begin(), FBB->getFirstTerminator());
602702
}
603-
604703
// Are there extra Tail predecessors?
605704
bool ExtraPreds = Tail->pred_size() != 2;
606705
if (ExtraPreds)
@@ -764,46 +863,6 @@ template <typename Remark> Remark &operator<<(Remark &R, Cycles C) {
764863
}
765864
} // anonymous namespace
766865

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-
807866
/// Apply cost model and heuristics to the if-conversion in IfConv.
808867
/// Return true if the conversion is a good idea.
809868
///
@@ -1037,8 +1096,7 @@ bool EarlyIfConverter::runOnMachineFunction(MachineFunction &MF) {
10371096
MinInstr = nullptr;
10381097

10391098
bool Changed = false;
1040-
SpeculateStrategy Speculate;
1041-
SSAIfConv IfConv(Speculate, MF);
1099+
SSAIfConv IfConv(MF);
10421100

10431101
// Visit blocks in dominator tree post-order. The post-order enables nested
10441102
// if-conversion in a single pass. The tryConvertIf() function may erase
@@ -1100,48 +1158,6 @@ void EarlyIfPredicator::getAnalysisUsage(AnalysisUsage &AU) const {
11001158
MachineFunctionPass::getAnalysisUsage(AU);
11011159
}
11021160

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-
11451161
/// Apply the target heuristic to decide if the transformation is profitable.
11461162
bool EarlyIfPredicator::shouldConvertIf(SSAIfConv &IfConv) {
11471163
auto TrueProbability = MBPI->getEdgeProbability(IfConv.Head, IfConv.TBB);
@@ -1186,10 +1202,11 @@ bool EarlyIfPredicator::shouldConvertIf(SSAIfConv &IfConv) {
11861202
bool EarlyIfPredicator::tryConvertIf(SSAIfConv &IfConv,
11871203
MachineBasicBlock *MBB) {
11881204
bool Changed = false;
1189-
while (IfConv.canConvertIf(MBB) && shouldConvertIf(IfConv)) {
1205+
while (IfConv.canConvertIf(MBB, /*Predicate=*/true) &&
1206+
shouldConvertIf(IfConv)) {
11901207
// If-convert MBB and update analyses.
11911208
SmallVector<MachineBasicBlock *, 4> RemoveBlocks;
1192-
IfConv.convertIf(RemoveBlocks);
1209+
IfConv.convertIf(RemoveBlocks, /*Predicate=*/true);
11931210
Changed = true;
11941211
updateDomTree(DomTree, IfConv, RemoveBlocks);
11951212
for (MachineBasicBlock *MBB : RemoveBlocks)
@@ -1215,8 +1232,7 @@ bool EarlyIfPredicator::runOnMachineFunction(MachineFunction &MF) {
12151232
MBPI = &getAnalysis<MachineBranchProbabilityInfoWrapperPass>().getMBPI();
12161233

12171234
bool Changed = false;
1218-
PredicatorStrategy Predicate(TII);
1219-
SSAIfConv IfConv(Predicate, MF);
1235+
SSAIfConv IfConv(MF);
12201236

12211237
// Visit blocks in dominator tree post-order. The post-order enables nested
12221238
// if-conversion in a single pass. The tryConvertIf() function may erase

0 commit comments

Comments
 (0)