summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorReid Kleckner <reid@kleckner.net>2014-08-25 23:58:48 +0000
committerReid Kleckner <reid@kleckner.net>2014-08-25 23:58:48 +0000
commite6e88f99b35f2fde5008e36f0d93f5231564b7d8 (patch)
tree96c5d1a42c544a0e1613d2b03508b1ad747c7849 /llvm/test/Transforms
parent7b967f147714c2d0fa573b9de48f131cb5559551 (diff)
downloadbcm5719-llvm-e6e88f99b35f2fde5008e36f0d93f5231564b7d8.tar.gz
bcm5719-llvm-e6e88f99b35f2fde5008e36f0d93f5231564b7d8.zip
ArgPromotion: Don't touch variadic functions
Adding, removing, or changing non-pack parameters can change the ABI classification of pack parameters. Clang and other frontends encode the classification in the IR of the call site, but the callee side determines it dynamically based on the number of registers consumed so far. Changing the prototype affects the number of registers consumed would break such code. Dead argument elimination performs a similar task and already has a similar check to avoid this problem. Patch by Thomas Jablin! llvm-svn: 216421
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/ArgumentPromotion/variadic.ll28
1 files changed, 28 insertions, 0 deletions
diff --git a/llvm/test/Transforms/ArgumentPromotion/variadic.ll b/llvm/test/Transforms/ArgumentPromotion/variadic.ll
new file mode 100644
index 00000000000..0ae52b3bbbd
--- /dev/null
+++ b/llvm/test/Transforms/ArgumentPromotion/variadic.ll
@@ -0,0 +1,28 @@
+; RUN: opt < %s -argpromotion -S | FileCheck %s
+
+; Unused arguments from variadic functions cannot be eliminated as that changes
+; their classiciation according to the SysV amd64 ABI. Clang and other frontends
+; bake in the classification when they use things like byval, as in this test.
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+%struct.tt0 = type { i64, i64 }
+%struct.__va_list_tag = type { i32, i32, i8*, i8* }
+
+@t45 = internal global %struct.tt0 { i64 1335139741, i64 438042995 }, align 8
+
+; Function Attrs: nounwind uwtable
+define i32 @main(i32 %argc, i8** nocapture readnone %argv) #0 {
+entry:
+ tail call void (i8*, i8*, i8*, i8*, i8*, ...)* @callee_t0f(i8* undef, i8* undef, i8* undef, i8* undef, i8* undef, %struct.tt0* byval align 8 @t45)
+ ret i32 0
+}
+
+; Function Attrs: nounwind uwtable
+define internal void @callee_t0f(i8* nocapture readnone %tp13, i8* nocapture readnone %tp14, i8* nocapture readnone %tp15, i8* nocapture readnone %tp16, i8* nocapture readnone %tp17, ...) {
+entry:
+ ret void
+}
+
+; CHECK-LABEL: define internal void @callee_t0f(i8* nocapture readnone %tp13, i8* nocapture readnone %tp14, i8* nocapture readnone %tp15, i8* nocapture readnone %tp16, i8* nocapture readnone %tp17, ...)
OpenPOWER on IntegriCloud