mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Add cannonicalization of shl X, 1 -> add X, X
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3671 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
dabb94adc1
commit
f283608f2e
@ -490,10 +490,18 @@ Instruction *InstCombiner::visitShiftInst(Instruction &I) {
|
||||
// a signed value.
|
||||
//
|
||||
if (ConstantUInt *CUI = dyn_cast<ConstantUInt>(Op1)) {
|
||||
unsigned TypeBits = Op0->getType()->getPrimitiveSize()*8;
|
||||
if (CUI->getValue() >= TypeBits &&
|
||||
!(Op0->getType()->isSigned() && I.getOpcode() == Instruction::Shr))
|
||||
return ReplaceInstUsesWith(I, Constant::getNullValue(Op0->getType()));
|
||||
if (I.getOpcode() == Instruction::Shr) {
|
||||
unsigned TypeBits = Op0->getType()->getPrimitiveSize()*8;
|
||||
if (CUI->getValue() >= TypeBits && !(Op0->getType()->isSigned()))
|
||||
return ReplaceInstUsesWith(I, Constant::getNullValue(Op0->getType()));
|
||||
}
|
||||
|
||||
// Check to see if we are shifting left by 1. If so, turn it into an add
|
||||
// instruction.
|
||||
if (I.getOpcode() == Instruction::Shl && CUI->equalsInt(1))
|
||||
// Convert 'shl int %X, 2' to 'add int %X, %X'
|
||||
return BinaryOperator::create(Instruction::Add, Op0, Op0, I.getName());
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user