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
// 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:
// %Y = add int 1, %X
@ -75,8 +75,7 @@ namespace {
//
static bool SimplifyBinOp(BinaryOperator *I) {
if (isa<Constant>(I->getOperand(0)) && !isa<Constant>(I->getOperand(1)))
if (!I->swapOperands())
return true;
return !I->swapOperands();
return false;
}
@ -146,6 +145,17 @@ Instruction *InstCombiner::visitMul(BinaryOperator *I) {
AddUsesToWorkList(I); // Add all modified instrs to worklist
I->replaceAllUsesWith(Op1);
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;
}
}