Add a basic test for the SRETPromotion pass.
authorMatthijs Kooijman <matthijs@stdin.nl>
Thu, 7 Aug 2008 15:55:18 +0000 (15:55 +0000)
committerMatthijs Kooijman <matthijs@stdin.nl>
Thu, 7 Aug 2008 15:55:18 +0000 (15:55 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54466 91177308-0d34-0410-b5e6-96231b3b80d8

test/Transforms/SRETPromotion/basictest.ll [new file with mode: 0644]

diff --git a/test/Transforms/SRETPromotion/basictest.ll b/test/Transforms/SRETPromotion/basictest.ll
new file mode 100644 (file)
index 0000000..4146cce
--- /dev/null
@@ -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
+}