[PATCH] D67177: [SCEV] Support SCEVUMinExpr in getRangeRef.
Florian Hahn via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 4 08:14:37 PDT 2019
fhahn created this revision.
fhahn added reviewers: sanjoy.google, efriedma, reames, nikic.
Herald added subscribers: javed.absar, hiraditya.
Herald added a project: LLVM.
This patch adds support for SCEVUMinExpr to getRangeRef,
similar to the support for SCEVUMaxExpr.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D67177
Files:
llvm/lib/Analysis/ScalarEvolution.cpp
llvm/unittests/Analysis/ScalarEvolutionTest.cpp
Index: llvm/unittests/Analysis/ScalarEvolutionTest.cpp
===================================================================
--- llvm/unittests/Analysis/ScalarEvolutionTest.cpp
+++ llvm/unittests/Analysis/ScalarEvolutionTest.cpp
@@ -1757,8 +1757,7 @@
std::unique_ptr<Module> M = parseAssemblyString(
"define void @foo(i32 %i) { "
"entry: "
- " %cmp3 = icmp ult i32 %i, 16 "
- " br i1 %cmp3, label %loop.body, label %exit "
+ " br label %loop.body "
"loop.body: "
" %iv = phi i32 [ %iv.next, %loop.body ], [ %i, %entry ] "
" %iv.next = add nsw i32 %iv, 1 "
@@ -1790,4 +1789,41 @@
cast<SCEVAddRecExpr>(ScevIV)->getStepRecurrence(SE));
});
}
+
+TEST_F(ScalarEvolutionsTest, SCEVgetRanges) {
+ LLVMContext C;
+ SMDiagnostic Err;
+ std::unique_ptr<Module> M = parseAssemblyString(
+ "define void @foo(i32 %i) { "
+ "entry: "
+ " br label %loop.body "
+ "loop.body: "
+ " %iv = phi i32 [ %iv.next, %loop.body ], [ 0, %entry ] "
+ " %iv.next = add nsw i32 %iv, 1 "
+ " %cmp = icmp eq i32 %iv.next, 16 "
+ " br i1 %cmp, label %exit, label %loop.body "
+ "exit: "
+ " ret void "
+ "} ",
+ Err, C);
+
+ ASSERT_TRUE(M && "Could not parse module?");
+ ASSERT_TRUE(!verifyModule(*M) && "Must have been well formed!");
+
+ runWithSE(*M, "foo", [](Function &F, LoopInfo &LI, ScalarEvolution &SE) {
+ auto *ScevIV = SE.getSCEV(getInstructionByName(F, "iv")); // {0,+,1}
+ auto *ScevI = SE.getSCEV(getArgByName(F, "i"));
+ EXPECT_EQ(SE.getUnsignedRange(ScevIV).getLower(), 0);
+ EXPECT_EQ(SE.getUnsignedRange(ScevIV).getUpper(), 16);
+
+ auto *Add = SE.getAddExpr(ScevI, ScevIV);
+ ValueToSCEVMapTy RewriteMap;
+ RewriteMap[cast<SCEVUnknown>(ScevI)->getValue()] =
+ SE.getUMinExpr(ScevI, SE.getConstant(ScevI->getType(), 17));
+ auto *AddWithUMin = SCEVParameterRewriter::rewrite(Add, SE, RewriteMap);
+ EXPECT_EQ(SE.getUnsignedRange(AddWithUMin).getLower(), 0);
+ EXPECT_EQ(SE.getUnsignedRange(AddWithUMin).getUpper(), 33);
+ });
+}
+
} // end namespace llvm
Index: llvm/lib/Analysis/ScalarEvolution.cpp
===================================================================
--- llvm/lib/Analysis/ScalarEvolution.cpp
+++ llvm/lib/Analysis/ScalarEvolution.cpp
@@ -5593,6 +5593,14 @@
ConservativeResult.intersectWith(X, RangeType));
}
+ if (const SCEVUMinExpr *UMin = dyn_cast<SCEVUMinExpr>(S)) {
+ ConstantRange X = getRangeRef(UMin->getOperand(0), SignHint);
+ for (unsigned i = 1, e = UMin->getNumOperands(); i != e; ++i)
+ X = X.umin(getRangeRef(UMin->getOperand(i), SignHint));
+ return setRange(UMin, SignHint,
+ ConservativeResult.intersectWith(X, RangeType));
+ }
+
if (const SCEVUDivExpr *UDiv = dyn_cast<SCEVUDivExpr>(S)) {
ConstantRange X = getRangeRef(UDiv->getLHS(), SignHint);
ConstantRange Y = getRangeRef(UDiv->getRHS(), SignHint);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D67177.218711.patch
Type: text/x-patch
Size: 2988 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190904/32fad4a2/attachment.bin>
More information about the llvm-commits
mailing list