xref: /llvm-project/llvm/test/Verifier/preallocated-valid.ll (revision c820f2a43eaba02db97c4ff60c58a58e6bdd391d)
1; RUN: opt -S %s -passes=verify
2
3declare token @llvm.call.preallocated.setup(i32)
4declare ptr @llvm.call.preallocated.arg(token, i32)
5declare void @llvm.call.preallocated.teardown(token)
6
7declare i32 @__CxxFrameHandler3(...)
8
9declare void @foo1(ptr preallocated(i32))
10declare i64 @foo1_i64(ptr preallocated(i32))
11declare void @foo2(ptr preallocated(i32), ptr, ptr preallocated(i32))
12
13declare void @constructor(ptr)
14
15define void @preallocated() {
16    %cs = call token @llvm.call.preallocated.setup(i32 1)
17    %x = call ptr @llvm.call.preallocated.arg(token %cs, i32 0) preallocated(i32)
18    call void @foo1(ptr preallocated(i32) %x) ["preallocated"(token %cs)]
19    ret void
20}
21
22define void @preallocated_indirect(ptr %f) {
23    %cs = call token @llvm.call.preallocated.setup(i32 1)
24    %x = call ptr @llvm.call.preallocated.arg(token %cs, i32 0) preallocated(i32)
25    call void %f(ptr preallocated(i32) %x) ["preallocated"(token %cs)]
26    ret void
27}
28
29define void @preallocated_setup_without_call() {
30    %cs = call token @llvm.call.preallocated.setup(i32 1)
31    %a0 = call ptr @llvm.call.preallocated.arg(token %cs, i32 0) preallocated(i32)
32    ret void
33}
34
35define void @preallocated_num_args() {
36    %cs = call token @llvm.call.preallocated.setup(i32 2)
37    %x = call ptr @llvm.call.preallocated.arg(token %cs, i32 0) preallocated(i32)
38    %y = call ptr @llvm.call.preallocated.arg(token %cs, i32 1) preallocated(i32)
39    %a = inttoptr i32 0 to ptr
40    call void @foo2(ptr preallocated(i32) %x, ptr %a, ptr preallocated(i32) %y) ["preallocated"(token %cs)]
41    ret void
42}
43
44define void @preallocated_musttail(ptr preallocated(i32) %a) {
45    musttail call void @foo1(ptr preallocated(i32) %a)
46    ret void
47}
48
49define i64 @preallocated_musttail_i64(ptr preallocated(i32) %a) {
50    %r = musttail call i64 @foo1_i64(ptr preallocated(i32) %a)
51    ret i64 %r
52}
53
54define void @preallocated_teardown() {
55    %cs = call token @llvm.call.preallocated.setup(i32 1)
56    call void @llvm.call.preallocated.teardown(token %cs)
57    ret void
58}
59
60define void @preallocated_teardown_invoke() personality ptr @__CxxFrameHandler3 {
61    %cs = call token @llvm.call.preallocated.setup(i32 1)
62    %x = call ptr @llvm.call.preallocated.arg(token %cs, i32 0) preallocated(i32)
63    invoke void @constructor(ptr %x) to label %conta unwind label %contb
64conta:
65    call void @foo1(ptr preallocated(i32) %x) ["preallocated"(token %cs)]
66    ret void
67contb:
68    %s = catchswitch within none [label %catch] unwind to caller
69catch:
70    %p = catchpad within %s []
71    call void @llvm.call.preallocated.teardown(token %cs)
72    ret void
73}
74