forked from OSchip/llvm-project
Aggressively flip compare constant expressions where appropriate; constant
folding in particular expects null to be on the RHS. llvm-svn: 91587
This commit is contained in:
parent
3dfff974ec
commit
e67cae33e1
|
@ -1839,14 +1839,16 @@ Constant *llvm::ConstantFoldCompareInstruction(LLVMContext &Context,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isa<ConstantExpr>(C1) && isa<ConstantExpr>(C2)) {
|
if ((!isa<ConstantExpr>(C1) && isa<ConstantExpr>(C2)) ||
|
||||||
|
(C1->isNullValue() && !C2->isNullValue())) {
|
||||||
// If C2 is a constant expr and C1 isn't, flip them around and fold the
|
// If C2 is a constant expr and C1 isn't, flip them around and fold the
|
||||||
// other way if possible.
|
// other way if possible.
|
||||||
|
// Also, if C1 is null and C2 isn't, flip them around.
|
||||||
switch (pred) {
|
switch (pred) {
|
||||||
case ICmpInst::ICMP_EQ:
|
case ICmpInst::ICMP_EQ:
|
||||||
case ICmpInst::ICMP_NE:
|
case ICmpInst::ICMP_NE:
|
||||||
// No change of predicate required.
|
// No change of predicate required.
|
||||||
return ConstantFoldCompareInstruction(Context, pred, C2, C1);
|
return ConstantExpr::getICmp(pred, C2, C1);
|
||||||
|
|
||||||
case ICmpInst::ICMP_ULT:
|
case ICmpInst::ICMP_ULT:
|
||||||
case ICmpInst::ICMP_SLT:
|
case ICmpInst::ICMP_SLT:
|
||||||
|
@ -1858,7 +1860,7 @@ Constant *llvm::ConstantFoldCompareInstruction(LLVMContext &Context,
|
||||||
case ICmpInst::ICMP_SGE:
|
case ICmpInst::ICMP_SGE:
|
||||||
// Change the predicate as necessary to swap the operands.
|
// Change the predicate as necessary to swap the operands.
|
||||||
pred = ICmpInst::getSwappedPredicate((ICmpInst::Predicate)pred);
|
pred = ICmpInst::getSwappedPredicate((ICmpInst::Predicate)pred);
|
||||||
return ConstantFoldCompareInstruction(Context, pred, C2, C1);
|
return ConstantExpr::getICmp(pred, C2, C1);
|
||||||
|
|
||||||
default: // These predicates cannot be flopped around.
|
default: // These predicates cannot be flopped around.
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
; RUN: opt < %s -instcombine -S | FileCheck %s
|
||||||
|
target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:32:32-n8:16:32"
|
||||||
|
|
||||||
|
define i32 @a() nounwind readnone {
|
||||||
|
entry:
|
||||||
|
ret i32 zext (i1 icmp eq (i32 0, i32 ptrtoint (i32 ()* @a to i32)) to i32)
|
||||||
|
}
|
||||||
|
; CHECK: ret i32 0
|
Loading…
Reference in New Issue