[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