diff options
| author | Bob Wilson <bob.wilson@apple.com> | 2013-11-15 19:09:27 +0000 |
|---|---|---|
| committer | Bob Wilson <bob.wilson@apple.com> | 2013-11-15 19:09:27 +0000 |
| commit | 9f3e6b25ee978f2fd492aeca235019ebd7845e42 (patch) | |
| tree | efaf339a4a0e8252635d285b7c120c1844f767c9 /llvm/lib/Target/ARM | |
| parent | fd6cfe92d3b0a79d0b66a29755eb7af4a4aca3b6 (diff) | |
| download | bcm5719-llvm-9f3e6b25ee978f2fd492aeca235019ebd7845e42.tar.gz bcm5719-llvm-9f3e6b25ee978f2fd492aeca235019ebd7845e42.zip | |
Avoid illegal integer promotion in fastisel
Stop folding constant adds into GEP when the type size doesn't match.
Otherwise, the adds' operands are effectively being promoted, changing the
conditions of an overflow. Results are different when:
sext(a) + sext(b) != sext(a + b)
Problem originally found on x86-64, but also fixed issues with ARM and PPC,
which used similar code.
<rdar://problem/15292280>
Patch by Duncan Exon Smith!
llvm-svn: 194840
Diffstat (limited to 'llvm/lib/Target/ARM')
| -rw-r--r-- | llvm/lib/Target/ARM/ARMFastISel.cpp | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/llvm/lib/Target/ARM/ARMFastISel.cpp b/llvm/lib/Target/ARM/ARMFastISel.cpp index f3a74c7109e..a4004f32db3 100644 --- a/llvm/lib/Target/ARM/ARMFastISel.cpp +++ b/llvm/lib/Target/ARM/ARMFastISel.cpp @@ -900,13 +900,8 @@ bool ARMFastISel::ARMComputeAddress(const Value *Obj, Address &Addr) { TmpOffset += CI->getSExtValue() * S; break; } - if (isa<AddOperator>(Op) && - (!isa<Instruction>(Op) || - FuncInfo.MBBMap[cast<Instruction>(Op)->getParent()] - == FuncInfo.MBB) && - isa<ConstantInt>(cast<AddOperator>(Op)->getOperand(1))) { - // An add (in the same block) with a constant operand. Fold the - // constant. + if (canFoldAddIntoGEP(U, Op)) { + // A compatible add with a constant operand. Fold the constant. ConstantInt *CI = cast<ConstantInt>(cast<AddOperator>(Op)->getOperand(1)); TmpOffset += CI->getSExtValue() * S; |

