[llvm] [LSR] Split the -lsr-term-fold transformation into it's own pass (PR #104234)

via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 14 13:56:23 PDT 2024


github-actions[bot] wrote:

<!--LLVM CODE FORMAT COMMENT: {clang-format}-->


:warning: C/C++ code formatter, clang-format found issues in your code. :warning:

<details>
<summary>
You can test this locally with the following command:
</summary>

``````````bash
git-clang-format --diff d385485450652dd75e0946d543c6bb4e0f3abf68 d82e407d836f71fd3cf176a505a170201f663fa8 --extensions cpp,h -- llvm/include/llvm/Transforms/Scalar/LoopTermFold.h llvm/lib/Transforms/Scalar/LoopTermFold.cpp llvm/include/llvm/Analysis/TargetTransformInfo.h llvm/include/llvm/Analysis/TargetTransformInfoImpl.h llvm/include/llvm/CodeGen/BasicTTIImpl.h llvm/include/llvm/CodeGen/TargetPassConfig.h llvm/include/llvm/InitializePasses.h llvm/include/llvm/LinkAllPasses.h llvm/include/llvm/Transforms/Scalar.h llvm/lib/Analysis/TargetTransformInfo.cpp llvm/lib/CodeGen/TargetPassConfig.cpp llvm/lib/Passes/PassBuilder.cpp llvm/lib/Target/RISCV/RISCVTargetMachine.cpp llvm/lib/Target/RISCV/RISCVTargetTransformInfo.h llvm/lib/Transforms/Scalar/LoopStrengthReduce.cpp llvm/lib/Transforms/Scalar/Scalar.cpp
``````````

</details>

<details>
<summary>
View the diff from clang-format here.
</summary>

``````````diff
diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h
index 3bf1840cf9..ba1ddd7991 100644
--- a/llvm/include/llvm/InitializePasses.h
+++ b/llvm/include/llvm/InitializePasses.h
@@ -168,7 +168,7 @@ void initializeLoopInfoWrapperPassPass(PassRegistry&);
 void initializeLoopPassPass(PassRegistry&);
 void initializeLoopSimplifyPass(PassRegistry&);
 void initializeLoopStrengthReducePass(PassRegistry&);
-void initializeLoopTermFoldPass(PassRegistry&);
+void initializeLoopTermFoldPass(PassRegistry &);
 void initializeLoopUnrollPass(PassRegistry&);
 void initializeLowerAtomicLegacyPassPass(PassRegistry&);
 void initializeLowerConstantIntrinsicsPass(PassRegistry&);
