Avoid illegal integer promotion in fastisel
authorBob Wilson <bob.wilson@apple.com>
Fri, 15 Nov 2013 19:09:27 +0000 (19:09 +0000)
committerBob Wilson <bob.wilson@apple.com>
Fri, 15 Nov 2013 19:09:27 +0000 (19:09 +0000)
commitcc7052343e5e955d4e2f48885c06360f9003390a
tree8832fd14ebae789ee88bab5009cc33fbc89e3ec7
parent5cddda6d13ab66c462ccbd61255ad6e6f95e9f6f
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!

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@194840 91177308-0d34-0410-b5e6-96231b3b80d8
include/llvm/CodeGen/FastISel.h
lib/CodeGen/SelectionDAG/FastISel.cpp
lib/Target/ARM/ARMFastISel.cpp
lib/Target/PowerPC/PPCFastISel.cpp
lib/Target/X86/X86FastISel.cpp
test/CodeGen/ARM/fastisel-gep-promote-before-add.ll [new file with mode: 0644]
test/CodeGen/PowerPC/fastisel-gep-promote-before-add.ll [new file with mode: 0644]
test/CodeGen/X86/fastisel-gep-promote-before-add.ll [new file with mode: 0644]