| ; RUN: not opt -S %s 2>&1 | FileCheck %s |
| |
| declare void @llvm.amdgcn.kill(i1) |
| |
| ; CHECK: Callbr amdgcn_kill only supports one indirect dest |
| define void @test_callbr_intrinsic_indirect0(i1 %c) { |
| callbr void @llvm.amdgcn.kill(i1 %c) to label %cont [] |
| kill: |
| unreachable |
| cont: |
| ret void |
| } |
| |
| ; CHECK-NEXT: Callbr amdgcn_kill only supports one indirect dest |
| define void @test_callbr_intrinsic_indirect2(i1 %c) { |
| callbr void @llvm.amdgcn.kill(i1 %c) to label %cont [label %kill1, label %kill2] |
| kill1: |
| unreachable |
| kill2: |
| unreachable |
| cont: |
| ret void |
| } |
| |
| ; CHECK-NEXT: Callbr amdgcn_kill indirect dest needs to be unreachable |
| define void @test_callbr_intrinsic_no_unreachable(i1 %c) { |
| callbr void @llvm.amdgcn.kill(i1 %c) to label %cont [label %kill] |
| kill: |
| ret void |
| cont: |
| ret void |
| } |
| |
| ; CHECK-NEXT: Callbr currently only supports asm-goto and selected intrinsics |
| declare i32 @llvm.amdgcn.workitem.id.x() |
| define void @test_callbr_intrinsic_unsupported() { |
| callbr i32 @llvm.amdgcn.workitem.id.x() to label %cont [] |
| cont: |
| ret void |
| } |
| |
| ; CHECK-NEXT: Callbr: indirect function / invalid signature |
| define void @test_callbr_intrinsic_wrong_signature(ptr %ptr) { |
| %func = load ptr, ptr %ptr, align 8 |
| callbr void %func() to label %cont [] |
| cont: |
| ret void |
| } |
| |
| ; CHECK-NEXT: Callbr for intrinsics currently doesn't support operand bundles |
| define void @test_callbr_intrinsic_no_operand_bundles(i1 %c) { |
| callbr void @llvm.amdgcn.kill(i1 %c) [ "foo"(i1 %c) ] to label %cont [label %kill] |
| kill: |
| unreachable |
| cont: |
| ret void |
| } |