diff --git a/llvm/lib/CodeGen/EarlyIfConversion.cpp b/llvm/lib/CodeGen/EarlyIfConversion.cpp index 0de8112fb72c8..99ffc01ca4ebb 100644 --- a/llvm/lib/CodeGen/EarlyIfConversion.cpp +++ b/llvm/lib/CodeGen/EarlyIfConversion.cpp @@ -163,8 +163,7 @@ class SSAIfConv { void rewritePHIOperands(); public: - /// runOnMachineFunction - Initialize per-function data structures. - void runOnMachineFunction(MachineFunction &MF) { + SSAIfConv(MachineFunction &MF) { TII = MF.getSubtarget().getInstrInfo(); TRI = MF.getSubtarget().getRegisterInfo(); MRI = &MF.getRegInfo(); @@ -770,7 +769,6 @@ class EarlyIfConverter : public MachineFunctionPass { MachineLoopInfo *Loops = nullptr; MachineTraceMetrics *Traces = nullptr; MachineTraceMetrics::Ensemble *MinInstr = nullptr; - SSAIfConv IfConv; public: static char ID; @@ -780,9 +778,9 @@ class EarlyIfConverter : public MachineFunctionPass { StringRef getPassName() const override { return "Early If-Conversion"; } private: - bool tryConvertIf(MachineBasicBlock*); - void invalidateTraces(); - bool shouldConvertIf(); + bool tryConvertIf(SSAIfConv &IfConv, MachineBasicBlock *); + void invalidateTraces(SSAIfConv &IfConv); + bool shouldConvertIf(SSAIfConv &IfConv); }; } // end anonymous namespace @@ -838,7 +836,7 @@ void updateLoops(MachineLoopInfo *Loops, } // namespace /// Invalidate MachineTraceMetrics before if-conversion. -void EarlyIfConverter::invalidateTraces() { +void EarlyIfConverter::invalidateTraces(SSAIfConv &IfConv) { Traces->verifyAnalysis(); Traces->invalidate(IfConv.Head); Traces->invalidate(IfConv.Tail); @@ -868,7 +866,7 @@ template Remark &operator<<(Remark &R, Cycles C) { /// Apply cost model and heuristics to the if-conversion in IfConv. /// Return true if the conversion is a good idea. /// -bool EarlyIfConverter::shouldConvertIf() { +bool EarlyIfConverter::shouldConvertIf(SSAIfConv &IfConv) { // Stress testing mode disables all cost considerations. if (Stress) return true; @@ -1061,11 +1059,11 @@ bool EarlyIfConverter::shouldConvertIf() { /// Attempt repeated if-conversion on MBB, return true if successful. /// -bool EarlyIfConverter::tryConvertIf(MachineBasicBlock *MBB) { +bool EarlyIfConverter::tryConvertIf(SSAIfConv &IfConv, MachineBasicBlock *MBB) { bool Changed = false; - while (IfConv.canConvertIf(MBB) && shouldConvertIf()) { + while (IfConv.canConvertIf(MBB) && shouldConvertIf(IfConv)) { // If-convert MBB and update analyses. - invalidateTraces(); + invalidateTraces(IfConv); SmallVector RemoveBlocks; IfConv.convertIf(RemoveBlocks); Changed = true; @@ -1098,14 +1096,14 @@ bool EarlyIfConverter::runOnMachineFunction(MachineFunction &MF) { MinInstr = nullptr; bool Changed = false; - IfConv.runOnMachineFunction(MF); + SSAIfConv IfConv(MF); // Visit blocks in dominator tree post-order. The post-order enables nested // if-conversion in a single pass. The tryConvertIf() function may erase // blocks, but only blocks dominated by the head block. This makes it safe to // update the dominator tree while the post-order iterator is still active. for (auto *DomNode : post_order(DomTree)) - if (tryConvertIf(DomNode->getBlock())) + if (tryConvertIf(IfConv, DomNode->getBlock())) Changed = true; return Changed; @@ -1124,7 +1122,6 @@ class EarlyIfPredicator : public MachineFunctionPass { MachineDominatorTree *DomTree = nullptr; MachineBranchProbabilityInfo *MBPI = nullptr; MachineLoopInfo *Loops = nullptr; - SSAIfConv IfConv; public: static char ID; @@ -1134,8 +1131,8 @@ class EarlyIfPredicator : public MachineFunctionPass { StringRef getPassName() const override { return "Early If-predicator"; } protected: - bool tryConvertIf(MachineBasicBlock *); - bool shouldConvertIf(); + bool tryConvertIf(SSAIfConv &IfConv, MachineBasicBlock *); + bool shouldConvertIf(SSAIfConv &IfConv); }; } // end anonymous namespace @@ -1162,7 +1159,7 @@ void EarlyIfPredicator::getAnalysisUsage(AnalysisUsage &AU) const { } /// Apply the target heuristic to decide if the transformation is profitable. -bool EarlyIfPredicator::shouldConvertIf() { +bool EarlyIfPredicator::shouldConvertIf(SSAIfConv &IfConv) { auto TrueProbability = MBPI->getEdgeProbability(IfConv.Head, IfConv.TBB); if (IfConv.isTriangle()) { MachineBasicBlock &IfBlock = @@ -1202,12 +1199,14 @@ bool EarlyIfPredicator::shouldConvertIf() { /// Attempt repeated if-conversion on MBB, return true if successful. /// -bool EarlyIfPredicator::tryConvertIf(MachineBasicBlock *MBB) { +bool EarlyIfPredicator::tryConvertIf(SSAIfConv &IfConv, + MachineBasicBlock *MBB) { bool Changed = false; - while (IfConv.canConvertIf(MBB, /*Predicate*/ true) && shouldConvertIf()) { + while (IfConv.canConvertIf(MBB, /*Predicate=*/true) && + shouldConvertIf(IfConv)) { // If-convert MBB and update analyses. SmallVector RemoveBlocks; - IfConv.convertIf(RemoveBlocks, /*Predicate*/ true); + IfConv.convertIf(RemoveBlocks, /*Predicate=*/true); Changed = true; updateDomTree(DomTree, IfConv, RemoveBlocks); for (MachineBasicBlock *MBB : RemoveBlocks) @@ -1233,14 +1232,14 @@ bool EarlyIfPredicator::runOnMachineFunction(MachineFunction &MF) { MBPI = &getAnalysis().getMBPI(); bool Changed = false; - IfConv.runOnMachineFunction(MF); + SSAIfConv IfConv(MF); // Visit blocks in dominator tree post-order. The post-order enables nested // if-conversion in a single pass. The tryConvertIf() function may erase // blocks, but only blocks dominated by the head block. This makes it safe to // update the dominator tree while the post-order iterator is still active. for (auto *DomNode : post_order(DomTree)) - if (tryConvertIf(DomNode->getBlock())) + if (tryConvertIf(IfConv, DomNode->getBlock())) Changed = true; return Changed;