In which I discover that zero+zero is zero, d'oh!
authorDuncan Sands <baldrick@free.fr>
Tue, 25 Jan 2011 15:14:15 +0000 (15:14 +0000)
committerDuncan Sands <baldrick@free.fr>
Tue, 25 Jan 2011 15:14:15 +0000 (15:14 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124188 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ValueTracking.cpp
test/Transforms/InstSimplify/2011-01-18-Compare.ll

index 98b4489cba73368e7ef5caad131ec80fe6ffba02..5320fa0768db86f1387c2c7eb5f5f32c956ad4c7 100644 (file)
@@ -740,10 +740,10 @@ bool llvm::isKnownNonZero(Value *V, const TargetData *TD, unsigned Depth) {
     ComputeSignBit(Y, YKnownNonNegative, YKnownNegative, TD, Depth);
 
     // If X and Y are both non-negative (as signed values) then their sum is not
-    // zero.
+    // zero unless both X and Y are zero.
     if (XKnownNonNegative && YKnownNonNegative)
-      return false;
-//      return true;
+      if (isKnownNonZero(X, TD, Depth) || isKnownNonZero(Y, TD, Depth))
+        return true;
 
     // If X and Y are both negative (as signed values) then their sum is not
     // zero unless both X and Y equal INT_MIN.
index 705f35424988deb780fea8dae8bebf3013adce34..c905c443d2e1543ba960c9ba818a0ad8f351694b 100644 (file)
@@ -61,11 +61,14 @@ define i1 @sext3() {
 }
 
 define i1 @add(i32 %x, i32 %y) {
+; CHECK: @add
   %l = lshr i32 %x, 1
-  %r = lshr i32 %y, 1
+  %q = lshr i32 %y, 1
+  %r = or i32 %q, 1
   %s = add i32 %l, %r
   %c = icmp eq i32 %s, 0
   ret i1 %c
+; CHECK: ret i1 false
 }
 
 define i1 @add2(i8 %x, i8 %y) {
@@ -78,6 +81,16 @@ define i1 @add2(i8 %x, i8 %y) {
 ; CHECK: ret i1 false
 }
 
+define i1 @add3(i8 %x, i8 %y) {
+; CHECK: @add3
+  %l = zext i8 %x to i32
+  %r = zext i8 %y to i32
+  %s = add i32 %l, %r
+  %c = icmp eq i32 %s, 0
+  ret i1 %c
+; CHECK: ret i1 %c
+}
+
 define i1 @addpowtwo(i32 %x, i32 %y) {
 ; CHECK: @addpowtwo
   %l = lshr i32 %x, 1