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
|
||||
// other way if possible.
|
||||
// Also, if C1 is null and C2 isn't, flip them around.
|
||||
switch (pred) {
|
||||
case ICmpInst::ICMP_EQ:
|
||||
case ICmpInst::ICMP_NE:
|
||||
// No change of predicate required.
|
||||
return ConstantFoldCompareInstruction(Context, pred, C2, C1);
|
||||
return ConstantExpr::getICmp(pred, C2, C1);
|
||||
|
||||
case ICmpInst::ICMP_ULT:
|
||||
case ICmpInst::ICMP_SLT:
|
||||
|
@ -1858,7 +1860,7 @@ Constant *llvm::ConstantFoldCompareInstruction(LLVMContext &Context,
|
|||
case ICmpInst::ICMP_SGE:
|
||||
// Change the predicate as necessary to swap the operands.
|
||||
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.
|
||||
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