[llvm] [Pipeline] Eliminate dead loops introduced by InstCombine (PR #69073)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Oct 14 11:23:26 PDT 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Yingwei Zheng (dtcxzyw)
<details>
<summary>Changes</summary>
This PR adds a `LoopDeletionPass` at the end of the vectorization pipeline. It will eliminate dead loops introduced by `InstCombine`.
Fixes #<!-- -->68282.
---
Full diff: https://github.com/llvm/llvm-project/pull/69073.diff
7 Files Affected:
- (modified) llvm/lib/Passes/PassBuilderPipelines.cpp (+8-4)
- (modified) llvm/test/Other/new-pm-defaults.ll (+1)
- (modified) llvm/test/Other/new-pm-lto-defaults.ll (+1)
- (modified) llvm/test/Other/new-pm-thinlto-postlink-defaults.ll (+1)
- (modified) llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll (+1)
- (modified) llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll (+1)
- (added) llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll (+59)
``````````diff
diff --git a/llvm/lib/Passes/PassBuilderPipelines.cpp b/llvm/lib/Passes/PassBuilderPipelines.cpp
index 600f8d43caaf216..011d0119d18ade1 100644
--- a/llvm/lib/Passes/PassBuilderPipelines.cpp
+++ b/llvm/lib/Passes/PassBuilderPipelines.cpp
@@ -1280,10 +1280,14 @@ void PassBuilder::addVectorPasses(OptimizationLevel Level,
// divide result.
// 2. It helps to clean up some loop-invariant code created by the loop
// unroll pass when IsFullLTO=false.
- FPM.addPass(createFunctionToLoopPassAdaptor(
- LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
- /*AllowSpeculation=*/true),
- /*UseMemorySSA=*/true, /*UseBlockFrequencyInfo=*/false));
+ // 3. It deletes dead loops exposed by instcombine.
+ LoopPassManager LPM;
+ LPM.addPass(LICMPass(PTO.LicmMssaOptCap, PTO.LicmMssaNoAccForPromotionCap,
+ /*AllowSpeculation=*/true));
+ LPM.addPass(LoopDeletionPass());
+ FPM.addPass(createFunctionToLoopPassAdaptor(std::move(LPM),
+ /*UseMemorySSA=*/true,
+ /*UseBlockFrequencyInfo=*/false));
// Now that we've vectorized and unrolled loops, we may have more refined
// alignment information, try to re-derive it here.
diff --git a/llvm/test/Other/new-pm-defaults.ll b/llvm/test/Other/new-pm-defaults.ll
index 098db2b959a29ec..68af447faef6293 100644
--- a/llvm/test/Other/new-pm-defaults.ll
+++ b/llvm/test/Other/new-pm-defaults.ll
@@ -265,6 +265,7 @@
; CHECK-O-NEXT: Running pass: LoopSimplifyPass
; CHECK-O-NEXT: Running pass: LCSSAPass
; CHECK-O-NEXT: Running pass: LICMPass
+; CHECK-O-NEXT: Running pass: LoopDeletionPass
; CHECK-O-NEXT: Running pass: AlignmentFromAssumptionsPass
; CHECK-O-NEXT: Running pass: LoopSinkPass
; CHECK-O-NEXT: Running pass: InstSimplifyPass
diff --git a/llvm/test/Other/new-pm-lto-defaults.ll b/llvm/test/Other/new-pm-lto-defaults.ll
index d451d2897f673cd..f627a0079fd6fae 100644
--- a/llvm/test/Other/new-pm-lto-defaults.ll
+++ b/llvm/test/Other/new-pm-lto-defaults.ll
@@ -134,6 +134,7 @@
; CHECK-O23SZ-NEXT: Running pass: LoopSimplifyPass
; CHECK-O23SZ-NEXT: Running pass: LCSSAPass
; CHECK-O23SZ-NEXT: Running pass: LICMPass
+; CHECK-O23SZ-NEXT: Running pass: LoopDeletionPass
; CHECK-O23SZ-NEXT: Running pass: AlignmentFromAssumptionsPass on foo
; CHECK-EP-Peephole-NEXT: Running pass: NoOpFunctionPass on foo
; CHECK-O23SZ-NEXT: Running pass: JumpThreadingPass on foo
diff --git a/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll
index 1103c8f984fa296..28b68dc80b1cabd 100644
--- a/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll
+++ b/llvm/test/Other/new-pm-thinlto-postlink-defaults.ll
@@ -192,6 +192,7 @@
; CHECK-POSTLINK-O-NEXT: Running pass: LoopSimplifyPass
; CHECK-POSTLINK-O-NEXT: Running pass: LCSSAPass
; CHECK-POSTLINK-O-NEXT: Running pass: LICMPass
+; CHECK-POSTLINK-O-NEXT: Running pass: LoopDeletionPass
; CHECK-POSTLINK-O-NEXT: Running pass: AlignmentFromAssumptionsPass
; CHECK-POSTLINK-O-NEXT: Running pass: LoopSinkPass
; CHECK-POSTLINK-O-NEXT: Running pass: InstSimplifyPass
diff --git a/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll
index 05d165ae399f903..b6ae0690f76797c 100644
--- a/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll
+++ b/llvm/test/Other/new-pm-thinlto-postlink-pgo-defaults.ll
@@ -178,6 +178,7 @@
; CHECK-O-NEXT: Running pass: LoopSimplifyPass
; CHECK-O-NEXT: Running pass: LCSSAPass
; CHECK-O-NEXT: Running pass: LICMPass
+; CHECK-O-NEXT: Running pass: LoopDeletionPass
; CHECK-O-NEXT: Running pass: AlignmentFromAssumptionsPass
; CHECK-O-NEXT: Running pass: LoopSinkPass
; CHECK-O-NEXT: Running pass: InstSimplifyPass
diff --git a/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll b/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll
index 2393ba9dbde4b64..5954feccacc5f6c 100644
--- a/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll
+++ b/llvm/test/Other/new-pm-thinlto-postlink-samplepgo-defaults.ll
@@ -185,6 +185,7 @@
; CHECK-O-NEXT: Running pass: LoopSimplifyPass
; CHECK-O-NEXT: Running pass: LCSSAPass
; CHECK-O-NEXT: Running pass: LICMPass
+; CHECK-O-NEXT: Running pass: LoopDeletionPass
; CHECK-O-NEXT: Running pass: AlignmentFromAssumptionsPass
; CHECK-O-NEXT: Running pass: LoopSinkPass
; CHECK-O-NEXT: Running pass: InstSimplifyPass
diff --git a/llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll b/llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll
new file mode 100644
index 000000000000000..6f1e3dfa7ad3436
--- /dev/null
+++ b/llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll
@@ -0,0 +1,59 @@
+; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3
+; RUN: opt < %s -passes='default<O3>' -mcpu=generic -S | FileCheck %s
+
+; C version of test case
+; int pr68282() {
+; int outputValue = 0;
+; for (int x = 0; x < 1024 * 1024; ++x) {
+; outputValue += outputValue + 0;
+; outputValue += outputValue + 1;
+; outputValue += outputValue + 2;
+; outputValue += outputValue + 3;
+; outputValue += outputValue + 4;
+; outputValue += outputValue + 5;
+; outputValue += outputValue + 6;
+; outputValue += outputValue + 7;
+; }
+; return outputValue;
+; }
+
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+define i32 @pr68282() {
+; CHECK-LABEL: define i32 @pr68282(
+; CHECK-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] {
+; CHECK-NEXT: entry:
+; CHECK-NEXT: ret i32 -134744073
+;
+entry:
+ br label %for.cond
+
+for.cond:
+ %outputValue.0 = phi i32 [ 0, %entry ], [ %add15, %for.body ]
+ %x.0 = phi i32 [ 0, %entry ], [ %inc, %for.body ]
+ %cmp = icmp slt i32 %x.0, 1048576
+ br i1 %cmp, label %for.body, label %for.cond.cleanup
+
+for.cond.cleanup:
+ ret i32 %outputValue.0
+
+for.body:
+ %add1 = add nsw i32 %outputValue.0, %outputValue.0
+ %add2 = add nsw i32 %add1, 1
+ %add3 = add nsw i32 %add1, %add2
+ %add4 = add nsw i32 %add3, 2
+ %add5 = add nsw i32 %add3, %add4
+ %add6 = add nsw i32 %add5, 3
+ %add7 = add nsw i32 %add5, %add6
+ %add8 = add nsw i32 %add7, 4
+ %add9 = add nsw i32 %add7, %add8
+ %add10 = add nsw i32 %add9, 5
+ %add11 = add nsw i32 %add9, %add10
+ %add12 = add nsw i32 %add11, 6
+ %add13 = add nsw i32 %add11, %add12
+ %add14 = add nsw i32 %add13, 7
+ %add15 = add nsw i32 %add13, %add14
+ %inc = add nsw i32 %x.0, 1
+ br label %for.cond
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/69073
More information about the llvm-commits
mailing list