Fold ((1 << a) & 1) to (a == 0).

llvm-svn: 53276
This commit is contained in:
Nick Lewycky 2008-07-09 05:20:13 +00:00
parent a660f4bb07
commit 364661c43e
2 changed files with 22 additions and 0 deletions

View File

@ -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)))

View File

@ -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
}