mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-15 05:24:01 +00:00
constant fold nasty constant expressions formed by llvm-gcc,
wrapping up PR3351. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92410 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -718,14 +718,13 @@ Constant *llvm::ConstantFoldInstOperands(unsigned Opcode, const Type *DestTy,
|
|||||||
|
|
||||||
switch (Opcode) {
|
switch (Opcode) {
|
||||||
default: return 0;
|
default: return 0;
|
||||||
|
case Instruction::ICmp:
|
||||||
|
case Instruction::FCmp: assert(0 && "Invalid for compares");
|
||||||
case Instruction::Call:
|
case Instruction::Call:
|
||||||
if (Function *F = dyn_cast<Function>(Ops[0]))
|
if (Function *F = dyn_cast<Function>(Ops[0]))
|
||||||
if (canConstantFoldCallTo(F))
|
if (canConstantFoldCallTo(F))
|
||||||
return ConstantFoldCall(F, Ops+1, NumOps-1);
|
return ConstantFoldCall(F, Ops+1, NumOps-1);
|
||||||
return 0;
|
return 0;
|
||||||
case Instruction::ICmp:
|
|
||||||
case Instruction::FCmp:
|
|
||||||
llvm_unreachable("This function is invalid for compares: no predicate specified");
|
|
||||||
case Instruction::PtrToInt:
|
case Instruction::PtrToInt:
|
||||||
// If the input is a inttoptr, eliminate the pair. This requires knowing
|
// If the input is a inttoptr, eliminate the pair. This requires knowing
|
||||||
// the width of a pointer, so it can't be done in ConstantExpr::getCast.
|
// the width of a pointer, so it can't be done in ConstantExpr::getCast.
|
||||||
@ -877,6 +876,20 @@ Constant *llvm::ConstantFoldCompareInstOperands(unsigned Predicate,
|
|||||||
CE1->getOperand(0), TD);
|
CE1->getOperand(0), TD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// icmp eq (or x, y), 0 -> (icmp eq x, 0) & (icmp eq y, 0)
|
||||||
|
// icmp ne (or x, y), 0 -> (icmp ne x, 0) | (icmp ne y, 0)
|
||||||
|
if ((Predicate == ICmpInst::ICMP_EQ || Predicate == ICmpInst::ICMP_NE) &&
|
||||||
|
CE0->getOpcode() == Instruction::Or && Ops1->isNullValue()) {
|
||||||
|
Constant *LHS =
|
||||||
|
ConstantFoldCompareInstOperands(Predicate, CE0->getOperand(0), Ops1,TD);
|
||||||
|
Constant *RHS =
|
||||||
|
ConstantFoldCompareInstOperands(Predicate, CE0->getOperand(1), Ops1,TD);
|
||||||
|
unsigned OpC =
|
||||||
|
Predicate == ICmpInst::ICMP_EQ ? Instruction::And : Instruction::Or;
|
||||||
|
Constant *Ops[] = { LHS, RHS };
|
||||||
|
return ConstantFoldInstOperands(OpC, LHS->getType(), Ops, 2, TD);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return ConstantExpr::getCompare(Predicate, Ops0, Ops1);
|
return ConstantExpr::getCompare(Predicate, Ops0, Ops1);
|
||||||
|
Reference in New Issue
Block a user