[PATCH] Make ScalarEvolution less aggressive with respect to no-wrap flags.
Sanjoy Das
sanjoy at playingwithpointers.com
Wed Jan 21 16:50:29 PST 2015
REPOSITORY
rL LLVM
http://reviews.llvm.org/D7081
Files:
llvm/trunk/lib/Analysis/ScalarEvolution.cpp
llvm/trunk/test/Analysis/ScalarEvolution/nw-sub-is-not-nw-add.ll
Index: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
===================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp
@@ -3154,8 +3154,9 @@
if (LHS == RHS)
return getConstant(LHS->getType(), 0);
- // X - Y --> X + -Y
- return getAddExpr(LHS, getNegativeSCEV(RHS), Flags);
+ // X - Y --> X + -Y.
+ // X -(nsw || nuw) Y --> X + -Y.
+ return getAddExpr(LHS, getNegativeSCEV(RHS));
}
/// getTruncateOrZeroExtend - Return a SCEV corresponding to a conversion of the
@@ -3461,12 +3462,10 @@
if (isKnownPositive(getMinusSCEV(getSCEV(GEP), Ptr)))
Flags = setFlags(Flags, SCEV::FlagNUW);
}
- } else if (const SubOperator *OBO =
- dyn_cast<SubOperator>(BEValueV)) {
- if (OBO->hasNoUnsignedWrap())
- Flags = setFlags(Flags, SCEV::FlagNUW);
- if (OBO->hasNoSignedWrap())
- Flags = setFlags(Flags, SCEV::FlagNSW);
+
+ // We cannot transfer nuw and nsw flags from subtraction
+ // operations -- sub nuw X, Y is not the same as add nuw X, -Y
+ // for instance.
}
const SCEV *StartVal = getSCEV(StartValueV);
Index: llvm/trunk/test/Analysis/ScalarEvolution/nw-sub-is-not-nw-add.ll
===================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/nw-sub-is-not-nw-add.ll
+++ llvm/trunk/test/Analysis/ScalarEvolution/nw-sub-is-not-nw-add.ll
@@ -0,0 +1,41 @@
+; RUN: opt -S -indvars < %s | FileCheck %s
+
+; Check that SCEV does not assume sub nuw X Y == add nuw X, -Y
+define void @f(i32* %loc) {
+; CHECK-LABEL: @f
+ entry:
+ br label %loop
+
+ loop:
+ %idx = phi i32 [ 6, %entry ], [ %idx.dec, %loop ]
+ store i32 %idx, i32* %loc
+ %idx.dec = sub nuw i32 %idx, 1
+ %cond = icmp uge i32 %idx.dec, 5
+ br i1 %cond, label %loop, label %exit
+; CHECK-NOT: br i1 true, label %loop, label %exit
+
+ exit:
+ ret void
+}
+
+declare void @use_i1(i1)
+
+; Check that SCEV does not assume sub nsw X Y == add nsw X, -Y
+define void @g(i32 %lim) {
+; CHECK-LABEL: @g
+ entry:
+ br label %loop
+
+ loop:
+ %idx = phi i32 [ -1, %entry ], [ %idx.dec, %loop ]
+ %t = icmp sgt i32 %idx, 0
+; CHECK-NOT: call void @use_i1(i1 false)
+; CHECK: call void @use_i1(i1 %t)
+ call void @use_i1(i1 %t)
+ %idx.dec = sub nsw i32 %idx, -2147483648
+ %cond = icmp eq i32 %idx.dec, %lim
+ br i1 %cond, label %loop, label %exit
+
+ exit:
+ ret void
+}
EMAIL PREFERENCES
http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D7081.18571.patch
Type: text/x-patch
Size: 2622 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150122/3ece1770/attachment.bin>
More information about the llvm-commits
mailing list