forked from OSchip/llvm-project
parent
a660f4bb07
commit
364661c43e
|
@ -3473,6 +3473,18 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) {
|
|||
}
|
||||
|
||||
break;
|
||||
|
||||
case Instruction::Shl:
|
||||
case Instruction::LShr:
|
||||
// (1 << x) & 1 --> zext(x == 0)
|
||||
// (1 >> x) & 1 --> zext(x == 0)
|
||||
if (AndRHSMask.getLimitedValue() == 1 && Op0LHS == AndRHS) {
|
||||
Instruction *NewICmp = new ICmpInst(ICmpInst::ICMP_EQ, Op0RHS,
|
||||
Constant::getNullValue(I.getType()));
|
||||
InsertNewInstBefore(NewICmp, I);
|
||||
return new ZExtInst(NewICmp, I.getType());
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if (ConstantInt *Op0CI = dyn_cast<ConstantInt>(Op0I->getOperand(1)))
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {icmp ne i32 \%a}
|
||||
; PR2330
|
||||
|
||||
define i1 @foo(i32 %a) nounwind {
|
||||
entry:
|
||||
%tmp15 = shl i32 1, %a ; <i32> [#uses=1]
|
||||
%tmp237 = and i32 %tmp15, 1 ; <i32> [#uses=1]
|
||||
%toBool = icmp eq i32 %tmp237, 0 ; <i1> [#uses=1]
|
||||
ret i1 %toBool
|
||||
}
|
Loading…
Reference in New Issue