[PATCH] D107298: Fix ValueTracking computeConstantRange to use "may" instead of "always" semantics for llvm.assume
Chang Lin via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Aug 2 10:54:56 PDT 2021
clin1 created this revision.
clin1 added reviewers: fhahn, nikic.
Herald added a subscriber: hiraditya.
clin1 requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
ValueTracking should allow for value ranges that may satisfy llvm.assume, instead of restricting the ranges only to values that will always satisfy the condition.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D107298
Files:
llvm/lib/Analysis/ValueTracking.cpp
llvm/unittests/Analysis/ValueTrackingTest.cpp
Index: llvm/unittests/Analysis/ValueTrackingTest.cpp
===================================================================
--- llvm/unittests/Analysis/ValueTrackingTest.cpp
+++ llvm/unittests/Analysis/ValueTrackingTest.cpp
@@ -2073,7 +2073,7 @@
// * x.1 >= 5
// * x.2 < x.1
//
- // stride = [0, 5)
+ // stride = [0, -1)
auto M = parseModule(R"(
declare void @llvm.assume(i1)
@@ -2088,17 +2088,45 @@
Function *F = M->getFunction("test");
AssumptionCache AC(*F);
+ Value *X1 = &*(F->arg_begin());
Value *X2 = &*std::next(F->arg_begin());
Instruction *I = &findInstructionByName(F, "stride.plus.one");
- ConstantRange CR1 = computeConstantRange(X2, true, &AC, I);
- EXPECT_EQ(0, CR1.getLower());
- EXPECT_EQ(5, CR1.getUpper());
+ ConstantRange CR1 = computeConstantRange(X1, true, &AC, I);
+ ConstantRange CR2 = computeConstantRange(X2, true, &AC, I);
+
+ EXPECT_EQ(5, CR1.getLower());
+ EXPECT_EQ(0, CR1.getUpper());
+
+ EXPECT_EQ(0, CR2.getLower());
+ EXPECT_EQ(0xffffffff, CR2.getUpper());
// Check the depth cutoff results in a conservative result (full set) by
// passing Depth == MaxDepth == 6.
- ConstantRange CR2 = computeConstantRange(X2, true, &AC, I, 6);
- EXPECT_TRUE(CR2.isFullSet());
+ ConstantRange CR3 = computeConstantRange(X2, true, &AC, I, 6);
+ EXPECT_TRUE(CR3.isFullSet());
+ }
+ {
+ // Assumptions:
+ // * x.2 <= x.1
+ auto M = parseModule(R"(
+ declare void @llvm.assume(i1)
+
+ define i32 @test(i32 %x.1, i32 %x.2) {
+ %lt = icmp ule i32 %x.2, %x.1
+ call void @llvm.assume(i1 %lt)
+ %stride.plus.one = add nsw nuw i32 %x.1, 1
+ ret i32 %stride.plus.one
+ })");
+ Function *F = M->getFunction("test");
+
+ AssumptionCache AC(*F);
+ Value *X2 = &*std::next(F->arg_begin());
+
+ Instruction *I = &findInstructionByName(F, "stride.plus.one");
+ ConstantRange CR1 = computeConstantRange(X2, true, &AC, I);
+ // If we don't know the value of x.2, we don't know the value of x.1.
+ EXPECT_TRUE(CR1.isFullSet());
}
}
Index: llvm/lib/Analysis/ValueTracking.cpp
===================================================================
--- llvm/lib/Analysis/ValueTracking.cpp
+++ llvm/lib/Analysis/ValueTracking.cpp
@@ -7037,7 +7037,7 @@
ConstantRange RHS = computeConstantRange(Cmp->getOperand(1), UseInstrInfo,
AC, I, Depth + 1);
CR = CR.intersectWith(
- ConstantRange::makeSatisfyingICmpRegion(Cmp->getPredicate(), RHS));
+ ConstantRange::makeAllowedICmpRegion(Cmp->getPredicate(), RHS));
}
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D107298.363525.patch
Type: text/x-patch
Size: 2655 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20210802/51a35ecd/attachment.bin>
More information about the llvm-commits
mailing list