summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthijs Kooijman <matthijs@stdin.nl>2008-08-07 15:55:18 +0000
committerMatthijs Kooijman <matthijs@stdin.nl>2008-08-07 15:55:18 +0000
commitd705b2be1f5a9256be919783e8981c41ade4a97e (patch)
tree146ee7b913ec45df2f347319b3c0d37737fb3bd0
parent0620096c185a9688e852ca564b980cc4ea9d270a (diff)
downloadbcm5719-llvm-d705b2be1f5a9256be919783e8981c41ade4a97e.tar.gz
bcm5719-llvm-d705b2be1f5a9256be919783e8981c41ade4a97e.zip
Add a basic test for the SRETPromotion pass.
llvm-svn: 54466
-rw-r--r--llvm/test/Transforms/SRETPromotion/basictest.ll33
1 files changed, 33 insertions, 0 deletions
diff --git a/llvm/test/Transforms/SRETPromotion/basictest.ll b/llvm/test/Transforms/SRETPromotion/basictest.ll
new file mode 100644
index 00000000000..4146cce46ed
--- /dev/null
+++ b/llvm/test/Transforms/SRETPromotion/basictest.ll
@@ -0,0 +1,33 @@
+; RUN: llvm-as < %s | opt -sretpromotion | llvm-dis > %t
+; RUN: cat %t | grep sret | count 1
+
+; This function is promotable
+define internal void @promotable({i32, i32}* sret %s) {
+ %A = getelementptr {i32, i32}* %s, i32 0, i32 0
+ store i32 0, i32* %A
+ %B = getelementptr {i32, i32}* %s, i32 0, i32 0
+ store i32 1, i32* %B
+ ret void
+}
+
+; This function is not promotable (due to it's use below)
+define internal void @notpromotable({i32, i32}* sret %s) {
+ %A = getelementptr {i32, i32}* %s, i32 0, i32 0
+ store i32 0, i32* %A
+ %B = getelementptr {i32, i32}* %s, i32 0, i32 0
+ store i32 1, i32* %B
+ ret void
+}
+
+define void @caller({i32, i32}* %t) {
+ %s = alloca {i32, i32}
+ call void @promotable({i32, i32}* %s)
+ %A = getelementptr {i32, i32}* %s, i32 0, i32 0
+ %a = load i32* %A
+ %B = getelementptr {i32, i32}* %s, i32 0, i32 0
+ %b = load i32* %B
+ ; This passes in something that's not an alloca, which makes the argument not
+ ; promotable
+ call void @notpromotable({i32, i32}* %t)
+ ret void
+}
OpenPOWER on IntegriCloud