[llvm] [Pipeline] Eliminate dead loops introduced by InstCombine (PR #69073)

Yingwei Zheng via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 14 11:21:19 PDT 2023


https://github.com/dtcxzyw created https://github.com/llvm/llvm-project/pull/69073

This PR adds a `LoopDeletionPass` at the end of the vectorization pipeline. It will eliminate dead loops introduced by `InstCombine`.

Fixes #68282.


>From ed2c80151d6be0e8c2480a68d301d2c8a447ef13 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sun, 15 Oct 2023 01:03:12 +0800
Subject: [PATCH 1/2] [Pipeline] Add pre-commit test for PR68282. NFC.

---
 .../Transforms/PhaseOrdering/X86/pr68282.ll   | 66 +++++++++++++++++++
 1 file changed, 66 insertions(+)
 create mode 100644 llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll

diff --git a/llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll b/llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll
new file mode 100644
index 000000000000000..19f8b661843d93c
--- /dev/null
+++ b/llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll
@@ -0,0 +1,66 @@
+; 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:    br label [[FOR_BODY:%.*]]
+; CHECK:       for.cond.cleanup:
+; CHECK-NEXT:    ret i32 -134744073
+; CHECK:       for.body:
+; CHECK-NEXT:    [[X_02:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC_7:%.*]], [[FOR_BODY]] ]
+; CHECK-NEXT:    [[INC_7]] = add nuw nsw i32 [[X_02]], 8
+; CHECK-NEXT:    [[EXITCOND_NOT_7:%.*]] = icmp eq i32 [[INC_7]], 1048576
+; CHECK-NEXT:    br i1 [[EXITCOND_NOT_7]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
+;
+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
+}

>From 060c47fa33edcf27e647c6c11cd1fd2e589bc272 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Sun, 15 Oct 2023 01:04:21 +0800
Subject: [PATCH 2/2] [Pipeline] Eliminate dead loops introduced by InstCombine

---
 llvm/lib/Passes/PassBuilderPipelines.cpp             | 12 ++++++++----
 llvm/test/Other/new-pm-defaults.ll                   |  1 +
 llvm/test/Other/new-pm-lto-defaults.ll               |  1 +
 llvm/test/Other/new-pm-thinlto-postlink-defaults.ll  |  1 +
 .../Other/new-pm-thinlto-postlink-pgo-defaults.ll    |  1 +
 .../new-pm-thinlto-postlink-samplepgo-defaults.ll    |  1 +
 llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll    |  7 -------
 7 files changed, 13 insertions(+), 11 deletions(-)

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
index 19f8b661843d93c..6f1e3dfa7ad3436 100644
--- a/llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll
+++ b/llvm/test/Transforms/PhaseOrdering/X86/pr68282.ll
@@ -24,14 +24,7 @@ define i32 @pr68282() {
 ; CHECK-LABEL: define i32 @pr68282(
 ; CHECK-SAME: ) local_unnamed_addr #[[ATTR0:[0-9]+]] {
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    br label [[FOR_BODY:%.*]]
-; CHECK:       for.cond.cleanup:
 ; CHECK-NEXT:    ret i32 -134744073
-; CHECK:       for.body:
-; CHECK-NEXT:    [[X_02:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[INC_7:%.*]], [[FOR_BODY]] ]
-; CHECK-NEXT:    [[INC_7]] = add nuw nsw i32 [[X_02]], 8
-; CHECK-NEXT:    [[EXITCOND_NOT_7:%.*]] = icmp eq i32 [[INC_7]], 1048576
-; CHECK-NEXT:    br i1 [[EXITCOND_NOT_7]], label [[FOR_COND_CLEANUP:%.*]], label [[FOR_BODY]]
 ;
 entry:
   br label %for.cond



More information about the llvm-commits mailing list