[llvm-commits] [llvm] r67414 - in /llvm/branches/Apple/Dib: lib/Transforms/Scalar/InstructionCombining.cpp test/Transforms/InstCombine/2009-03-20-AShrOverShift.ll
Bill Wendling
isanbard at gmail.com
Fri Mar 20 15:54:06 PDT 2009
Author: void
Date: Fri Mar 20 17:54:05 2009
New Revision: 67414
URL: http://llvm.org/viewvc/llvm-project?rev=67414&view=rev
Log:
--- Merging (from foreign repository) r67411 into '.':
A test/Transforms/InstCombine/2009-03-20-AShrOverShift.ll
U lib/Transforms/Scalar/InstructionCombining.cpp
Fix instcombine to not introduce undefined shifts when merging two
shifts together. This fixes PR3851.
Added:
llvm/branches/Apple/Dib/test/Transforms/InstCombine/2009-03-20-AShrOverShift.ll
Modified:
llvm/branches/Apple/Dib/lib/Transforms/Scalar/InstructionCombining.cpp
Modified: llvm/branches/Apple/Dib/lib/Transforms/Scalar/InstructionCombining.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/lib/Transforms/Scalar/InstructionCombining.cpp?rev=67414&r1=67413&r2=67414&view=diff
==============================================================================
--- llvm/branches/Apple/Dib/lib/Transforms/Scalar/InstructionCombining.cpp (original)
+++ llvm/branches/Apple/Dib/lib/Transforms/Scalar/InstructionCombining.cpp Fri Mar 20 17:54:05 2009
@@ -7307,22 +7307,34 @@
Value *X = ShiftOp->getOperand(0);
uint32_t AmtSum = ShiftAmt1+ShiftAmt2; // Fold into one big shift.
- if (AmtSum > TypeBits)
- AmtSum = TypeBits;
const IntegerType *Ty = cast<IntegerType>(I.getType());
// Check for (X << c1) << c2 and (X >> c1) >> c2
if (I.getOpcode() == ShiftOp->getOpcode()) {
+ // If this is oversized composite shift, then unsigned shifts get 0, ashr
+ // saturates.
+ if (AmtSum >= TypeBits) {
+ if (I.getOpcode() != Instruction::AShr)
+ return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType()));
+ AmtSum = TypeBits-1; // Saturate to 31 for i32 ashr.
+ }
+
return BinaryOperator::Create(I.getOpcode(), X,
ConstantInt::get(Ty, AmtSum));
} else if (ShiftOp->getOpcode() == Instruction::LShr &&
I.getOpcode() == Instruction::AShr) {
+ if (AmtSum >= TypeBits)
+ return ReplaceInstUsesWith(I, Constant::getNullValue(I.getType()));
+
// ((X >>u C1) >>s C2) -> (X >>u (C1+C2)) since C1 != 0.
return BinaryOperator::CreateLShr(X, ConstantInt::get(Ty, AmtSum));
} else if (ShiftOp->getOpcode() == Instruction::AShr &&
I.getOpcode() == Instruction::LShr) {
// ((X >>s C1) >>u C2) -> ((X >>s (C1+C2)) & mask) since C1 != 0.
+ if (AmtSum >= TypeBits)
+ AmtSum = TypeBits-1;
+
Instruction *Shift =
BinaryOperator::CreateAShr(X, ConstantInt::get(Ty, AmtSum));
InsertNewInstBefore(Shift, I);
Added: llvm/branches/Apple/Dib/test/Transforms/InstCombine/2009-03-20-AShrOverShift.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/branches/Apple/Dib/test/Transforms/InstCombine/2009-03-20-AShrOverShift.ll?rev=67414&view=auto
==============================================================================
--- llvm/branches/Apple/Dib/test/Transforms/InstCombine/2009-03-20-AShrOverShift.ll (added)
+++ llvm/branches/Apple/Dib/test/Transforms/InstCombine/2009-03-20-AShrOverShift.ll Fri Mar 20 17:54:05 2009
@@ -0,0 +1,9 @@
+; RUN: llvm-as < %s | opt -instcombine | llvm-dis | grep {ashr i32 %val, 31}
+; PR3851
+
+define i32 @foo2(i32 %val) nounwind {
+entry:
+ %shr = ashr i32 %val, 15 ; <i32> [#uses=3]
+ %shr4 = ashr i32 %shr, 17 ; <i32> [#uses=1]
+ ret i32 %shr4
+ }
More information about the llvm-commits
mailing list