1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00

Fix InstCombine/2004-02-23-ShiftShiftOverflow.ll

Also, turn 'shr int %X, 1234' into 'shr int %X, 31'

llvm-svn: 11768
This commit is contained in:
Chris Lattner 2004-02-23 20:30:06 +00:00
parent 39c2703ad4
commit 253f77f2a7

View File

@ -1570,9 +1570,14 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) {
// of a signed value.
//
unsigned TypeBits = Op0->getType()->getPrimitiveSize()*8;
if (CUI->getValue() >= TypeBits &&
(!Op0->getType()->isSigned() || isLeftShift))
return ReplaceInstUsesWith(I, Constant::getNullValue(Op0->getType()));
if (CUI->getValue() >= TypeBits) {
if (!Op0->getType()->isSigned() || isLeftShift)
return ReplaceInstUsesWith(I, Constant::getNullValue(Op0->getType()));
else {
I.setOperand(1, ConstantUInt::get(Type::UByteTy, TypeBits-1));
return &I;
}
}
// ((X*C1) << C2) == (X * (C1 << C2))
if (BinaryOperator *BO = dyn_cast<BinaryOperator>(Op0))
@ -1636,6 +1641,8 @@ Instruction *InstCombiner::visitShiftInst(ShiftInst &I) {
// Check for (A << c1) << c2 and (A >> c1) >> c2
if (I.getOpcode() == Op0SI->getOpcode()) {
unsigned Amt = ShiftAmt1+ShiftAmt2; // Fold into one big shift...
if (Op0->getType()->getPrimitiveSize()*8 < Amt)
Amt = Op0->getType()->getPrimitiveSize()*8;
return new ShiftInst(I.getOpcode(), Op0SI->getOperand(0),
ConstantUInt::get(Type::UByteTy, Amt));
}