Don't do: "(X & 4) >> 1 == 2 --> (X & 4) == 4" if there are more than one uses of the shift result.

llvm-svn: 50118
This commit is contained in:
Evan Cheng 2008-04-23 00:38:06 +00:00
parent e304ae5621
commit 680839e258
2 changed files with 32 additions and 2 deletions

View File

@ -6065,13 +6065,14 @@ Instruction *InstCombiner::visitICmpInstWithInstAndIntCst(ICmpInst &ICI,
// Otherwise, check to see if the bits shifted out are known to be zero.
// If so, we can compare against the unshifted value:
// (X & 4) >> 1 == 2 --> (X & 4) == 4.
if (MaskedValueIsZero(LHSI->getOperand(0),
if (LHSI->hasOneUse() &&
MaskedValueIsZero(LHSI->getOperand(0),
APInt::getLowBitsSet(Comp.getBitWidth(), ShAmtVal))) {
return new ICmpInst(ICI.getPredicate(), LHSI->getOperand(0),
ConstantExpr::getShl(RHS, ShAmt));
}
if (LHSI->hasOneUse() || RHSV == 0) {
if (LHSI->hasOneUse()) {
// Otherwise strength reduce the shift into an and.
APInt Val(APInt::getHighBitsSet(TypeBits, TypeBits - ShAmtVal));
Constant *Mask = ConstantInt::get(Val);

View File

@ -0,0 +1,29 @@
; RUN: llvm-as < %s | opt -instcombine -stats -disable-output |& \
; RUN: grep {Number of insts combined} | grep 5
define i8 @t1(i8 zeroext %x, i8 zeroext %y) zeroext nounwind {
entry:
%tmp1 = lshr i8 %x, 7
%cond1 = icmp ne i8 %tmp1, 0
br i1 %cond1, label %bb1, label %bb2
bb1:
ret i8 %tmp1
bb2:
%tmp2 = add i8 %tmp1, %y
ret i8 %tmp2
}
define i8 @t2(i8 zeroext %x) zeroext nounwind {
entry:
%tmp1 = lshr i8 %x, 7
%cond1 = icmp ne i8 %tmp1, 0
br i1 %cond1, label %bb1, label %bb2
bb1:
ret i8 0
bb2:
ret i8 1
}