diff --git a/llvm/include/llvm/LinkAllPasses.h b/llvm/include/llvm/LinkAllPasses.h
index b490e816f7..77345e0a7e 100644
--- a/llvm/include/llvm/LinkAllPasses.h
+++ b/llvm/include/llvm/LinkAllPasses.h
@@ -88,7 +88,7 @@ namespace {
       (void) llvm::createLoopExtractorPass();
       (void) llvm::createLoopSimplifyPass();
       (void) llvm::createLoopStrengthReducePass();
-      (void) llvm::createLoopTermFoldPass();
+      (void)llvm::createLoopTermFoldPass();
       (void)llvm::createLoopUnrollPass();
       (void) llvm::createLowerGlobalDtorsLegacyPass();
       (void) llvm::createLowerInvokePass();
diff --git a/llvm/lib/Transforms/Scalar/LoopTermFold.cpp b/llvm/lib/Transforms/Scalar/LoopTermFold.cpp
index 1729492c1c..9809bff0ce 100644
--- a/llvm/lib/Transforms/Scalar/LoopTermFold.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopTermFold.cpp
@@ -169,8 +169,8 @@ canFoldTermCondOfLoop(Loop *L, ScalarEvolution &SE, DominatorTree &DT,
       continue;
     }
 
-    if (Expander.isHighCostExpansion(TermValueSLocal, L, ExpansionBudget,
-                                     &TTI, InsertPt)) {
+    if (Expander.isHighCostExpansion(TermValueSLocal, L, ExpansionBudget, &TTI,
+                                     InsertPt)) {
       LLVM_DEBUG(
           dbgs() << "Is too expensive to expand terminating value for phi node"
                  << PN << "\n");
@@ -180,8 +180,7 @@ canFoldTermCondOfLoop(Loop *L, ScalarEvolution &SE, DominatorTree &DT,
     // The candidate IV may have been otherwise dead and poison from the
     // very first iteration.  If we can't disprove that, we can't use the IV.
     if (!mustExecuteUBIfPoisonOnPathTo(&PN, LoopLatch->getTerminator(), &DT)) {
-      LLVM_DEBUG(dbgs() << "Can not prove poison safety for IV "
-                        << PN << "\n");
+      LLVM_DEBUG(dbgs() << "Can not prove poison safety for IV " << PN << "\n");
       continue;
     }
 
@@ -191,11 +190,11 @@ canFoldTermCondOfLoop(Loop *L, ScalarEvolution &SE, DominatorTree &DT,
     // insert UB which didn't previously exist.
     bool MustDropPoisonLocal = false;
     Instruction *PostIncV =
-      cast<Instruction>(PN.getIncomingValueForBlock(LoopLatch));
+        cast<Instruction>(PN.getIncomingValueForBlock(LoopLatch));
     if (!mustExecuteUBIfPoisonOnPathTo(PostIncV, LoopLatch->getTerminator(),
                                        &DT)) {
-      LLVM_DEBUG(dbgs() << "Can not prove poison safety to insert use"
-                        << PN << "\n");
+      LLVM_DEBUG(dbgs() << "Can not prove poison safety to insert use" << PN
+                        << "\n");
 
       // If this is a complex recurrance with multiple instructions computing
       // the backedge value, we might need to strip poison flags from all of
@@ -203,8 +202,8 @@ canFoldTermCondOfLoop(Loop *L, ScalarEvolution &SE, DominatorTree &DT,
       if (PostIncV->getOperand(0) != &PN)
         continue;
 
-      // In order to perform the transform, we need to drop the poison generating
-      // flags on this instruction (if any).
+      // In order to perform the transform, we need to drop the poison
+      // generating flags on this instruction (if any).
       MustDropPoisonLocal = PostIncV->hasPoisonGeneratingFlags();
     }
 
@@ -231,11 +230,9 @@ canFoldTermCondOfLoop(Loop *L, ScalarEvolution &SE, DominatorTree &DT,
   return std::make_tuple(ToFold, ToHelpFold, TermValueS, MustDropPoison);
 }
 
-static bool RunTermFold(Loop *L, ScalarEvolution &SE,
-                        DominatorTree &DT, LoopInfo &LI,
-                        const TargetTransformInfo &TTI,
-                        TargetLibraryInfo &TLI,
-                        MemorySSA *MSSA) {
+static bool RunTermFold(Loop *L, ScalarEvolution &SE, DominatorTree &DT,
+                        LoopInfo &LI, const TargetTransformInfo &TTI,
+                        TargetLibraryInfo &TLI, MemorySSA *MSSA) {
   std::unique_ptr<MemorySSAUpdater> MSSAU;
   if (MSSA)
     MSSAU = std::make_unique<MemorySSAUpdater>(MSSA);
@@ -253,9 +250,9 @@ static bool RunTermFold(Loop *L, ScalarEvolution &SE,
 
   (void)ToFold;
   LLVM_DEBUG(dbgs() << "To fold phi-node:\n"
-             << *ToFold << "\n"
-             << "New term-cond phi-node:\n"
-             << *ToHelpFold << "\n");
+                    << *ToFold << "\n"
+                    << "New term-cond phi-node:\n"
+                    << *ToHelpFold << "\n");
 
   Value *StartValue = ToHelpFold->getIncomingValueForBlock(LoopPreheader);
   (void)StartValue;
@@ -277,24 +274,25 @@ static bool RunTermFold(Loop *L, ScalarEvolution &SE,
                                             LoopPreheader->getTerminator());
 
   LLVM_DEBUG(dbgs() << "Start value of new term-cond phi-node:\n"
-             << *StartValue << "\n"
-             << "Terminating value of new term-cond phi-node:\n"
-             << *TermValue << "\n");
+                    << *StartValue << "\n"
+                    << "Terminating value of new term-cond phi-node:\n"
+                    << *TermValue << "\n");
 
   // Create new terminating condition at loop latch
   BranchInst *BI = cast<BranchInst>(LoopLatch->getTerminator());
   ICmpInst *OldTermCond = cast<ICmpInst>(BI->getCondition());
   IRBuilder<> LatchBuilder(LoopLatch->getTerminator());
   Value *NewTermCond =
-    LatchBuilder.CreateICmp(CmpInst::ICMP_EQ, LoopValue, TermValue,
-                            "lsr_fold_term_cond.replaced_term_cond");
+      LatchBuilder.CreateICmp(CmpInst::ICMP_EQ, LoopValue, TermValue,
+                              "lsr_fold_term_cond.replaced_term_cond");
   // Swap successors to exit loop body if IV equals to new TermValue
   if (BI->getSuccessor(0) == L->getHeader())
     BI->swapSuccessors();
 
   LLVM_DEBUG(dbgs() << "Old term-cond:\n"
-             << *OldTermCond << "\n"
-             << "New term-cond:\n" << *NewTermCond << "\n");
+                    << *OldTermCond << "\n"
+                    << "New term-cond:\n"
+                    << *NewTermCond << "\n");
 
   BI->setCondition(NewTermCond);
 
@@ -340,7 +338,6 @@ void LoopTermFold::getAnalysisUsage(AnalysisUsage &AU) const {
   AU.addPreserved<MemorySSAWrapperPass>();
 }
 
-
 bool LoopTermFold::runOnLoop(Loop *L, LPPassManager & /*LPM*/) {
   if (skipLoop(L))
     return false;
@@ -373,14 +370,14 @@ PreservedAnalyses LoopTermFoldPass::run(Loop &L, LoopAnalysisManager &AM,
 
 char LoopTermFold::ID = 0;
 
-INITIALIZE_PASS_BEGIN(LoopTermFold, "loop-term-fold",
-                      "Loop Terminator Folding", false, false)
+INITIALIZE_PASS_BEGIN(LoopTermFold, "loop-term-fold", "Loop Terminator Folding",
+                      false, false)
 INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(ScalarEvolutionWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass)
 INITIALIZE_PASS_DEPENDENCY(LoopSimplify)
-INITIALIZE_PASS_END(LoopTermFold, "loop-term-fold",
-                    "Loop Terminator Folding", false, false)
+INITIALIZE_PASS_END(LoopTermFold, "loop-term-fold", "Loop Terminator Folding",
+                    false, false)
 
 Pass *llvm::createLoopTermFoldPass() { return new LoopTermFold(); }

``````````

</details>


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


More information about the llvm-commits mailing list