aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2008-07-30 04:36:32 +0000
committerEli Friedman <eli.friedman@gmail.com>2008-07-30 04:36:32 +0000
commit1fbffe0cef92ee284f44cfef3ce0db7ec7d86f18 (patch)
tree82b806bd65764d77de7439d195f9c321aa6f731b
parent9382b9310f008a3347e565d76aadda6a97351de9 (diff)
Another SCEV issue from PR2607; essentially the same issue, but this
time applying to the implicit comparison in smin expressions. The correct way to transform an inequality into the opposite inequality, either signed or unsigned, is with a not expression. I looked through the SCEV code, and I don't think there are any more occurrences of this issue. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54194 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Analysis/ScalarEvolution.cpp8
-rw-r--r--test/Analysis/ScalarEvolution/2008-07-29-SMinExpr.ll24
2 files changed, 28 insertions, 4 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp
index 14c1389b43..bf6bc0b5dc 100644
--- a/lib/Analysis/ScalarEvolution.cpp
+++ b/lib/Analysis/ScalarEvolution.cpp
@@ -1789,10 +1789,10 @@ SCEVHandle ScalarEvolutionsImpl::createSCEV(Value *V) {
if (LHS == U->getOperand(1) && RHS == U->getOperand(2))
return SE.getSMaxExpr(getSCEV(LHS), getSCEV(RHS));
else if (LHS == U->getOperand(2) && RHS == U->getOperand(1))
- // -smax(-x, -y) == smin(x, y).
- return SE.getNegativeSCEV(SE.getSMaxExpr(
- SE.getNegativeSCEV(getSCEV(LHS)),
- SE.getNegativeSCEV(getSCEV(RHS))));
+ // ~smax(~x, ~y) == smin(x, y).
+ return SE.getNotSCEV(SE.getSMaxExpr(
+ SE.getNotSCEV(getSCEV(LHS)),
+ SE.getNotSCEV(getSCEV(RHS))));
break;
case ICmpInst::ICMP_ULT:
case ICmpInst::ICMP_ULE:
diff --git a/test/Analysis/ScalarEvolution/2008-07-29-SMinExpr.ll b/test/Analysis/ScalarEvolution/2008-07-29-SMinExpr.ll
new file mode 100644
index 0000000000..5947912caf
--- /dev/null
+++ b/test/Analysis/ScalarEvolution/2008-07-29-SMinExpr.ll
@@ -0,0 +1,24 @@
+; RUN: llvm-as < %s | opt -analyze -scalar-evolution -disable-output \
+; RUN: -scalar-evolution-max-iterations=0 | \
+; RUN: grep -F "( -2147483632 + ( 2147483632 smax ( -1 + ( -1 * %x)) smax ( -1 + ( -1 * %y)))) iterations"
+; PR2607
+
+define i32 @b(i32 %x, i32 %y) {
+entry:
+ %cmp2 = icmp slt i32 %y, %x
+ %cond3 = select i1 %cmp2, i32 %y, i32 %x
+ %cmp54 = icmp slt i32 %cond3, -2147483632
+ br i1 %cmp54, label %forinc, label %afterfor
+
+forinc: ; preds = %forinc, %entry
+ %j.01 = phi i32 [ %dec, %forinc ], [ -2147483632, %entry ]
+ %dec = add i32 %j.01, -1
+ %cmp = icmp slt i32 %y, %x
+ %cond = select i1 %cmp, i32 %y, i32 %x
+ %cmp5 = icmp sgt i32 %dec, %cond
+ br i1 %cmp5, label %forinc, label %afterfor
+
+afterfor: ; preds = %forinc, %entry
+ %j.0.lcssa = phi i32 [ -2147483632, %entry ], [ %dec, %forinc ]
+ ret i32 %j.0.lcssa
+}