[llvm] eda3c93 - [LoopFuse] Ensure loops are in loop simplified form under new PM

via llvm-commits llvm-commits at lists.llvm.org
Mon Oct 31 08:50:28 PDT 2022


Author: Mengxuan Cai
Date: 2022-10-31T11:46:28-04:00
New Revision: eda3c93486ca113f63ccf8f28ca9c0ea90c09386

URL: https://github.com/llvm/llvm-project/commit/eda3c93486ca113f63ccf8f28ca9c0ea90c09386
DIFF: https://github.com/llvm/llvm-project/commit/eda3c93486ca113f63ccf8f28ca9c0ea90c09386.diff

LOG: [LoopFuse] Ensure loops are in loop simplified form under new PM

Loop Fusion (Function Pass) requires loops in simplified form. With
legacy-pm, loop-simplify pass is added as a dependency for loop-fusion.
But the new pass manager does not always ensure this format. This patch
tries to invoke simplifyLoop() on loops that are not in simplified form
only for new PM.

Reviewed By: aeubanks

Differential Revision: https://reviews.llvm.org/D136781

Added: 
    llvm/test/Transforms/LoopFusion/ensure_loop_simplify_form.ll

Modified: 
    llvm/lib/Transforms/Scalar/LoopFuse.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Scalar/LoopFuse.cpp b/llvm/lib/Transforms/Scalar/LoopFuse.cpp
index 5157f0571e1d3..9d70f8929c134 100644
--- a/llvm/lib/Transforms/Scalar/LoopFuse.cpp
+++ b/llvm/lib/Transforms/Scalar/LoopFuse.cpp
@@ -67,6 +67,7 @@
 #include "llvm/Transforms/Utils/BasicBlockUtils.h"
 #include "llvm/Transforms/Utils/CodeMoverUtils.h"
 #include "llvm/Transforms/Utils/LoopPeel.h"
+#include "llvm/Transforms/Utils/LoopSimplify.h"
 
 using namespace llvm;
 
@@ -2085,8 +2086,20 @@ PreservedAnalyses LoopFusePass::run(Function &F, FunctionAnalysisManager &AM) {
   const TargetTransformInfo &TTI = AM.getResult<TargetIRAnalysis>(F);
   const DataLayout &DL = F.getParent()->getDataLayout();
 
+  // Ensure loops are in simplifed form which is a pre-requisite for loop fusion
+  // pass. Added only for new PM since the legacy PM has already added
+  // LoopSimplify pass as a dependency.
+  bool Changed = false;
+  for (auto &L : LI) {
+    if (!L->isLoopSimplifyForm())
+      Changed |= simplifyLoop(L, &DT, &LI, &SE, &AC, nullptr,
+                              false /* PreserveLCSSA */);
+  }
+  if (Changed)
+    PDT.recalculate(F);
+
   LoopFuser LF(LI, DT, DI, SE, PDT, ORE, DL, AC, TTI);
-  bool Changed = LF.fuseLoops(F);
+  Changed |= LF.fuseLoops(F);
   if (!Changed)
     return PreservedAnalyses::all();
 

diff  --git a/llvm/test/Transforms/LoopFusion/ensure_loop_simplify_form.ll b/llvm/test/Transforms/LoopFusion/ensure_loop_simplify_form.ll
new file mode 100644
index 0000000000000..c80b08e0cfa33
--- /dev/null
+++ b/llvm/test/Transforms/LoopFusion/ensure_loop_simplify_form.ll
@@ -0,0 +1,35 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
+; RUN: opt < %s -passes=loop-fusion -S | FileCheck %s
+
+define void @v_5_0(i32* %dummy) {
+; CHECK-LABEL: @v_5_0(
+; CHECK-NEXT:  entry:
+; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
+; CHECK:       for.cond.cleanup:
+; CHECK-NEXT:    br i1 true, label [[FOR_BODY6_PREHEADER:%.*]], label [[FOR_COND_CLEANUP5:%.*]]
+; CHECK:       for.body6.preheader:
+; CHECK-NEXT:    br label [[FOR_BODY6:%.*]]
+; CHECK:       for.body:
+; CHECK-NEXT:    br i1 false, label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
+; CHECK:       for.cond.cleanup5:
+; CHECK-NEXT:    ret void
+; CHECK:       for.body6:
+; CHECK-NEXT:    [[V_LOOP_2_0_V_LOOP_2_0_V_LOOP_2_0_18:%.*]] = load volatile i32, i32* [[DUMMY:%.*]], align 1
+; CHECK-NEXT:    br label [[FOR_BODY6]]
+;
+entry:
+  br label %for.body
+
+for.cond.cleanup:                                 ; preds = %for.body
+  br i1 true, label %for.body6, label %for.cond.cleanup5
+
+for.body:                                         ; preds = %for.body, %entry
+  br i1 false, label %for.cond.cleanup, label %for.body
+
+for.cond.cleanup5:                                ; preds = %for.cond.cleanup
+  ret void
+
+for.body6:                                        ; preds = %for.body6, %for.cond.cleanup
+  %v_loop_2.0.v_loop_2.0.v_loop_2.0.18 = load volatile i32, i32* %dummy, align 1
+  br label %for.body6
+}


        


More information about the llvm-commits mailing list