[llvm] [CVP] Propagate constant range on icmp at use level (PR #73767)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 30 02:23:31 PST 2023
https://github.com/XChy updated https://github.com/llvm/llvm-project/pull/73767
>From 8ede35173d96d0dcbedc52751ac644bfb4561fe2 Mon Sep 17 00:00:00 2001
From: XChy <xxs_chy at outlook.com>
Date: Tue, 28 Nov 2023 19:55:00 +0800
Subject: [PATCH 1/2] [CVP] Precommit test for constant propagation of icmp
---
.../CorrelatedValuePropagation/icmp.ll | 102 ++++++++++++++++++
1 file changed, 102 insertions(+)
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll b/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll
index 101820a4c65f23b..ff9b5df666860c4 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll
@@ -1455,3 +1455,105 @@ entry:
%select = select i1 %cmp1, i1 %cmp2, i1 false
ret i1 %select
}
+
+define i1 @select_ternary_icmp1(i32 noundef %a) {
+; CHECK-LABEL: @select_ternary_icmp1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A:%.*]], 3
+; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 5
+; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[A]], 7
+; CHECK-NEXT: [[COND_V:%.*]] = select i1 [[CMP]], i1 true, i1 [[CMP2]]
+; CHECK-NEXT: ret i1 [[COND_V]]
+;
+entry:
+ %cmp = icmp slt i32 %a, 3
+ %cmp1 = icmp slt i32 %a, 5
+ %cmp2 = icmp slt i32 %a, 7
+ %cond.v = select i1 %cmp, i1 %cmp1, i1 %cmp2
+ ret i1 %cond.v
+}
+
+define i1 @select_ternary_icmp2(i32 noundef %a) {
+; CHECK-LABEL: @select_ternary_icmp2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A:%.*]], 5
+; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 7
+; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[A]], 3
+; CHECK-NEXT: [[COND_V:%.*]] = select i1 [[CMP]], i1 true, i1 false
+; CHECK-NEXT: ret i1 [[COND_V]]
+;
+entry:
+ %cmp = icmp slt i32 %a, 5
+ %cmp1 = icmp slt i32 %a, 7
+ %cmp2 = icmp slt i32 %a, 3
+ %cond.v = select i1 %cmp, i1 %cmp1, i1 %cmp2
+ ret i1 %cond.v
+}
+
+define i1 @select_ternary_icmp3(i32 noundef %a) {
+; CHECK-LABEL: @select_ternary_icmp3(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A:%.*]], 7
+; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 3
+; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[A]], 5
+; CHECK-NEXT: [[COND_V:%.*]] = select i1 [[CMP]], i1 [[CMP1]], i1 false
+; CHECK-NEXT: ret i1 [[COND_V]]
+;
+entry:
+ %cmp = icmp slt i32 %a, 7
+ %cmp1 = icmp slt i32 %a, 3
+ %cmp2 = icmp slt i32 %a, 5
+ %cond.v = select i1 %cmp, i1 %cmp1, i1 %cmp2
+ ret i1 %cond.v
+}
+
+define i1 @select_ternary_icmp3_reverse(i32 noundef %a) {
+; CHECK-LABEL: @select_ternary_icmp3_reverse(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A:%.*]], 3
+; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[A]], 5
+; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i32 [[A]], 7
+; CHECK-NEXT: [[COND_V:%.*]] = select i1 [[CMP]], i1 false, i1 [[CMP2]]
+; CHECK-NEXT: ret i1 [[COND_V]]
+;
+entry:
+ %cmp = icmp slt i32 %a, 3
+ %cmp1 = icmp sge i32 %a, 5
+ %cmp2 = icmp sge i32 %a, 7
+ %cond.v = select i1 %cmp, i1 %cmp1, i1 %cmp2
+ ret i1 %cond.v
+}
+
+define i1 @select_ternary_icmp_fail1(i32 noundef %a, i32 noundef %b) {
+; CHECK-LABEL: @select_ternary_icmp_fail1(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A:%.*]], 3
+; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[B:%.*]], 5
+; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[B]], 7
+; CHECK-NEXT: [[COND_V:%.*]] = select i1 [[CMP]], i1 [[CMP1]], i1 [[CMP2]]
+; CHECK-NEXT: ret i1 [[COND_V]]
+;
+entry:
+ %cmp = icmp slt i32 %a, 3
+ %cmp1 = icmp slt i32 %b, 5
+ %cmp2 = icmp slt i32 %b, 7
+ %cond.v = select i1 %cmp, i1 %cmp1, i1 %cmp2
+ ret i1 %cond.v
+}
+
+define i1 @select_ternary_icmp_fail2(i32 noundef %a, i32 noundef %b) {
+; CHECK-LABEL: @select_ternary_icmp_fail2(
+; CHECK-NEXT: entry:
+; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A:%.*]], 3
+; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 5, [[B:%.*]]
+; CHECK-NEXT: [[CMP2:%.*]] = icmp sge i32 7, [[B]]
+; CHECK-NEXT: [[COND_V:%.*]] = select i1 [[CMP]], i1 [[CMP1]], i1 [[CMP2]]
+; CHECK-NEXT: ret i1 [[COND_V]]
+;
+entry:
+ %cmp = icmp slt i32 %a, 3
+ %cmp1 = icmp sge i32 5, %b
+ %cmp2 = icmp sge i32 7, %b
+ %cond.v = select i1 %cmp, i1 %cmp1, i1 %cmp2
+ ret i1 %cond.v
+}
>From 8768ee9110388e4ca0c4945628a315cd0cd78749 Mon Sep 17 00:00:00 2001
From: XChy <xxs_chy at outlook.com>
Date: Sun, 26 Nov 2023 16:22:29 +0800
Subject: [PATCH 2/2] [CVP] Propagate constant range on icmp at use level
---
llvm/include/llvm/Analysis/LazyValueInfo.h | 11 ++++++
llvm/lib/Analysis/LazyValueInfo.cpp | 26 +++++++++++++
.../Scalar/CorrelatedValuePropagation.cpp | 38 ++++++++++++-------
.../CorrelatedValuePropagation/icmp.ll | 5 ---
.../CorrelatedValuePropagation/sdiv.ll | 14 +++----
.../CorrelatedValuePropagation/srem.ll | 14 +++----
.../CorrelatedValuePropagation/sub.ll | 12 +++---
7 files changed, 77 insertions(+), 43 deletions(-)
diff --git a/llvm/include/llvm/Analysis/LazyValueInfo.h b/llvm/include/llvm/Analysis/LazyValueInfo.h
index ead9f5f0225cd09..0ea9e36eeb85432 100644
--- a/llvm/include/llvm/Analysis/LazyValueInfo.h
+++ b/llvm/include/llvm/Analysis/LazyValueInfo.h
@@ -87,6 +87,17 @@ namespace llvm {
Tristate getPredicateAt(unsigned Pred, Value *LHS, Value *RHS,
Instruction *CxtI, bool UseBlockValue);
+ /// Determine whether the specified value comparison is known to be true
+ /// or false at the specified use-site.
+ /// \p Pred is a CmpInst predicate.
+ Tristate getPredicateAtUse(unsigned P, const Use &LHS, const Use &RHS);
+
+ // \p LHSRange is the range of LHS we get at the specified use-site.
+ // \p RHSRange serves as the same purpose too.
+ Tristate getPredicateAtUse(unsigned P, const Use &LHS, const Use &RHS,
+ ConstantRange &LHSRange,
+ ConstantRange &RHSRange);
+
/// Determine whether the specified value is known to be a constant at the
/// specified instruction. Return null if not.
Constant *getConstant(Value *V, Instruction *CxtI);
diff --git a/llvm/lib/Analysis/LazyValueInfo.cpp b/llvm/lib/Analysis/LazyValueInfo.cpp
index 3c2f26e9242137b..04e17fe116cec7b 100644
--- a/llvm/lib/Analysis/LazyValueInfo.cpp
+++ b/llvm/lib/Analysis/LazyValueInfo.cpp
@@ -2008,6 +2008,32 @@ LazyValueInfo::Tristate LazyValueInfo::getPredicateAt(unsigned P, Value *LHS,
return LazyValueInfo::Unknown;
}
+LazyValueInfo::Tristate
+LazyValueInfo::getPredicateAtUse(unsigned P, const Use &LHS, const Use &RHS) {
+ uint32_t BitWidth = LHS.get()->getType()->getScalarSizeInBits();
+ ConstantRange LHSRange = ConstantRange::getFull(BitWidth);
+ ConstantRange RHSRange = ConstantRange::getFull(BitWidth);
+ return getPredicateAtUse(P, LHS, RHS, LHSRange, RHSRange);
+}
+
+// TODO: Support float-point constant.
+LazyValueInfo::Tristate
+LazyValueInfo::getPredicateAtUse(unsigned P, const Use &LHS, const Use &RHS,
+ ConstantRange &LHSRange,
+ ConstantRange &RHSRange) {
+ CmpInst::Predicate Pred = (CmpInst::Predicate)P;
+ LHSRange = getConstantRangeAtUse(LHS);
+ RHSRange = getConstantRangeAtUse(RHS);
+
+ if (LHSRange.icmp(Pred, RHSRange))
+ return LazyValueInfo::True;
+
+ if (LHSRange.icmp(CmpInst::getInversePredicate(Pred), RHSRange))
+ return LazyValueInfo::False;
+
+ return LazyValueInfo::Unknown;
+}
+
void LazyValueInfo::threadEdge(BasicBlock *PredBB, BasicBlock *OldSucc,
BasicBlock *NewSucc) {
if (auto *Impl = getImpl())
diff --git a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
index 1bdc441d18ea65e..3b53f4bc06e0dc4 100644
--- a/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
+++ b/llvm/lib/Transforms/Scalar/CorrelatedValuePropagation.cpp
@@ -263,7 +263,9 @@ static bool processPHI(PHINode *P, LazyValueInfo *LVI, DominatorTree *DT,
return Changed;
}
-static bool processICmp(ICmpInst *Cmp, LazyValueInfo *LVI) {
+static bool processICmp(ICmpInst *Cmp, LazyValueInfo *LVI,
+ const ConstantRange &LHSRange,
+ const ConstantRange &RHSRange) {
if (!CanonicalizeICmpPredicatesToUnsigned)
return false;
@@ -276,10 +278,8 @@ static bool processICmp(ICmpInst *Cmp, LazyValueInfo *LVI) {
return false;
ICmpInst::Predicate UnsignedPred =
- ConstantRange::getEquivalentPredWithFlippedSignedness(
- Cmp->getPredicate(),
- LVI->getConstantRangeAtUse(Cmp->getOperandUse(0)),
- LVI->getConstantRangeAtUse(Cmp->getOperandUse(1)));
+ ConstantRange::getEquivalentPredWithFlippedSignedness(Cmp->getPredicate(),
+ LHSRange, RHSRange);
if (UnsignedPred == ICmpInst::Predicate::BAD_ICMP_PREDICATE)
return false;
@@ -294,12 +294,20 @@ static bool processICmp(ICmpInst *Cmp, LazyValueInfo *LVI) {
/// information is sufficient to prove this comparison. Even for local
/// conditions, this can sometimes prove conditions instcombine can't by
/// exploiting range information.
-static bool constantFoldCmp(CmpInst *Cmp, LazyValueInfo *LVI) {
- Value *Op0 = Cmp->getOperand(0);
- Value *Op1 = Cmp->getOperand(1);
- LazyValueInfo::Tristate Result =
- LVI->getPredicateAt(Cmp->getPredicate(), Op0, Op1, Cmp,
- /*UseBlockValue=*/true);
+/// LHSRange and RHSRange are calculated in constantFoldCmp.
+static bool constantFoldCmp(CmpInst *Cmp, LazyValueInfo *LVI,
+ ConstantRange &LHSRange, ConstantRange &RHSRange) {
+ Use &Op0 = Cmp->getOperandUse(0);
+ Use &Op1 = Cmp->getOperandUse(1);
+
+ LazyValueInfo::Tristate Result;
+ // NOTE: Now getPredicateAtUse only supports integer type.
+ if (Op0->getType()->isIntegerTy())
+ Result = LVI->getPredicateAtUse(Cmp->getPredicate(), Op0, Op1, LHSRange,
+ RHSRange);
+ else
+ Result = LVI->getPredicateAt(Cmp->getPredicate(), Op0, Op1, Cmp,
+ /*UseBlockValue=*/true);
if (Result == LazyValueInfo::Unknown)
return false;
@@ -312,11 +320,15 @@ static bool constantFoldCmp(CmpInst *Cmp, LazyValueInfo *LVI) {
}
static bool processCmp(CmpInst *Cmp, LazyValueInfo *LVI) {
- if (constantFoldCmp(Cmp, LVI))
+ uint32_t BitWidth = Cmp->getOperand(0)->getType()->getScalarSizeInBits();
+ auto LHSRange = ConstantRange::getFull(BitWidth);
+ auto RHSRange = ConstantRange::getFull(BitWidth);
+
+ if (constantFoldCmp(Cmp, LVI, LHSRange, RHSRange))
return true;
if (auto *ICmp = dyn_cast<ICmpInst>(Cmp))
- if (processICmp(ICmp, LVI))
+ if (processICmp(ICmp, LVI, LHSRange, RHSRange))
return true;
return false;
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll b/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll
index ff9b5df666860c4..cf1e4aa4313fd2f 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/icmp.ll
@@ -1460,7 +1460,6 @@ define i1 @select_ternary_icmp1(i32 noundef %a) {
; CHECK-LABEL: @select_ternary_icmp1(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A:%.*]], 3
-; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 5
; CHECK-NEXT: [[CMP2:%.*]] = icmp ult i32 [[A]], 7
; CHECK-NEXT: [[COND_V:%.*]] = select i1 [[CMP]], i1 true, i1 [[CMP2]]
; CHECK-NEXT: ret i1 [[COND_V]]
@@ -1477,8 +1476,6 @@ define i1 @select_ternary_icmp2(i32 noundef %a) {
; CHECK-LABEL: @select_ternary_icmp2(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A:%.*]], 5
-; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 7
-; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[A]], 3
; CHECK-NEXT: [[COND_V:%.*]] = select i1 [[CMP]], i1 true, i1 false
; CHECK-NEXT: ret i1 [[COND_V]]
;
@@ -1495,7 +1492,6 @@ define i1 @select_ternary_icmp3(i32 noundef %a) {
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A:%.*]], 7
; CHECK-NEXT: [[CMP1:%.*]] = icmp slt i32 [[A]], 3
-; CHECK-NEXT: [[CMP2:%.*]] = icmp slt i32 [[A]], 5
; CHECK-NEXT: [[COND_V:%.*]] = select i1 [[CMP]], i1 [[CMP1]], i1 false
; CHECK-NEXT: ret i1 [[COND_V]]
;
@@ -1511,7 +1507,6 @@ define i1 @select_ternary_icmp3_reverse(i32 noundef %a) {
; CHECK-LABEL: @select_ternary_icmp3_reverse(
; CHECK-NEXT: entry:
; CHECK-NEXT: [[CMP:%.*]] = icmp slt i32 [[A:%.*]], 3
-; CHECK-NEXT: [[CMP1:%.*]] = icmp sge i32 [[A]], 5
; CHECK-NEXT: [[CMP2:%.*]] = icmp uge i32 [[A]], 7
; CHECK-NEXT: [[COND_V:%.*]] = select i1 [[CMP]], i1 false, i1 [[CMP2]]
; CHECK-NEXT: ret i1 [[COND_V]]
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/sdiv.ll b/llvm/test/Transforms/CorrelatedValuePropagation/sdiv.ll
index d88fe358a0aa2cd..f97080d3bed80f4 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/sdiv.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/sdiv.ll
@@ -482,15 +482,11 @@ entry:
define i9 @test18_i9_i9(i9 %x, i9 %y) {
; CHECK-LABEL: @test18_i9_i9(
; CHECK-NEXT: entry:
-; CHECK-NEXT: [[C0:%.*]] = icmp sle i9 [[X:%.*]], 255
-; CHECK-NEXT: call void @llvm.assume(i1 [[C0]])
-; CHECK-NEXT: [[C1:%.*]] = icmp sge i9 [[X]], -256
-; CHECK-NEXT: call void @llvm.assume(i1 [[C1]])
-; CHECK-NEXT: [[C2:%.*]] = icmp sle i9 [[Y:%.*]], 255
-; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
-; CHECK-NEXT: [[C3:%.*]] = icmp sge i9 [[Y]], -256
-; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: [[DIV:%.*]] = sdiv i9 [[X]], [[Y]]
+; CHECK-NEXT: call void @llvm.assume(i1 true)
+; CHECK-NEXT: call void @llvm.assume(i1 true)
+; CHECK-NEXT: call void @llvm.assume(i1 true)
+; CHECK-NEXT: call void @llvm.assume(i1 true)
+; CHECK-NEXT: [[DIV:%.*]] = sdiv i9 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: ret i9 [[DIV]]
;
entry:
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll b/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll
index bc2b0aec269b9dc..bfd94e7868fcf0f 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/srem.ll
@@ -395,15 +395,11 @@ entry:
define i9 @test18_i9_i9(i9 %x, i9 %y) {
; CHECK-LABEL: @test18_i9_i9(
; CHECK-NEXT: entry:
-; CHECK-NEXT: [[C0:%.*]] = icmp sle i9 [[X:%.*]], 255
-; CHECK-NEXT: call void @llvm.assume(i1 [[C0]])
-; CHECK-NEXT: [[C1:%.*]] = icmp sge i9 [[X]], -256
-; CHECK-NEXT: call void @llvm.assume(i1 [[C1]])
-; CHECK-NEXT: [[C2:%.*]] = icmp sle i9 [[Y:%.*]], 255
-; CHECK-NEXT: call void @llvm.assume(i1 [[C2]])
-; CHECK-NEXT: [[C3:%.*]] = icmp sge i9 [[Y]], -256
-; CHECK-NEXT: call void @llvm.assume(i1 [[C3]])
-; CHECK-NEXT: [[DIV:%.*]] = srem i9 [[X]], [[Y]]
+; CHECK-NEXT: call void @llvm.assume(i1 true)
+; CHECK-NEXT: call void @llvm.assume(i1 true)
+; CHECK-NEXT: call void @llvm.assume(i1 true)
+; CHECK-NEXT: call void @llvm.assume(i1 true)
+; CHECK-NEXT: [[DIV:%.*]] = srem i9 [[X:%.*]], [[Y:%.*]]
; CHECK-NEXT: ret i9 [[DIV]]
;
entry:
diff --git a/llvm/test/Transforms/CorrelatedValuePropagation/sub.ll b/llvm/test/Transforms/CorrelatedValuePropagation/sub.ll
index 8b67574c06cd953..98b0df8585268c4 100644
--- a/llvm/test/Transforms/CorrelatedValuePropagation/sub.ll
+++ b/llvm/test/Transforms/CorrelatedValuePropagation/sub.ll
@@ -50,10 +50,9 @@ exit:
define void @test2(i32 %a) {
; CHECK-LABEL: @test2(
; CHECK-NEXT: entry:
-; CHECK-NEXT: [[CMP:%.*]] = icmp ugt i32 [[A:%.*]], -1
-; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
+; CHECK-NEXT: br i1 false, label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
-; CHECK-NEXT: [[SUB:%.*]] = sub nuw nsw i32 [[A]], 1
+; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A:%.*]], 1
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: ret void
@@ -119,10 +118,9 @@ exit:
define void @test5(i32 %a) {
; CHECK-LABEL: @test5(
; CHECK-NEXT: entry:
-; CHECK-NEXT: [[CMP:%.*]] = icmp sle i32 [[A:%.*]], 2147483647
-; CHECK-NEXT: br i1 [[CMP]], label [[BB:%.*]], label [[EXIT:%.*]]
+; CHECK-NEXT: br i1 true, label [[BB:%.*]], label [[EXIT:%.*]]
; CHECK: bb:
-; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A]], 1
+; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A:%.*]], 1
; CHECK-NEXT: br label [[EXIT]]
; CHECK: exit:
; CHECK-NEXT: ret void
@@ -300,7 +298,7 @@ exit:
@limit = external global i32
define i32 @test11(ptr %p, i32 %i) {
; CHECK-LABEL: @test11(
-; CHECK-NEXT: [[LIMIT:%.*]] = load i32, ptr [[P:%.*]], !range !0
+; CHECK-NEXT: [[LIMIT:%.*]] = load i32, ptr [[P:%.*]], align 4, !range [[RNG0:![0-9]+]]
; CHECK-NEXT: [[WITHIN_1:%.*]] = icmp slt i32 [[LIMIT]], [[I:%.*]]
; CHECK-NEXT: [[I_MINUS_7:%.*]] = add i32 [[I]], -7
; CHECK-NEXT: [[WITHIN_2:%.*]] = icmp slt i32 [[LIMIT]], [[I_MINUS_7]]
More information about the llvm-commits
mailing list