mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 03:33:20 +01:00
factor some logic out of instcombine into a new SimplifyAddInst method.
llvm-svn: 90011
This commit is contained in:
parent
0df78ea645
commit
bdaed088ea
@ -20,6 +20,11 @@ namespace llvm {
|
||||
class Instruction;
|
||||
class Value;
|
||||
class TargetData;
|
||||
|
||||
/// SimplifyAddInst - Given operands for an Add, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW,
|
||||
const TargetData *TD = 0);
|
||||
|
||||
/// SimplifyAndInst - Given operands for an And, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
|
@ -21,10 +21,38 @@
|
||||
using namespace llvm;
|
||||
using namespace llvm::PatternMatch;
|
||||
|
||||
/// SimplifyAddInst - Given operands for an Add, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *llvm::SimplifyAddInst(Value *Op0, Value *Op1, bool isNSW, bool isNUW,
|
||||
const TargetData *TD) {
|
||||
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
||||
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
||||
Constant *Ops[] = { CLHS, CRHS };
|
||||
return ConstantFoldInstOperands(Instruction::Add, CLHS->getType(),
|
||||
Ops, 2, TD);
|
||||
}
|
||||
|
||||
// Canonicalize the constant to the RHS.
|
||||
std::swap(Op0, Op1);
|
||||
}
|
||||
|
||||
if (Constant *Op1C = dyn_cast<Constant>(Op1)) {
|
||||
// X + undef -> undef
|
||||
if (isa<UndefValue>(Op1C))
|
||||
return Op1C;
|
||||
|
||||
// X + 0 --> X
|
||||
if (Op1C->isNullValue())
|
||||
return Op0;
|
||||
}
|
||||
|
||||
// FIXME: Could pull several more out of instcombine.
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// SimplifyAndInst - Given operands for an And, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *llvm::SimplifyAndInst(Value *Op0, Value *Op1,
|
||||
const TargetData *TD) {
|
||||
Value *llvm::SimplifyAndInst(Value *Op0, Value *Op1, const TargetData *TD) {
|
||||
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
||||
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
||||
Constant *Ops[] = { CLHS, CRHS };
|
||||
@ -83,8 +111,7 @@ Value *llvm::SimplifyAndInst(Value *Op0, Value *Op1,
|
||||
|
||||
/// SimplifyOrInst - Given operands for an Or, see if we can
|
||||
/// fold the result. If not, this returns null.
|
||||
Value *llvm::SimplifyOrInst(Value *Op0, Value *Op1,
|
||||
const TargetData *TD) {
|
||||
Value *llvm::SimplifyOrInst(Value *Op0, Value *Op1, const TargetData *TD) {
|
||||
if (Constant *CLHS = dyn_cast<Constant>(Op0)) {
|
||||
if (Constant *CRHS = dyn_cast<Constant>(Op1)) {
|
||||
Constant *Ops[] = { CLHS, CRHS };
|
||||
@ -142,8 +169,6 @@ Value *llvm::SimplifyOrInst(Value *Op0, Value *Op1,
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static const Type *GetCompareTy(Value *Op) {
|
||||
return CmpInst::makeCmpResultType(Op->getType());
|
||||
}
|
||||
@ -327,6 +352,10 @@ Value *llvm::SimplifyInstruction(Instruction *I, const TargetData *TD) {
|
||||
switch (I->getOpcode()) {
|
||||
default:
|
||||
return ConstantFoldInstruction(I, TD);
|
||||
case Instruction::Add:
|
||||
return SimplifyAddInst(I->getOperand(0), I->getOperand(1),
|
||||
cast<BinaryOperator>(I)->hasNoSignedWrap(),
|
||||
cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD);
|
||||
case Instruction::And:
|
||||
return SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD);
|
||||
case Instruction::Or:
|
||||
|
@ -2163,8 +2163,8 @@ bool InstCombiner::WillNotOverflowSignedAdd(Value *LHS, Value *RHS) {
|
||||
|
||||
// Add has the property that adding any two 2's complement numbers can only
|
||||
// have one carry bit which can change a sign. As such, if LHS and RHS each
|
||||
// have at least two sign bits, we know that the addition of the two values will
|
||||
// sign extend fine.
|
||||
// have at least two sign bits, we know that the addition of the two values
|
||||
// will sign extend fine.
|
||||
if (ComputeNumSignBits(LHS) > 1 && ComputeNumSignBits(RHS) > 1)
|
||||
return true;
|
||||
|
||||
@ -2184,15 +2184,12 @@ Instruction *InstCombiner::visitAdd(BinaryOperator &I) {
|
||||
bool Changed = SimplifyCommutative(I);
|
||||
Value *LHS = I.getOperand(0), *RHS = I.getOperand(1);
|
||||
|
||||
if (Value *V = SimplifyAddInst(LHS, RHS, I.hasNoSignedWrap(),
|
||||
I.hasNoUnsignedWrap(), TD))
|
||||
return ReplaceInstUsesWith(I, V);
|
||||
|
||||
|
||||
if (Constant *RHSC = dyn_cast<Constant>(RHS)) {
|
||||
// X + undef -> undef
|
||||
if (isa<UndefValue>(RHS))
|
||||
return ReplaceInstUsesWith(I, RHS);
|
||||
|
||||
// X + 0 --> X
|
||||
if (RHSC->isNullValue())
|
||||
return ReplaceInstUsesWith(I, LHS);
|
||||
|
||||
if (ConstantInt *CI = dyn_cast<ConstantInt>(RHSC)) {
|
||||
// X + (signbit) --> X ^ signbit
|
||||
const APInt& Val = CI->getValue();
|
||||
@ -4322,7 +4319,6 @@ Instruction *InstCombiner::visitAnd(BinaryOperator &I) {
|
||||
|
||||
if (Value *V = SimplifyAndInst(Op0, Op1, TD))
|
||||
return ReplaceInstUsesWith(I, V);
|
||||
|
||||
|
||||
// See if we can simplify any instructions used by the instruction whose sole
|
||||
// purpose is to compute bits we don't care about.
|
||||
|
Loading…
Reference in New Issue
Block a user