| ; RUN: opt < %s -passes='function-attrs' -S | FileCheck %s |
| |
| declare i32 @f() |
| |
| ; CHECK: Function Attrs: noreturn |
| ; CHECK-NEXT: @noreturn() |
| declare i32 @noreturn() noreturn |
| |
| ; CHECK: Function Attrs: noreturn |
| ; CHECK-NEXT: @caller() |
| define i32 @caller() { |
| %c = call i32 @noreturn() |
| ret i32 %c |
| } |
| |
| ; CHECK: Function Attrs: noreturn |
| ; CHECK-NEXT: @caller2() |
| define i32 @caller2() { |
| %c = call i32 @caller() |
| ret i32 %c |
| } |
| |
| ; CHECK: Function Attrs: noreturn |
| ; CHECK-NEXT: @caller3() |
| define i32 @caller3() { |
| entry: |
| br label %end |
| end: |
| %c = call i32 @noreturn() |
| ret i32 %c |
| } |
| |
| ; CHECK-NOT: Function Attrs: {{.*}}noreturn |
| ; CHECK: define i32 @caller4() |
| define i32 @caller4() { |
| entry: |
| br label %end |
| end: |
| %c = call i32 @f() |
| ret i32 %c |
| } |
| |
| ; CHECK-NOT: Function Attrs: {{.*}}noreturn |
| ; CHECK: @caller5() |
| ; We currently don't handle unreachable blocks. |
| define i32 @caller5() { |
| entry: |
| %c = call i32 @noreturn() |
| ret i32 %c |
| unreach: |
| %d = call i32 @f() |
| ret i32 %d |
| } |
| |
| ; CHECK-NOT: Function Attrs: {{.*}}noreturn |
| ; CHECK: @caller6() |
| define i32 @caller6() naked { |
| %c = call i32 @noreturn() |
| ret i32 %c |
| } |
| |
| ; CHECK: Function Attrs: {{.*}}noreturn |
| ; CHECK-NEXT: @alreadynoreturn() |
| define i32 @alreadynoreturn() noreturn { |
| unreachable |
| } |
| |
| ; CHECK: Function Attrs: {{.*}}noreturn |
| ; CHECK-NEXT: @callsite_noreturn() |
| define void @callsite_noreturn() { |
| call i32 @f() noreturn |
| ret void |
| } |
| |
| ; CHECK: Function Attrs: {{.*}}noreturn |
| ; CHECK-NEXT: @unreachable |
| define void @unreachable() { |
| unreachable |
| } |
| |
| ; CHECK-NOT: Function Attrs: {{.*}}noreturn |
| ; CHECK: @coro |
| define void @coro() "coroutine.presplit"="1" { |
| call token @llvm.coro.id.retcon.once(i32 0, i32 0, i8* null, i8* bitcast(void() *@coro to i8*), i8* null, i8* null) |
| call i1 @llvm.coro.end(i8* null, i1 false) |
| unreachable |
| } |
| |
| declare token @llvm.coro.id.retcon.once(i32 %size, i32 %align, i8* %buffer, i8* %prototype, i8* %alloc, i8* %free) |
| declare i1 @llvm.coro.end(i8*, i1) |