summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorBob Wilson <bob.wilson@apple.com>2013-11-15 19:09:27 +0000
committerBob Wilson <bob.wilson@apple.com>2013-11-15 19:09:27 +0000
commitcc7052343e5e955d4e2f48885c06360f9003390a (patch)
tree8832fd14ebae789ee88bab5009cc33fbc89e3ec7 /include
parent5cddda6d13ab66c462ccbd61255ad6e6f95e9f6f (diff)
downloadllvm-cc7052343e5e955d4e2f48885c06360f9003390a.tar.gz
llvm-cc7052343e5e955d4e2f48885c06360f9003390a.tar.bz2
llvm-cc7052343e5e955d4e2f48885c06360f9003390a.tar.xz
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
Diffstat (limited to 'include')
-rw-r--r--include/llvm/CodeGen/FastISel.h9
1 files changed, 9 insertions, 0 deletions
diff --git a/include/llvm/CodeGen/FastISel.h b/include/llvm/CodeGen/FastISel.h
index 0063474534..1e0ef6b545 100644
--- a/include/llvm/CodeGen/FastISel.h
+++ b/include/llvm/CodeGen/FastISel.h
@@ -358,6 +358,15 @@ protected:
return 0;
}
+ /// \brief Check if \c Add is an add that can be safely folded into \c GEP.
+ ///
+ /// \c Add can be folded into \c GEP if:
+ /// - \c Add is an add,
+ /// - \c Add's size matches \c GEP's,
+ /// - \c Add is in the same basic block as \c GEP, and
+ /// - \c Add has a constant operand.
+ bool canFoldAddIntoGEP(const User *GEP, const Value *Add);
+
private:
bool SelectBinaryOp(const User *I, unsigned ISDOpcode);