summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorMatthijs Kooijman <matthijs@stdin.nl>2008-07-29 10:00:13 +0000
committerMatthijs Kooijman <matthijs@stdin.nl>2008-07-29 10:00:13 +0000
commit477f5a2f11a0383b4ecfcb0db2913027ed38ee39 (patch)
treee2f41b49e819e169705a82c135dd586b291c4ecd /test
parentbcbd9c43a17652c62875ffb9a008f549d0ec5714 (diff)
downloadllvm-477f5a2f11a0383b4ecfcb0db2913027ed38ee39.tar.gz
llvm-477f5a2f11a0383b4ecfcb0db2913027ed38ee39.tar.bz2
llvm-477f5a2f11a0383b4ecfcb0db2913027ed38ee39.tar.xz
Restructure ArgumentPromotion a bit. Instead of just having a single boolean
that says "unconditional loads from this argument are safe", we now keep track of the safety per set of indices from which loads happen. This prevents ArgPromotion from promoting loads that aren't really valid. As an added effect, this will now disregard the the type of the indices passed to a GEP, so "load GEP %A, i32 1" and "load GEP %A, i64 1" will result in a single argument, not two. This fixes PR2598, for which a testcase has been added as well. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54159 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test')
-rw-r--r--test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll25
1 files changed, 25 insertions, 0 deletions
diff --git a/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll b/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll
new file mode 100644
index 0000000000..11bcb285d5
--- /dev/null
+++ b/test/Transforms/ArgumentPromotion/2008-07-02-array-indexing.ll
@@ -0,0 +1,25 @@
+; RUN: llvm-as < %s | opt -argpromotion | llvm-dis > %t
+; RUN: cat %t | grep {define.*@callee(.*i32\\*}
+; PR2498
+
+; This test tries to convince argpromotion about promoting the load from %A + 2,
+; because there is a load of %A in the entry block
+define internal i32 @callee(i1 %C, i32* %A) {
+entry:
+ ; Unconditonally load the element at %A
+ %A.0 = load i32* %A
+ br i1 %C, label %T, label %F
+T:
+ ret i32 %A.0
+F:
+ ; Load the element at offset two from %A. This should not be promoted!
+ %A.2 = getelementptr i32* %A, i32 2
+ %R = load i32* %A.2
+ ret i32 %R
+}
+
+define i32 @foo() {
+ %X = call i32 @callee(i1 false, i32* null) ; <i32> [#uses=1]
+ ret i32 %X
+}
+