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