Add folding rules for mul X, 0 and mul X, 2

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@2417 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2002-04-29 22:24:47 +00:00
parent efc01f62c6
commit 6c1ce21ee6

View File

@ -2,7 +2,7 @@
// //
// InstructionCombining - Combine instructions to form fewer, simple // InstructionCombining - Combine instructions to form fewer, simple
// instructions. This pass does not modify the CFG, and has a tendancy to // instructions. This pass does not modify the CFG, and has a tendancy to
// make instructions dead, so a subsequent DCE pass is useful. // make instructions dead, so a subsequent DIE pass is useful.
// //
// This pass combines things like: // This pass combines things like:
// %Y = add int 1, %X // %Y = add int 1, %X
@ -75,8 +75,7 @@ namespace {
// //
static bool SimplifyBinOp(BinaryOperator *I) { static bool SimplifyBinOp(BinaryOperator *I) {
if (isa<Constant>(I->getOperand(0)) && !isa<Constant>(I->getOperand(1))) if (isa<Constant>(I->getOperand(0)) && !isa<Constant>(I->getOperand(1)))
if (!I->swapOperands()) return !I->swapOperands();
return true;
return false; return false;
} }
@ -146,6 +145,17 @@ Instruction *InstCombiner::visitMul(BinaryOperator *I) {
AddUsesToWorkList(I); // Add all modified instrs to worklist AddUsesToWorkList(I); // Add all modified instrs to worklist
I->replaceAllUsesWith(Op1); I->replaceAllUsesWith(Op1);
return I; return I;
} else if (I->getType()->isIntegral() &&
cast<ConstantInt>(Op2)->equalsInt(2)) {
// Convert 'mul int %X, 2' to 'add int %X, %X'
return BinaryOperator::create(Instruction::Add, Op1, Op1, I->getName());
} else if (Op2->isNullValue()) {
// Eliminate 'mul int %X, 0'
AddUsesToWorkList(I); // Add all modified instrs to worklist
I->replaceAllUsesWith(Op2); // Set this value to zero directly
return I;
} }
} }