diff options
| author | Chris Lattner <sabre@nondot.org> | 2002-04-29 22:24:47 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2002-04-29 22:24:47 +0000 |
| commit | 31ba129cbe2173a4c2f99f8e13c1660aca1089ca (patch) | |
| tree | b2f3c192bc1c6338812a36ae3748539c42925bf1 /llvm/lib/Transforms | |
| parent | 5c9040e0e01252e2c800e85a9d00275debf78f8f (diff) | |
| download | bcm5719-llvm-31ba129cbe2173a4c2f99f8e13c1660aca1089ca.tar.gz bcm5719-llvm-31ba129cbe2173a4c2f99f8e13c1660aca1089ca.zip | |
Add folding rules for mul X, 0 and mul X, 2
llvm-svn: 2417
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index 71c8723e42b..2ad2356de34 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -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; } } |

