1; RUN: opt < %s -passes='function-attrs' -S | FileCheck %s
2
3declare i32 @f()
4
5; CHECK: Function Attrs: noreturn
6; CHECK-NEXT: @noreturn()
7declare i32 @noreturn() noreturn
8
9; CHECK: Function Attrs: noreturn
10; CHECK-NEXT: @caller()
11define i32 @caller() {
12  %c = call i32 @noreturn()
13  ret i32 %c
14}
15
16; CHECK: Function Attrs: noreturn
17; CHECK-NEXT: @caller2()
18define i32 @caller2() {
19  %c = call i32 @caller()
20  ret i32 %c
21}
22
23; CHECK: Function Attrs: noreturn
24; CHECK-NEXT: @caller3()
25define i32 @caller3() {
26entry:
27  br label %end
28end:
29  %c = call i32 @noreturn()
30  ret i32 %c
31}
32
33; CHECK-NOT: Function Attrs: {{.*}}noreturn
34; CHECK: define i32 @caller4()
35define i32 @caller4() {
36entry:
37  br label %end
38end:
39  %c = call i32 @f()
40  ret i32 %c
41}
42
43; CHECK: Function Attrs: {{.*}}noreturn
44; CHECK: @caller5()
45define i32 @caller5() {
46entry:
47  %c = call i32 @noreturn()
48  ret i32 %c
49unreach:
50  %d = call i32 @f()
51  ret i32 %d
52}
53
54; CHECK-NOT: Function Attrs: {{.*}}noreturn
55; CHECK: @caller6()
56define i32 @caller6() naked {
57  %c = call i32 @noreturn()
58  ret i32 %c
59}
60
61; CHECK: Function Attrs: {{.*}}noreturn
62; CHECK-NEXT: @alreadynoreturn()
63define i32 @alreadynoreturn() noreturn {
64  unreachable
65}
66
67; CHECK: Function Attrs: {{.*}}noreturn
68; CHECK-NEXT: @callsite_noreturn()
69define void @callsite_noreturn() {
70  call i32 @f() noreturn
71  ret void
72}
73
74; CHECK: Function Attrs: {{.*}}noreturn
75; CHECK-NEXT: @unreachable
76define void @unreachable() {
77  unreachable
78}
79
80; CHECK-NOT: Function Attrs: {{.*}}noreturn
81; CHECK: @coro
82define void @coro() presplitcoroutine {
83  call token @llvm.coro.id.retcon.once(i32 0, i32 0, i8* null, i8* bitcast(void() *@coro to i8*), i8* null, i8* null)
84  call i1 @llvm.coro.end(i8* null, i1 false)
85  unreachable
86}
87
88declare token @llvm.coro.id.retcon.once(i32 %size, i32 %align, i8* %buffer, i8* %prototype, i8* %alloc, i8* %free)
89declare i1 @llvm.coro.end(i8*, i1)
90