Fix a bug in the ComputeMaskedBits logic for multiply.

llvm-svn: 50793
This commit is contained in:
Dan Gohman 2008-05-07 00:35:55 +00:00
parent cab93d58c3
commit 5a3eecdfd8
3 changed files with 14 additions and 4 deletions

View File

@ -1244,8 +1244,8 @@ void SelectionDAG::ComputeMaskedBits(SDOperand Op, const APInt &Mask,
unsigned TrailZ = KnownZero.countTrailingOnes() +
KnownZero2.countTrailingOnes();
unsigned LeadZ = std::max(KnownZero.countLeadingOnes() +
KnownZero2.countLeadingOnes() +
1, BitWidth) - BitWidth;
KnownZero2.countLeadingOnes(),
BitWidth) - BitWidth;
TrailZ = std::min(TrailZ, BitWidth);
LeadZ = std::min(LeadZ, BitWidth);

View File

@ -767,8 +767,8 @@ void InstCombiner::ComputeMaskedBits(Value *V, const APInt &Mask,
unsigned TrailZ = KnownZero.countTrailingOnes() +
KnownZero2.countTrailingOnes();
unsigned LeadZ = std::max(KnownZero.countLeadingOnes() +
KnownZero2.countLeadingOnes() +
1, BitWidth) - BitWidth;
KnownZero2.countLeadingOnes(),
BitWidth) - BitWidth;
TrailZ = std::min(TrailZ, BitWidth);
LeadZ = std::min(LeadZ, BitWidth);

View File

@ -0,0 +1,10 @@
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep ashr
define i32 @foo(i32 %x, i32 %y) {
%a = and i32 %x, 7
%b = and i32 %y, 7
%c = mul i32 %a, %b
%d = shl i32 %c, 26
%e = ashr i32 %d, 26
ret i32 %e
}