mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-20 18:48:13 +00:00
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
e304ae5621
commit
680839e258
@ -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);
|
||||
|
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
|
||||
}
|
Loading…
Reference in New Issue
Block a user