[llvm] [ConstraintElim] Bail out on non-dedicated exits when adding exiting conditions (PR #116627)
Yingwei Zheng via llvm-commits
llvm-commits at lists.llvm.org
Mon Nov 18 06:41:11 PST 2024
https://github.com/dtcxzyw updated https://github.com/llvm/llvm-project/pull/116627
>From 6d8dcab56e338aeaa36d4e7e1ef95f2984842592 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Mon, 18 Nov 2024 21:40:25 +0800
Subject: [PATCH 1/3] [ConstraintElim] Add pre-commit tests. NFC.
---
.../induction-condition-in-loop-exit.ll | 43 +++++++++++++++++++
1 file changed, 43 insertions(+)
diff --git a/llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit.ll b/llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit.ll
index 15e1d843726278..c6aba32e2b31af 100644
--- a/llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit.ll
+++ b/llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit.ll
@@ -763,3 +763,46 @@ exit.2:
%t.2 = icmp ult i32 %iv, %N
ret i1 %t.2
}
+
+define i1 @test_non_dedicated_exit(i16 %n) {
+; CHECK-LABEL: define i1 @test_non_dedicated_exit(
+; CHECK-SAME: i16 [[N:%.*]]) {
+; CHECK-NEXT: [[ENTRY:.*:]]
+; CHECK-NEXT: [[COND:%.*]] = icmp slt i16 [[N]], 1
+; CHECK-NEXT: br i1 [[COND]], label %[[EXIT:.*]], label %[[LOOP_PREHEADER:.*]]
+; CHECK: [[LOOP_PREHEADER]]:
+; CHECK-NEXT: [[SUB:%.*]] = add nsw i16 [[N]], -1
+; CHECK-NEXT: [[EXT:%.*]] = zext nneg i16 [[SUB]] to i32
+; CHECK-NEXT: br label %[[LOOP:.*]]
+; CHECK: [[LOOP]]:
+; CHECK-NEXT: [[INDVAR:%.*]] = phi i32 [ [[INDVAR_INC:%.*]], %[[LOOP_LATCH:.*]] ], [ 0, %[[LOOP_PREHEADER]] ]
+; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INDVAR]], [[EXT]]
+; CHECK-NEXT: br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP_LATCH]]
+; CHECK: [[LOOP_LATCH]]:
+; CHECK-NEXT: [[INDVAR_INC]] = add nuw nsw i32 [[INDVAR]], 1
+; CHECK-NEXT: br label %[[LOOP]]
+; CHECK: [[EXIT]]:
+; CHECK-NEXT: ret i1 true
+;
+entry:
+ %cond = icmp slt i16 %n, 1
+ br i1 %cond, label %exit, label %loop.preheader
+
+loop.preheader:
+ %sub = add nsw i16 %n, -1
+ %ext = zext nneg i16 %sub to i32
+ br label %loop
+
+loop:
+ %indvar = phi i32 [ %indvar.inc, %loop.latch ], [ 0, %loop.preheader ]
+ %exitcond = icmp eq i32 %indvar, %ext
+ br i1 %exitcond, label %exit, label %loop.latch
+
+loop.latch:
+ %indvar.inc = add nuw nsw i32 %indvar, 1
+ br label %loop
+
+exit:
+ %cmp = icmp sgt i16 %n, 0
+ ret i1 %cmp
+}
>From 2923c1153f95503ed57e249404d88f22b0967415 Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Mon, 18 Nov 2024 21:46:15 +0800
Subject: [PATCH 2/3] [ConstraintElim] Bail out non-dedicated exits when adding
exiting conditions
---
.../lib/Transforms/Scalar/ConstraintElimination.cpp | 13 ++++++++-----
.../induction-condition-in-loop-exit.ll | 3 ++-
2 files changed, 10 insertions(+), 6 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index d2e532d29d07b5..9118082b89363b 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -1034,9 +1034,9 @@ void State::addInfoForInductions(BasicBlock &BB) {
DTN, CmpInst::ICMP_SLT, PN, B,
ConditionTy(CmpInst::ICMP_SLE, StartValue, B)));
- // Try to add condition from header to the exit blocks. When exiting either
- // with EQ or NE in the header, we know that the induction value must be u<=
- // B, as other exits may only exit earlier.
+ // Try to add condition from header to the dedicated exit blocks. When exiting
+ // either with EQ or NE in the header, we know that the induction value must
+ // be u<= B, as other exits may only exit earlier.
assert(!StepOffset.isNegative() && "induction must be increasing");
assert((Pred == CmpInst::ICMP_EQ || Pred == CmpInst::ICMP_NE) &&
"unsupported predicate");
@@ -1044,8 +1044,11 @@ void State::addInfoForInductions(BasicBlock &BB) {
SmallVector<BasicBlock *> ExitBBs;
L->getExitBlocks(ExitBBs);
for (BasicBlock *EB : ExitBBs) {
- WorkList.emplace_back(FactOrCheck::getConditionFact(
- DT.getNode(EB), CmpInst::ICMP_ULE, A, B, Precond));
+ // bail out non-dedicated exits.
+ if (DT.dominates(PN, EB)) {
+ WorkList.emplace_back(FactOrCheck::getConditionFact(
+ DT.getNode(EB), CmpInst::ICMP_ULE, A, B, Precond));
+ }
}
}
diff --git a/llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit.ll b/llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit.ll
index c6aba32e2b31af..a04b06e1bf0a52 100644
--- a/llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit.ll
+++ b/llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit.ll
@@ -782,7 +782,8 @@ define i1 @test_non_dedicated_exit(i16 %n) {
; CHECK-NEXT: [[INDVAR_INC]] = add nuw nsw i32 [[INDVAR]], 1
; CHECK-NEXT: br label %[[LOOP]]
; CHECK: [[EXIT]]:
-; CHECK-NEXT: ret i1 true
+; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i16 [[N]], 0
+; CHECK-NEXT: ret i1 [[CMP]]
;
entry:
%cond = icmp slt i16 %n, 1
>From 3857ef4b8d7927f2dece3527c9ace3db3c1fc5fd Mon Sep 17 00:00:00 2001
From: Yingwei Zheng <dtcxzyw2333 at gmail.com>
Date: Mon, 18 Nov 2024 22:40:46 +0800
Subject: [PATCH 3/3] [ConstraintElim] Address reviewe comments. NFC.
---
llvm/lib/Transforms/Scalar/ConstraintElimination.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
index 9118082b89363b..64433cb9216c63 100644
--- a/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
+++ b/llvm/lib/Transforms/Scalar/ConstraintElimination.cpp
@@ -1044,8 +1044,8 @@ void State::addInfoForInductions(BasicBlock &BB) {
SmallVector<BasicBlock *> ExitBBs;
L->getExitBlocks(ExitBBs);
for (BasicBlock *EB : ExitBBs) {
- // bail out non-dedicated exits.
- if (DT.dominates(PN, EB)) {
+ // Bail out on non-dedicated exits.
+ if (DT.dominates(&BB, EB)) {
WorkList.emplace_back(FactOrCheck::getConditionFact(
DT.getNode(EB), CmpInst::ICMP_ULE, A, B, Precond));
}
More information about the llvm-commits
mailing list