Add a testcase showing that scalarrepl supports first class structs.
authorMatthijs Kooijman <matthijs@stdin.nl>
Mon, 29 Sep 2008 10:42:13 +0000 (10:42 +0000)
committerMatthijs Kooijman <matthijs@stdin.nl>
Mon, 29 Sep 2008 10:42:13 +0000 (10:42 +0000)
I originally made this script to show that scalarrepl didn't support them, but
it turned out it does. Better to still add the testcase then.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@56781 91177308-0d34-0410-b5e6-96231b3b80d8

test/Transforms/ScalarRepl/load-store-aggregate.ll [new file with mode: 0644]

diff --git a/test/Transforms/ScalarRepl/load-store-aggregate.ll b/test/Transforms/ScalarRepl/load-store-aggregate.ll
new file mode 100644 (file)
index 0000000..df13db7
--- /dev/null
@@ -0,0 +1,30 @@
+; This testcase shows that scalarrepl is able to replace struct alloca's which
+; are directly loaded from or stored to (using the first class aggregates
+; feature).
+
+; RUN: llvm-as < %s | opt -scalarrepl | llvm-dis > %t
+; RUN: cat %t | not grep alloca
+
+%struct.foo = type { i32, i32 }
+
+define i32 @test(%struct.foo* %P) {
+entry:
+       %L = alloca %struct.foo, align 8                ; <%struct.foo*> [#uses=2]
+        %V = load %struct.foo* %P
+        store %struct.foo %V, %struct.foo* %L
+
+       %tmp4 = getelementptr %struct.foo* %L, i32 0, i32 0             ; <i32*> [#uses=1]
+       %tmp5 = load i32* %tmp4         ; <i32> [#uses=1]
+       ret i32 %tmp5
+}
+
+define %struct.foo @test2(i32 %A, i32 %B) {
+entry:
+       %L = alloca %struct.foo, align 8                ; <%struct.foo*> [#uses=2]
+        %L.0 = getelementptr %struct.foo* %L, i32 0, i32 0
+        store i32 %A, i32* %L.0
+        %L.1 = getelementptr %struct.foo* %L, i32 0, i32 1
+        store i32 %B, i32* %L.1
+        %V = load %struct.foo* %L
+        ret %struct.foo %V
+}