| ; RUN: llc -O3 -mtriple=amdgcn < %s | FileCheck --check-prefix=CHECK %s |
| |
| ; SIInsertWaitcnts should preserve waitcnt instructions coming from the user |
| |
| ; CHECK-LABEL: test_waitcnt_asm |
| ; CHECK: s_waitcnt vmcnt(0) |
| ; CHECK: s_waitcnt vmcnt(0) |
| ; CHECK: s_waitcnt vmcnt(0) |
| ; CHECK-NOT: s_waitcnt |
| ; CHECK: s_endpgm |
| define amdgpu_kernel void @test_waitcnt_asm() { |
| call void asm sideeffect "s_waitcnt vmcnt(0)", ""() |
| call void asm sideeffect "s_waitcnt vmcnt(0)", ""() |
| call void asm sideeffect "s_waitcnt vmcnt(0)", ""() |
| ret void |
| } |
| |
| ; CHECK-LABEL: test_waitcnt_vscnt_asm |
| ; CHECK: s_waitcnt_vscnt null, 0x0 |
| ; CHECK: s_waitcnt_vscnt null, 0x0 |
| ; CHECK: s_waitcnt_vscnt null, 0x0 |
| ; CHECK-NOT: s_waitcnt |
| ; CHECK: s_endpgm |
| define amdgpu_kernel void @test_waitcnt_vscnt_asm() { |
| call void asm sideeffect "s_waitcnt_vscnt null, 0x0", ""() |
| call void asm sideeffect "s_waitcnt_vscnt null, 0x0", ""() |
| call void asm sideeffect "s_waitcnt_vscnt null, 0x0", ""() |
| ret void |
| } |
| |
| ; CHECK-LABEL: test_waitcnt_builtin |
| ; CHECK: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; CHECK-NOT: s_waitcnt |
| ; CHECK: s_endpgm |
| define amdgpu_kernel void @test_waitcnt_builtin() { |
| call void @llvm.amdgcn.s.waitcnt(i32 0) |
| call void @llvm.amdgcn.s.waitcnt(i32 0) |
| call void @llvm.amdgcn.s.waitcnt(i32 0) |
| ret void |
| } |
| |
| ; CHECK-LABEL: test_waitcnt_builtin_non_kernel |
| ; CHECK: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0) |
| ; CHECK-NOT: s_waitcnt |
| ; CHECK: s_setpc |
| define void @test_waitcnt_builtin_non_kernel() { |
| call void @llvm.amdgcn.s.waitcnt(i32 0) |
| call void @llvm.amdgcn.s.waitcnt(i32 0) |
| call void @llvm.amdgcn.s.waitcnt(i32 0) |
| ret void |
| } |
| |
| declare void @llvm.amdgcn.s.waitcnt(i32) |