aboutsummaryrefslogtreecommitdiffstats
path: root/test/Transforms/ArgumentPromotion
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2008-01-11 22:31:41 +0000
committerChris Lattner <sabre@nondot.org>2008-01-11 22:31:41 +0000
commit10603e0c84d15f61443e8b17bc35f98cc46606d9 (patch)
treea2d32e3c8ac1eba6c34f94ea6f394b0e1a97fdfc /test/Transforms/ArgumentPromotion
parent8bc16f0e0e31061fde5baa4c1691f659043e746e (diff)
downloadexternal_llvm-10603e0c84d15f61443e8b17bc35f98cc46606d9.zip
external_llvm-10603e0c84d15f61443e8b17bc35f98cc46606d9.tar.gz
external_llvm-10603e0c84d15f61443e8b17bc35f98cc46606d9.tar.bz2
Teach argpromote to ruthlessly hack small byval structs when it can
get away with it, which exposes opportunities to eliminate the memory objects entirely. For example, we now compile byval.ll to: define internal void @f1(i32 %b.0, i64 %b.1) { entry: %tmp2 = add i32 %b.0, 1 ; <i32> [#uses=0] ret void } define i32 @main() nounwind { entry: call void @f1( i32 1, i64 2 ) ret i32 0 } This seems like it would trigger a lot for code that passes around small structs (e.g. SDOperand's or _Complex)... git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@45886 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/ArgumentPromotion')
-rw-r--r--test/Transforms/ArgumentPromotion/byval.ll24
1 files changed, 24 insertions, 0 deletions
diff --git a/test/Transforms/ArgumentPromotion/byval.ll b/test/Transforms/ArgumentPromotion/byval.ll
new file mode 100644
index 0000000..3a3458f
--- /dev/null
+++ b/test/Transforms/ArgumentPromotion/byval.ll
@@ -0,0 +1,24 @@
+; RUN: llvm-as < %s | opt -argpromotion -scalarrepl | llvm-dis | not grep load
+; Argpromote + scalarrepl should change this to passing the two integers by value.
+
+ %struct.ss = type { i32, i64 }
+
+define internal void @f(%struct.ss* byval %b) nounwind {
+entry:
+ %tmp = getelementptr %struct.ss* %b, i32 0, i32 0 ; <i32*> [#uses=2]
+ %tmp1 = load i32* %tmp, align 4 ; <i32> [#uses=1]
+ %tmp2 = add i32 %tmp1, 1 ; <i32> [#uses=1]
+ store i32 %tmp2, i32* %tmp, align 4
+ ret void
+}
+
+define i32 @main() nounwind {
+entry:
+ %S = alloca %struct.ss ; <%struct.ss*> [#uses=4]
+ %tmp1 = getelementptr %struct.ss* %S, i32 0, i32 0 ; <i32*> [#uses=1]
+ store i32 1, i32* %tmp1, align 8
+ %tmp4 = getelementptr %struct.ss* %S, i32 0, i32 1 ; <i64*> [#uses=1]
+ store i64 2, i64* %tmp4, align 4
+ call void @f( %struct.ss* byval %S ) nounwind
+ ret i32 0
+}