mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-09-28 06:58:19 +00:00
Fix PR577 and testcase InstCombine/2005-06-15-ShiftSetCCCrash.ll.
Do not perform undefined out of range shifts. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22217 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
7833b44f6a
commit
e17a128a55
@ -2560,6 +2560,14 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {
|
|||||||
default: break;
|
default: break;
|
||||||
case Instruction::SetEQ:
|
case Instruction::SetEQ:
|
||||||
case Instruction::SetNE: {
|
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
|
// If we are comparing against bits always shifted out, the
|
||||||
// comparison cannot succeed.
|
// comparison cannot succeed.
|
||||||
Constant *Comp =
|
Constant *Comp =
|
||||||
@ -2573,7 +2581,6 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {
|
|||||||
if (LHSI->hasOneUse()) {
|
if (LHSI->hasOneUse()) {
|
||||||
// Otherwise strength reduce the shift into an and.
|
// Otherwise strength reduce the shift into an and.
|
||||||
unsigned ShAmtVal = (unsigned)ShAmt->getValue();
|
unsigned ShAmtVal = (unsigned)ShAmt->getValue();
|
||||||
unsigned TypeBits = CI->getType()->getPrimitiveSizeInBits();
|
|
||||||
uint64_t Val = (1ULL << (TypeBits-ShAmtVal))-1;
|
uint64_t Val = (1ULL << (TypeBits-ShAmtVal))-1;
|
||||||
|
|
||||||
Constant *Mask;
|
Constant *Mask;
|
||||||
@ -2603,6 +2610,14 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {
|
|||||||
default: break;
|
default: break;
|
||||||
case Instruction::SetEQ:
|
case Instruction::SetEQ:
|
||||||
case Instruction::SetNE: {
|
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
|
// If we are comparing against bits always shifted out, the
|
||||||
// comparison cannot succeed.
|
// comparison cannot succeed.
|
||||||
Constant *Comp =
|
Constant *Comp =
|
||||||
@ -2623,7 +2638,6 @@ Instruction *InstCombiner::visitSetCondInst(SetCondInst &I) {
|
|||||||
|
|
||||||
Constant *Mask;
|
Constant *Mask;
|
||||||
if (CI->getType()->isUnsigned()) {
|
if (CI->getType()->isUnsigned()) {
|
||||||
unsigned TypeBits = CI->getType()->getPrimitiveSizeInBits();
|
|
||||||
Val &= ~0ULL >> (64-TypeBits);
|
Val &= ~0ULL >> (64-TypeBits);
|
||||||
Mask = ConstantUInt::get(CI->getType(), Val);
|
Mask = ConstantUInt::get(CI->getType(), Val);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user