Reorganization of code, no functional changes.

Now it shoudl be a bit more efficient


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7292 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner
2003-07-24 17:52:58 +00:00
parent 3d8d9f7e72
commit 08fd7abb42

View File

@@ -876,12 +876,27 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) {
Op0 == Constant::getNullValue(Op0->getType()))
return ReplaceInstUsesWith(I, Op0);
if (ConstantUInt *CUI = dyn_cast<ConstantUInt>(Op1)) {
// shl uint X, 32 = 0 and shr ubyte Y, 9 = 0, ... just don't eliminate shr
// of a signed value.
//
unsigned TypeBits = Op0->getType()->getPrimitiveSize()*8;
if (CUI->getValue() >= TypeBits &&
(!Op0->getType()->isSigned() || I.getOpcode() == Instruction::Shl))
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, 1' to 'add int %X, %X'
return BinaryOperator::create(Instruction::Add, Op0, Op0, I.getName());
// If this is a shift of a shift, see if we can fold the two together...
if (ShiftInst *Op0SI = dyn_cast<ShiftInst>(Op0)) {
if (isa<Constant>(Op1) && isa<Constant>(Op0SI->getOperand(1))) {
if (isa<ConstantUInt>(Op1) && isa<Constant>(Op0SI->getOperand(1))) {
ConstantUInt *ShiftAmt1C = cast<ConstantUInt>(Op0SI->getOperand(1));
unsigned ShiftAmt1 = ShiftAmt1C->getValue();
unsigned ShiftAmt2 = cast<ConstantUInt>(Op1)->getValue();
unsigned ShiftAmt2 = CUI->getValue();
// Check for (A << c1) << c2 and (A >> c1) >> c2
if (I.getOpcode() == Op0SI->getOpcode()) {
@@ -890,7 +905,8 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) {
ConstantUInt::get(Type::UByteTy, Amt));
}
if (I.getType()->isUnsigned()) { // Check for (A << c1) >> c2 or visaversa
// Check for (A << c1) >> c2 or visaversa
if (I.getType()->isUnsigned()) {
// Calculate bitmask for what gets shifted off the edge...
Constant *C = ConstantIntegral::getAllOnesValue(I.getType());
if (I.getOpcode() == Instruction::Shr)
@@ -900,8 +916,8 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) {
Instruction *Mask =
BinaryOperator::create(Instruction::And, Op0SI->getOperand(0),
C, Op0SI->getOperand(0)->getName()+".mask",&I);
WorkList.push_back(Mask);
C, Op0SI->getOperand(0)->getName()+".mask");
InsertNewInstBefore(Mask, I);
// Figure out what flavor of shift we should use...
if (ShiftAmt1 == ShiftAmt2)
@@ -916,27 +932,12 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) {
}
}
}
// shl uint X, 32 = 0 and shr ubyte Y, 9 = 0, ... just don't eliminate shr of
// 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::Shl))
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, 1' to 'add int %X, %X'
return BinaryOperator::create(Instruction::Add, Op0, Op0, I.getName());
}
// shr int -1, X = -1 (for any arithmetic shift rights of ~0)
if (I.getOpcode() == Instruction::Shr)
if (ConstantSInt *CSI = dyn_cast<ConstantSInt>(Op0))
if (I.getOpcode() == Instruction::Shr && CSI->isAllOnesValue())
if (CSI->isAllOnesValue())
return ReplaceInstUsesWith(I, CSI);
return 0;