mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-07 14:33:15 +00:00
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:
parent
efc01f62c6
commit
6c1ce21ee6
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user