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