Fix typo: should have been testing that X was odd, not V.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@124533 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan Sands 2011-01-29 13:27:00 +00:00
parent 2c94b4201b
commit 9136782d27
2 changed files with 27 additions and 3 deletions

View File

@ -715,16 +715,16 @@ bool llvm::isKnownNonZero(Value *V, const TargetData *TD, unsigned Depth) {
if (isa<SExtInst>(V) || isa<ZExtInst>(V))
return isKnownNonZero(cast<Instruction>(V)->getOperand(0), TD, Depth);
// shl X, A != 0 if X is odd. Note that the value of the shift is undefined
// shl X, Y != 0 if X is odd. Note that the value of the shift is undefined
// if the lowest bit is shifted off the end.
if (BitWidth && match(V, m_Shl(m_Value(X), m_Value(Y)))) {
APInt KnownZero(BitWidth, 0);
APInt KnownOne(BitWidth, 0);
ComputeMaskedBits(V, APInt(BitWidth, 1), KnownZero, KnownOne, TD, Depth);
ComputeMaskedBits(X, APInt(BitWidth, 1), KnownZero, KnownOne, TD, Depth);
if (KnownOne[0])
return true;
}
// shr X, A != 0 if X is negative. Note that the value of the shift is not
// shr X, Y != 0 if X is negative. Note that the value of the shift is not
// defined if the sign bit is shifted off the end.
else if (match(V, m_Shr(m_Value(X), m_Value(Y)))) {
bool XKnownNonNegative, XKnownNegative;

View File

@ -108,3 +108,27 @@ define i1 @or(i32 %x) {
ret i1 %c
; CHECK: ret i1 false
}
define i1 @shl(i32 %x) {
; CHECK: @shl
%s = shl i32 1, %x
%c = icmp eq i32 %s, 0
ret i1 %c
; CHECK: ret i1 false
}
define i1 @lshr(i32 %x) {
; CHECK: @lshr
%s = lshr i32 -1, %x
%c = icmp eq i32 %s, 0
ret i1 %c
; CHECK: ret i1 false
}
define i1 @ashr(i32 %x) {
; CHECK: @ashr
%s = ashr i32 -1, %x
%c = icmp eq i32 %s, 0
ret i1 %c
; CHECK: ret i1 false
}