[pr19636] Fix known bit computation in urem instruction with power of two.

Patch by Andrey Kuharev.

llvm-svn: 209902
This commit is contained in:
Rafael Espindola 2014-05-30 15:00:45 +00:00
parent d622e1282c
commit 92945eee80
2 changed files with 19 additions and 2 deletions

View File

@ -2185,8 +2185,11 @@ void SelectionDAG::computeKnownBits(SDValue Op, APInt &KnownZero,
const APInt &RA = Rem->getAPIntValue();
if (RA.isPowerOf2()) {
APInt LowBits = (RA - 1);
KnownZero |= ~LowBits;
computeKnownBits(Op.getOperand(0), KnownZero, KnownOne,Depth+1);
computeKnownBits(Op.getOperand(0), KnownZero2, KnownOne2, Depth + 1);
// The upper bits are all zero, the lower ones are unchanged.
KnownZero = KnownZero2 | ~LowBits;
KnownOne = KnownOne2 & LowBits;
break;
}
}

View File

@ -0,0 +1,14 @@
; RUN: llc -mtriple=x86_64-linux < %s | FileCheck %s
define i32 @main() #0 {
entry:
%a = alloca i32, align 4
store i32 1, i32* %a, align 4
%0 = load i32* %a, align 4
%or = or i32 1, %0
%and = and i32 1, %or
%rem = urem i32 %and, 1
%add = add i32 %rem, 1
ret i32 %add
}
; CHECK: $1, %eax
; CHECK-NEXT: retq