diff options
| author | Reid Kleckner <rnk@google.com> | 2018-04-02 22:49:44 +0000 |
|---|---|---|
| committer | Reid Kleckner <rnk@google.com> | 2018-04-02 22:49:44 +0000 |
| commit | 298ffc609bf5c67079dbeb77e3f75e5bc18fde7a (patch) | |
| tree | 4649969364fa70560d90c85ab2932a7751491353 /llvm/test/Transforms | |
| parent | 637fd446d926fc35d14fbe59fe38117997b9d582 (diff) | |
| download | bcm5719-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.ll | 32 |
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" } |

