summaryrefslogtreecommitdiffstats
path: root/llvm/test/Transforms
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2018-04-02 22:49:44 +0000
committerReid Kleckner <rnk@google.com>2018-04-02 22:49:44 +0000
commit298ffc609bf5c67079dbeb77e3f75e5bc18fde7a (patch)
tree4649969364fa70560d90c85ab2932a7751491353 /llvm/test/Transforms
parent637fd446d926fc35d14fbe59fe38117997b9d582 (diff)
downloadbcm5719-llvm-298ffc609bf5c67079dbeb77e3f75e5bc18fde7a.tar.gz
bcm5719-llvm-298ffc609bf5c67079dbeb77e3f75e5bc18fde7a.zip
[InstCombine] Don't strip function type casts from musttail calls
Summary: The cast simplifications that instcombine does here do not make any attempt to obey the verifier rules for musttail calls. Therefore we have to disable them. Reviewers: efriedma, majnemer, pcc Subscribers: hiraditya, llvm-commits Differential Revision: https://reviews.llvm.org/D45186 llvm-svn: 329027
Diffstat (limited to 'llvm/test/Transforms')
-rw-r--r--llvm/test/Transforms/InstCombine/musttail-thunk.ll32
1 files changed, 32 insertions, 0 deletions
diff --git a/llvm/test/Transforms/InstCombine/musttail-thunk.ll b/llvm/test/Transforms/InstCombine/musttail-thunk.ll
new file mode 100644
index 00000000000..4038aa525a5
--- /dev/null
+++ b/llvm/test/Transforms/InstCombine/musttail-thunk.ll
@@ -0,0 +1,32 @@
+; RUN: opt -instcombine -S < %s | FileCheck %s
+
+; These are both direct calls, but make sure instcombine leaves the casts
+; alone.
+
+define i32 @call_thunk(i32 %x, i32 %y) {
+ %r = call i32 bitcast (void (i32, ...)* @inc_first_arg_thunk to i32 (i32, i32)*)(i32 %x, i32 %y)
+ ret i32 %r
+}
+
+; CHECK-LABEL: define i32 @call_thunk(i32 %x, i32 %y)
+; CHECK: %r = call i32 bitcast (void (i32, ...)* @inc_first_arg_thunk to i32 (i32, i32)*)(i32 %x, i32 %y)
+; CHECK: ret i32 %r
+
+define internal void @inc_first_arg_thunk(i32 %arg1, ...) #0 {
+entry:
+ %inc = add i32 %arg1, 1
+ musttail call void (i32, ...) bitcast (i32 (i32, i32)* @plus to void (i32, ...)*)(i32 %inc, ...)
+ ret void
+}
+
+; CHECK-LABEL: define internal void @inc_first_arg_thunk(i32 %arg1, ...) #0
+; CHECK: %inc = add i32 %arg1, 1
+; CHECK: musttail call void (i32, ...) bitcast (i32 (i32, i32)* @plus to void (i32, ...)*)(i32 %inc, ...)
+; CHECK: ret void
+
+define internal i32 @plus(i32 %x, i32 %y) {
+ %r = add i32 %x, %y
+ ret i32 %r
+}
+
+attributes #0 = { "thunk" }
OpenPOWER on IntegriCloud