[llvm-commits] [llvm] r155818 - in /llvm/trunk: lib/Analysis/ValueTracking.cpp test/Transforms/InstCombine/2012-04-30-SRem.ll

Duncan Sands baldrick at free.fr
Mon Apr 30 04:56:58 PDT 2012


Author: baldrick
Date: Mon Apr 30 06:56:58 2012
New Revision: 155818

URL: http://llvm.org/viewvc/llvm-project?rev=155818&view=rev
Log:
Just mark the sign bit as known zero, rather than any other irrelevant bits
known zero in the LHS.  Fixes PR12541.

Added:
    llvm/trunk/test/Transforms/InstCombine/2012-04-30-SRem.ll
Modified:
    llvm/trunk/lib/Analysis/ValueTracking.cpp

Modified: llvm/trunk/lib/Analysis/ValueTracking.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ValueTracking.cpp?rev=155818&r1=155817&r2=155818&view=diff
==============================================================================
--- llvm/trunk/lib/Analysis/ValueTracking.cpp (original)
+++ llvm/trunk/lib/Analysis/ValueTracking.cpp Mon Apr 30 06:56:58 2012
@@ -564,7 +564,7 @@
                         Depth+1);
       // If it's known zero, our sign bit is also zero.
       if (LHSKnownZero.isNegative())
-        KnownZero |= LHSKnownZero;
+        KnownZero.setBit(BitWidth - 1);
     }
 
     break;

Added: llvm/trunk/test/Transforms/InstCombine/2012-04-30-SRem.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Transforms/InstCombine/2012-04-30-SRem.ll?rev=155818&view=auto
==============================================================================
--- llvm/trunk/test/Transforms/InstCombine/2012-04-30-SRem.ll (added)
+++ llvm/trunk/test/Transforms/InstCombine/2012-04-30-SRem.ll Mon Apr 30 06:56:58 2012
@@ -0,0 +1,12 @@
+; RUN: opt -instcombine -S < %s | FileCheck %s
+; PR12541
+
+define i32 @foo(i32 %x) {
+  %y = xor i32 %x, 3
+  %z = srem i32 1656690544, %y
+  %sext = shl i32 %z, 24
+  %s = ashr exact i32 %sext, 24
+  ret i32 %s
+; CHECK-NOT: and
+; The shifts were wrongly being turned into an and with 112
+}





More information about the llvm-commits mailing list