1515//
1616// ===----------------------------------------------------------------------===//
1717
18+ #include " llvm/CodeGen/EarlyIfConversion.h"
1819#include " llvm/ADT/BitVector.h"
1920#include " llvm/ADT/PostOrderIterator.h"
2021#include " llvm/ADT/SmallPtrSet.h"
@@ -760,7 +761,7 @@ void SSAIfConv::convertIf(SmallVectorImpl<MachineBasicBlock *> &RemoveBlocks,
760761// ===----------------------------------------------------------------------===//
761762
762763namespace {
763- class EarlyIfConverter : public MachineFunctionPass {
764+ class EarlyIfConverter {
764765 const TargetInstrInfo *TII = nullptr ;
765766 const TargetRegisterInfo *TRI = nullptr ;
766767 MCSchedModel SchedModel;
@@ -772,31 +773,41 @@ class EarlyIfConverter : public MachineFunctionPass {
772773 SSAIfConv IfConv;
773774
774775public:
775- static char ID;
776- EarlyIfConverter () : MachineFunctionPass(ID) {}
777- void getAnalysisUsage (AnalysisUsage &AU) const override ;
778- bool runOnMachineFunction (MachineFunction &MF) override ;
779- StringRef getPassName () const override { return " Early If-Conversion" ; }
776+ EarlyIfConverter (MachineDominatorTree &DT, MachineLoopInfo &LI,
777+ MachineTraceMetrics &MTM)
778+ : DomTree(&DT), Loops(&LI), Traces(&MTM) {}
779+ EarlyIfConverter () = delete ;
780+
781+ bool run (MachineFunction &MF);
780782
781783private:
782784 bool tryConvertIf (MachineBasicBlock *);
783785 void invalidateTraces ();
784786 bool shouldConvertIf ();
785787};
788+
789+ class EarlyIfConverterLegacy : public MachineFunctionPass {
790+ public:
791+ static char ID;
792+ EarlyIfConverterLegacy () : MachineFunctionPass(ID) {}
793+ void getAnalysisUsage (AnalysisUsage &AU) const override ;
794+ bool runOnMachineFunction (MachineFunction &MF) override ;
795+ StringRef getPassName () const override { return " Early If-Conversion" ; }
796+ };
786797} // end anonymous namespace
787798
788- char EarlyIfConverter ::ID = 0 ;
789- char &llvm::EarlyIfConverterID = EarlyIfConverter ::ID;
799+ char EarlyIfConverterLegacy ::ID = 0 ;
800+ char &llvm::EarlyIfConverterLegacyID = EarlyIfConverterLegacy ::ID;
790801
791- INITIALIZE_PASS_BEGIN (EarlyIfConverter , DEBUG_TYPE,
792- " Early If Converter " , false , false )
802+ INITIALIZE_PASS_BEGIN (EarlyIfConverterLegacy , DEBUG_TYPE, " Early If Converter " ,
803+ false , false )
793804INITIALIZE_PASS_DEPENDENCY(MachineBranchProbabilityInfoWrapperPass)
794805INITIALIZE_PASS_DEPENDENCY(MachineDominatorTreeWrapperPass)
795806INITIALIZE_PASS_DEPENDENCY(MachineTraceMetricsWrapperPass)
796- INITIALIZE_PASS_END(EarlyIfConverter , DEBUG_TYPE,
797- " Early If Converter " , false , false )
807+ INITIALIZE_PASS_END(EarlyIfConverterLegacy , DEBUG_TYPE, " Early If Converter " ,
808+ false , false )
798809
799- void EarlyIfConverter ::getAnalysisUsage(AnalysisUsage &AU) const {
810+ void EarlyIfConverterLegacy ::getAnalysisUsage(AnalysisUsage &AU) const {
800811 AU.addRequired <MachineBranchProbabilityInfoWrapperPass>();
801812 AU.addRequired <MachineDominatorTreeWrapperPass>();
802813 AU.addPreserved <MachineDominatorTreeWrapperPass>();
@@ -1076,11 +1087,9 @@ bool EarlyIfConverter::tryConvertIf(MachineBasicBlock *MBB) {
10761087 return Changed;
10771088}
10781089
1079- bool EarlyIfConverter::runOnMachineFunction (MachineFunction &MF) {
1090+ bool EarlyIfConverter::run (MachineFunction &MF) {
10801091 LLVM_DEBUG (dbgs () << " ********** EARLY IF-CONVERSION **********\n "
10811092 << " ********** Function: " << MF.getName () << ' \n ' );
1082- if (skipFunction (MF.getFunction ()))
1083- return false ;
10841093
10851094 // Only run if conversion if the target wants it.
10861095 const TargetSubtargetInfo &STI = MF.getSubtarget ();
@@ -1091,9 +1100,6 @@ bool EarlyIfConverter::runOnMachineFunction(MachineFunction &MF) {
10911100 TRI = STI.getRegisterInfo ();
10921101 SchedModel = STI.getSchedModel ();
10931102 MRI = &MF.getRegInfo ();
1094- DomTree = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree ();
1095- Loops = &getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
1096- Traces = &getAnalysis<MachineTraceMetricsWrapperPass>().getMTM ();
10971103 MinInstr = nullptr ;
10981104
10991105 bool Changed = false ;
@@ -1110,6 +1116,41 @@ bool EarlyIfConverter::runOnMachineFunction(MachineFunction &MF) {
11101116 return Changed;
11111117}
11121118
1119+ PreservedAnalyses
1120+ EarlyIfConverterPass::run (MachineFunction &MF,
1121+ MachineFunctionAnalysisManager &MFAM) {
1122+ if (MF.getFunction ().hasOptNone ())
1123+ return PreservedAnalyses::all ();
1124+
1125+ MachineDominatorTree &MDT = MFAM.getResult <MachineDominatorTreeAnalysis>(MF);
1126+ MachineLoopInfo &LI = MFAM.getResult <MachineLoopAnalysis>(MF);
1127+ MachineTraceMetrics &MTM = MFAM.getResult <MachineTraceMetricsAnalysis>(MF);
1128+
1129+ EarlyIfConverter Impl (MDT, LI, MTM);
1130+ bool Changed = Impl.run (MF);
1131+ if (!Changed)
1132+ return PreservedAnalyses::all ();
1133+
1134+ auto PA = getMachineFunctionPassPreservedAnalyses ();
1135+ PA.preserve <MachineDominatorTreeAnalysis>();
1136+ PA.preserve <MachineLoopAnalysis>();
1137+ PA.preserve <MachineTraceMetricsAnalysis>();
1138+ return PA;
1139+ }
1140+
1141+ bool EarlyIfConverterLegacy::runOnMachineFunction (MachineFunction &MF) {
1142+ if (skipFunction (MF.getFunction ()))
1143+ return false ;
1144+
1145+ MachineDominatorTree &MDT =
1146+ getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree ();
1147+ MachineLoopInfo &LI = getAnalysis<MachineLoopInfoWrapperPass>().getLI ();
1148+ MachineTraceMetrics &MTM =
1149+ getAnalysis<MachineTraceMetricsWrapperPass>().getMTM ();
1150+
1151+ return EarlyIfConverter (MDT, LI, MTM).run (MF);
1152+ }
1153+
11131154// ===----------------------------------------------------------------------===//
11141155// EarlyIfPredicator Pass
11151156// ===----------------------------------------------------------------------===//
0 commit comments