[RISCV] Support 'f' Inline Assembly Constraint
[llvm-core.git] / test / CodeGen / AMDGPU / call-waitcnt.ll
blob72423ec4189e5e4a6f19099c40423b52eb9badaf
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 < %s | FileCheck -enable-var-scope -check-prefix=GCN %s
4 ; Load argument depends on waitcnt which should be skipped.
5 define amdgpu_kernel void @call_memory_arg_load(i32 addrspace(3)* %ptr, i32) #0 {
6 ; GCN-LABEL: call_memory_arg_load:
7 ; GCN:       ; %bb.0:
8 ; GCN-NEXT:    s_load_dword s4, s[4:5], 0x0
9 ; GCN-NEXT:    s_mov_b32 s33, s9
10 ; GCN-NEXT:    s_add_u32 flat_scratch_lo, s6, s33
11 ; GCN-NEXT:    s_addc_u32 flat_scratch_hi, s7, 0
12 ; GCN-NEXT:    s_mov_b32 s32, s33
13 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
14 ; GCN-NEXT:    v_mov_b32_e32 v0, s4
15 ; GCN-NEXT:    ds_read_b32 v0, v0
16 ; GCN-NEXT:    s_getpc_b64 s[4:5]
17 ; GCN-NEXT:    s_add_u32 s4, s4, func@rel32@lo+4
18 ; GCN-NEXT:    s_addc_u32 s5, s5, func@rel32@hi+4
19 ; GCN-NEXT:    s_swappc_b64 s[30:31], s[4:5]
20 ; GCN-NEXT:    s_endpgm
21   %vgpr = load volatile i32, i32 addrspace(3)* %ptr
22   call void @func(i32 %vgpr)
23   ret void
26 ; Memory waitcnt with no register dependence on the call
27 define amdgpu_kernel void @call_memory_no_dep(i32 addrspace(1)* %ptr, i32) #0 {
28 ; GCN-LABEL: call_memory_no_dep:
29 ; GCN:       ; %bb.0:
30 ; GCN-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x0
31 ; GCN-NEXT:    s_mov_b32 s33, s9
32 ; GCN-NEXT:    s_add_u32 flat_scratch_lo, s6, s33
33 ; GCN-NEXT:    v_mov_b32_e32 v2, 0
34 ; GCN-NEXT:    s_addc_u32 flat_scratch_hi, s7, 0
35 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
36 ; GCN-NEXT:    v_mov_b32_e32 v0, s4
37 ; GCN-NEXT:    v_mov_b32_e32 v1, s5
38 ; GCN-NEXT:    global_store_dword v[0:1], v2, off
39 ; GCN-NEXT:    v_mov_b32_e32 v0, 0
40 ; GCN-NEXT:    s_getpc_b64 s[6:7]
41 ; GCN-NEXT:    s_add_u32 s6, s6, func@rel32@lo+4
42 ; GCN-NEXT:    s_addc_u32 s7, s7, func@rel32@hi+4
43 ; GCN-NEXT:    s_mov_b32 s32, s33
44 ; GCN-NEXT:    s_swappc_b64 s[30:31], s[6:7]
45 ; GCN-NEXT:    s_endpgm
46   store i32 0, i32 addrspace(1)* %ptr
47   call void @func(i32 0)
48   ret void
51 ; Should not wait after the call before memory
52 define amdgpu_kernel void @call_no_wait_after_call(i32 addrspace(1)* %ptr, i32) #0 {
53 ; GCN-LABEL: call_no_wait_after_call:
54 ; GCN:       ; %bb.0:
55 ; GCN-NEXT:    s_load_dwordx2 s[34:35], s[4:5], 0x0
56 ; GCN-NEXT:    s_mov_b32 s33, s9
57 ; GCN-NEXT:    s_add_u32 flat_scratch_lo, s6, s33
58 ; GCN-NEXT:    s_addc_u32 flat_scratch_hi, s7, 0
59 ; GCN-NEXT:    v_mov_b32_e32 v0, 0
60 ; GCN-NEXT:    s_getpc_b64 s[4:5]
61 ; GCN-NEXT:    s_add_u32 s4, s4, func@rel32@lo+4
62 ; GCN-NEXT:    s_addc_u32 s5, s5, func@rel32@hi+4
63 ; GCN-NEXT:    s_mov_b32 s32, s33
64 ; GCN-NEXT:    v_mov_b32_e32 v32, 0
65 ; GCN-NEXT:    s_swappc_b64 s[30:31], s[4:5]
66 ; GCN-NEXT:    v_mov_b32_e32 v0, s34
67 ; GCN-NEXT:    v_mov_b32_e32 v1, s35
68 ; GCN-NEXT:    global_store_dword v[0:1], v32, off
69 ; GCN-NEXT:    s_endpgm
70   call void @func(i32 0)
71   store i32 0, i32 addrspace(1)* %ptr
72   ret void
75 define amdgpu_kernel void @call_no_wait_after_call_return_val(i32 addrspace(1)* %ptr, i32) #0 {
76 ; GCN-LABEL: call_no_wait_after_call_return_val:
77 ; GCN:       ; %bb.0:
78 ; GCN-NEXT:    s_load_dwordx2 s[34:35], s[4:5], 0x0
79 ; GCN-NEXT:    s_mov_b32 s33, s9
80 ; GCN-NEXT:    s_add_u32 flat_scratch_lo, s6, s33
81 ; GCN-NEXT:    s_addc_u32 flat_scratch_hi, s7, 0
82 ; GCN-NEXT:    v_mov_b32_e32 v0, 0
83 ; GCN-NEXT:    s_getpc_b64 s[4:5]
84 ; GCN-NEXT:    s_add_u32 s4, s4, func.return@rel32@lo+4
85 ; GCN-NEXT:    s_addc_u32 s5, s5, func.return@rel32@hi+4
86 ; GCN-NEXT:    s_mov_b32 s32, s33
87 ; GCN-NEXT:    s_swappc_b64 s[30:31], s[4:5]
88 ; GCN-NEXT:    v_mov_b32_e32 v1, s34
89 ; GCN-NEXT:    v_mov_b32_e32 v2, s35
90 ; GCN-NEXT:    global_store_dword v[1:2], v0, off
91 ; GCN-NEXT:    s_endpgm
92   %rv = call i32 @func.return(i32 0)
93   store i32 %rv, i32 addrspace(1)* %ptr
94   ret void
97 ; Need to wait for the address dependency
98 define amdgpu_kernel void @call_got_load(i32 addrspace(1)* %ptr, i32) #0 {
99 ; GCN-LABEL: call_got_load:
100 ; GCN:       ; %bb.0:
101 ; GCN-NEXT:    s_mov_b32 s33, s9
102 ; GCN-NEXT:    s_add_u32 flat_scratch_lo, s6, s33
103 ; GCN-NEXT:    s_addc_u32 flat_scratch_hi, s7, 0
104 ; GCN-NEXT:    s_getpc_b64 s[4:5]
105 ; GCN-NEXT:    s_add_u32 s4, s4, got.func@gotpcrel32@lo+4
106 ; GCN-NEXT:    s_addc_u32 s5, s5, got.func@gotpcrel32@hi+4
107 ; GCN-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x0
108 ; GCN-NEXT:    v_mov_b32_e32 v0, 0
109 ; GCN-NEXT:    s_mov_b32 s32, s33
110 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
111 ; GCN-NEXT:    s_swappc_b64 s[30:31], s[4:5]
112 ; GCN-NEXT:    s_endpgm
113   call void @got.func(i32 0)
114   ret void
117 ; Need to wait for the address dependency
118 define void @tailcall_got_load(i32 addrspace(1)* %ptr, i32) #0 {
119 ; GCN-LABEL: tailcall_got_load:
120 ; GCN:       ; %bb.0:
121 ; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
122 ; GCN-NEXT:    s_getpc_b64 s[4:5]
123 ; GCN-NEXT:    s_add_u32 s4, s4, got.func@gotpcrel32@lo+4
124 ; GCN-NEXT:    s_addc_u32 s5, s5, got.func@gotpcrel32@hi+4
125 ; GCN-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x0
126 ; GCN-NEXT:    v_mov_b32_e32 v0, 0
127 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
128 ; GCN-NEXT:    s_setpc_b64 s[4:5]
129   tail call void @got.func(i32 0)
130   ret void
133 ; No need to wait for the load.
134 define void @tail_call_memory_arg_load(i32 addrspace(3)* %ptr, i32) #0 {
135 ; GCN-LABEL: tail_call_memory_arg_load:
136 ; GCN:       ; %bb.0:
137 ; GCN-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
138 ; GCN-NEXT:    ds_read_b32 v0, v0
139 ; GCN-NEXT:    s_getpc_b64 s[4:5]
140 ; GCN-NEXT:    s_add_u32 s4, s4, func@rel32@lo+4
141 ; GCN-NEXT:    s_addc_u32 s5, s5, func@rel32@hi+4
142 ; GCN-NEXT:    s_setpc_b64 s[4:5]
143   %vgpr = load volatile i32, i32 addrspace(3)* %ptr
144   tail call void @func(i32 %vgpr)
145   ret void
148 declare hidden void @func(i32) #0
149 declare hidden i32 @func.return(i32) #0
150 declare void @got.func(i32) #0
152 attributes #0 = { nounwind }