Another SCEV issue from PR2607; essentially the same issue, but this
authorEli Friedman <eli.friedman@gmail.com>
Wed, 30 Jul 2008 04:36:32 +0000 (04:36 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Wed, 30 Jul 2008 04:36:32 +0000 (04:36 +0000)
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

lib/Analysis/ScalarEvolution.cpp
test/Analysis/ScalarEvolution/2008-07-29-SMinExpr.ll [new file with mode: 0644]

index 14c1389b43435b83b943f13ec86564d936cf0987..bf6bc0b5dc288c2edfc43b3413cd81a66e1e9ce3 100644 (file)
@@ -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 (file)
index 0000000..5947912
--- /dev/null
@@ -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
+}