1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

Teach the constant folder how to not a cmpinst.

llvm-svn: 82378
This commit is contained in:
Nick Lewycky 2009-09-20 06:24:51 +00:00
parent acb70ff251
commit 5cbc7c4ae9
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