Skip to content

Commit

Permalink
Just mark the sign bit as known zero, rather than any other irrelevan…
Browse files Browse the repository at this point in the history
…t bits

known zero in the LHS.  Fixes PR12541.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@155818 91177308-0d34-0410-b5e6-96231b3b80d8
  • Loading branch information
CunningBaldrick committed Apr 30, 2012
1 parent bfbab99 commit 5ff30e7
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
2 changes: 1 addition & 1 deletion lib/Analysis/ValueTracking.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -564,7 +564,7 @@ void llvm::ComputeMaskedBits(Value *V, APInt &KnownZero, APInt &KnownOne,
Depth+1);
// If it's known zero, our sign bit is also zero.
if (LHSKnownZero.isNegative())
KnownZero |= LHSKnownZero;
KnownZero.setBit(BitWidth - 1);
}

break;
Expand Down
12 changes: 12 additions & 0 deletions test/Transforms/InstCombine/2012-04-30-SRem.ll
Original file line number Diff line number Diff line change
@@ -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
}

0 comments on commit 5ff30e7

Please sign in to comment.