mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-19 17:24:57 +00:00
Don't do: "(X & 4) >> 1 == 2 --> (X & 4) == 4" if there are more than one uses of the shift result.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@50118 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -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);
|
||||||
|
29
test/Transforms/InstCombine/shl-icmp.ll
Normal file
29
test/Transforms/InstCombine/shl-icmp.ll
Normal 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
|
||||||
|
}
|
Reference in New Issue
Block a user