diff options
| author | Chris Lattner <sabre@nondot.org> | 2005-06-15 20:53:31 +0000 | 
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2005-06-15 20:53:31 +0000 | 
| commit | 19b57f55aa5952bc6c79e969d0a878481f4a824c (patch) | |
| tree | 9d13da4756cb72e9d464ddd14edfe004bfe89a5d /llvm/lib/Transforms/Scalar | |
| parent | b28f0ef40a537f6b8d2f6d44caa2080f2d58c744 (diff) | |
| download | bcm5719-llvm-19b57f55aa5952bc6c79e969d0a878481f4a824c.tar.gz bcm5719-llvm-19b57f55aa5952bc6c79e969d0a878481f4a824c.zip | |
Fix PR577 and testcase InstCombine/2005-06-15-ShiftSetCCCrash.ll.
Do not perform undefined out of range shifts.
llvm-svn: 22217
Diffstat (limited to 'llvm/lib/Transforms/Scalar')
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 18 | 
1 files changed, 16 insertions, 2 deletions
| diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index 53ee6ca01fb..02438202dc5 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -2560,6 +2560,14 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {            default: break;            case Instruction::SetEQ:            case Instruction::SetNE: { +            unsigned TypeBits = CI->getType()->getPrimitiveSizeInBits(); + +            // Check that the shift amount is in range.  If not, don't perform +            // undefined shifts.  When the shift is visited it will be +            // simplified. +            if (ShAmt->getValue() >= TypeBits) +              break; +              // If we are comparing against bits always shifted out, the              // comparison cannot succeed.              Constant *Comp = @@ -2573,7 +2581,6 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {              if (LHSI->hasOneUse()) {                // Otherwise strength reduce the shift into an and.                unsigned ShAmtVal = (unsigned)ShAmt->getValue(); -              unsigned TypeBits = CI->getType()->getPrimitiveSizeInBits();                uint64_t Val = (1ULL << (TypeBits-ShAmtVal))-1;                Constant *Mask; @@ -2603,6 +2610,14 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {            default: break;            case Instruction::SetEQ:            case Instruction::SetNE: { + +            // Check that the shift amount is in range.  If not, don't perform +            // undefined shifts.  When the shift is visited it will be +            // simplified. +            unsigned TypeBits = ShAmt->getType()->getPrimitiveSizeInBits(); +            if (ShAmt->getValue() >= TypeBits) +              break; +              // If we are comparing against bits always shifted out, the              // comparison cannot succeed.              Constant *Comp = @@ -2623,7 +2638,6 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {                Constant *Mask;                if (CI->getType()->isUnsigned()) { -                unsigned TypeBits = CI->getType()->getPrimitiveSizeInBits();                  Val &= ~0ULL >> (64-TypeBits);                  Mask = ConstantUInt::get(CI->getType(), Val);                } else { | 

