Teach the constant folder how to not a cmpinst.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@82378 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Nick Lewycky 2009-09-20 06:24:51 +00:00
parent 1908aea3a6
commit 3105ebfaf7
2 changed files with 20 additions and 0 deletions

View File

@ -704,6 +704,20 @@ Constant *llvm::ConstantFoldBinaryInstruction(LLVMContext &Context,
break;
case Instruction::Xor:
if (CI2->equalsInt(0)) return C1; // X ^ 0 == X
if (ConstantExpr *CE1 = dyn_cast<ConstantExpr>(C1)) {
switch (CE1->getOpcode()) {
default: break;
case Instruction::ICmp:
case Instruction::FCmp:
// icmp pred ^ true -> icmp !pred
assert(CI2->equalsInt(1));
CmpInst::Predicate pred = (CmpInst::Predicate)CE1->getPredicate();
pred = CmpInst::getInversePredicate(pred);
return ConstantExpr::getCompare(pred, CE1->getOperand(0),
CE1->getOperand(1));
}
}
break;
case Instruction::AShr:
// ashr (zext C to Ty), C2 -> lshr (zext C, CSA), C2

View File

@ -28,3 +28,9 @@ global i1 icmp ule (i32* bitcast (i8* @X to i32*), i32* bitcast (i8* @Y to i32*)
; CHECK-NOT: bitcast
; CHECK: icmp
global i1 icmp eq (i1 icmp ult (i8* @X, i8* @Y), i1 false)
; CHECK-NOT: false
; CHECK: icmp
global i1 icmp eq (i1 icmp ult (i8* @X, i8* @Y), i1 true)
; CHECK-NOT: true
; CHECK: icmp