[llvm] Port CodeGenPrepare to new pass manager (PR #68530)

Matt Arsenault via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 9 07:26:39 PDT 2023


================
@@ -486,72 +432,185 @@ class CodeGenPrepare : public FunctionPass {
   bool combineToUSubWithOverflow(CmpInst *Cmp, ModifyDT &ModifiedDT);
   bool combineToUAddWithOverflow(CmpInst *Cmp, ModifyDT &ModifiedDT);
   void verifyBFIUpdates(Function &F);
+
+  void releaseMemory() {
+    // Clear per function information.
+    InsertedInsts.clear();
+    PromotedInsts.clear();
+    FreshBBs.clear();
+    BPI.reset();
+    BFI.reset();
+  }
+  bool run(Function &F, const TargetMachine *TM,
+                              const TargetTransformInfo &TTI,
+                              LoopInfo &LI, ProfileSummaryInfo &PSI, 
+                              const TargetLibraryInfo &TLInfo);
+
+private:
+  template <typename F>
+  void resetIteratorIfInvalidatedWhileCalling(BasicBlock *BB, F f) {
+    // Substituting can cause recursive simplifications, which can invalidate
+    // our iterator.  Use a WeakTrackingVH to hold onto it in case this
+    // happens.
+    Value *CurValue = &*CurInstIterator;
+    WeakTrackingVH IterHandle(CurValue);
+
+    f();
+
+    // If the iterator instruction was recursively deleted, start over at the
+    // start of the block.
+    if (IterHandle != CurValue) {
+      CurInstIterator = BB->begin();
+      SunkAddrs.clear();
+    }
+  }
+
+  // Get the DominatorTree, building if necessary.
+  DominatorTree &getDT(Function &F) {
+    if (!DT)
+      DT = std::make_unique<DominatorTree>(F);
+    return *DT;
+  }
+};
+
+ class CodeGenPrepareLegacy : public FunctionPass {
+ public:
+    static char ID; // Pass identification, replacement for typeid
+    bool runOnFunction(Function &F) override;
+    const TargetMachine *TM = nullptr;
+    const TargetSubtargetInfo *SubtargetInfo = nullptr;
+    const TargetLowering *TLI = nullptr;
+    const TargetRegisterInfo *TRI = nullptr;
+    const TargetTransformInfo *TTI = nullptr;
+    const BasicBlockSectionsProfileReader *BBSectionsProfileReader = nullptr;
+    const TargetLibraryInfo *TLInfo = nullptr;
+    LoopInfo *LI = nullptr;
+    std::unique_ptr<BlockFrequencyInfo> BFI;
+    std::unique_ptr<BranchProbabilityInfo> BPI;
+    ProfileSummaryInfo *PSI = nullptr;
+    StringRef getPassName() const { return "CodeGen Prepare"; }
+
+    void getAnalysisUsage(AnalysisUsage &AU) const {
+      // FIXME: When we can selectively preserve passes, preserve the domtree.
+      AU.addRequired<ProfileSummaryInfoWrapperPass>();
+      AU.addRequired<TargetLibraryInfoWrapperPass>();
+      AU.addRequired<TargetPassConfig>();
+      AU.addRequired<TargetTransformInfoWrapperPass>();
+      AU.addRequired<LoopInfoWrapperPass>();
+      AU.addUsedIfAvailable<BasicBlockSectionsProfileReader>();
+    }
+
+    CodeGenPrepareLegacy() : FunctionPass(ID) {
+      initializeCodeGenPrepareLegacyPass(*PassRegistry::getPassRegistry());
+    }
 };
 
 } // end anonymous namespace
 
-char CodeGenPrepare::ID = 0;
+char CodeGenPrepareLegacy::ID = 0;
 
-INITIALIZE_PASS_BEGIN(CodeGenPrepare, DEBUG_TYPE,
+INITIALIZE_PASS_BEGIN(CodeGenPrepareLegacy, DEBUG_TYPE,
                       "Optimize for code generation", false, false)
 INITIALIZE_PASS_DEPENDENCY(BasicBlockSectionsProfileReader)
 INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(ProfileSummaryInfoWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
 INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
-INITIALIZE_PASS_END(CodeGenPrepare, DEBUG_TYPE, "Optimize for code generation",
+INITIALIZE_PASS_END(CodeGenPrepareLegacy, DEBUG_TYPE, "Optimize for code generation",
                     false, false)
 
-FunctionPass *llvm::createCodeGenPreparePass() { return new CodeGenPrepare(); }
+FunctionPass *llvm::createCodeGenPreparePass() {
+ return new CodeGenPrepareLegacy();
+}
 
-bool CodeGenPrepare::runOnFunction(Function &F) {
+bool CodeGenPrepareLegacy::runOnFunction(Function &F) {
   if (skipFunction(F))
     return false;
+  auto *TPC = getAnalysisIfAvailable<TargetPassConfig>();
----------------
arsenm wrote:

Do you still need this if the TM is passed to the constructor function?

https://github.com/llvm/llvm-project/pull/68530


More information about the llvm-commits mailing list