1 ; RUN: llc -mtriple=amdgcn-amd- -mcpu=gfx600 -verify-machineinstrs < %s | FileCheck -check-prefixes=FUNC,GCN,GFX6,GFX68 %s 2 ; RUN: llc -mtriple=amdgcn-amd- -mcpu=gfx803 -verify-machineinstrs < %s | FileCheck -check-prefixes=FUNC,GCN,GFX8,GFX68 %s 3 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx803 -verify-machineinstrs < %s | FileCheck -check-prefixes=FUNC,GCN,GFX8,GFX68 %s 4 5 ; FUNC-LABEL: {{^}}system_acquire: 6 ; GCN: %bb.0 7 ; GCN-NOT: ATOMIC_FENCE 8 ; GFX6: s_waitcnt vmcnt(0){{$}} 9 ; GFX6-NEXT: buffer_wbinvl1{{$}} 10 ; GFX8: s_waitcnt vmcnt(0){{$}} 11 ; GFX8-NEXT: buffer_wbinvl1_vol{{$}} 12 ; GCN: s_endpgm 13 define amdgpu_kernel void @system_acquire() { 14 entry: 15 fence acquire 16 ret void 17 } 18 19 ; FUNC-LABEL: {{^}}system_release: 20 ; GCN: %bb.0 21 ; GCN-NOT: ATOMIC_FENCE 22 ; GCN: s_waitcnt vmcnt(0){{$}} 23 ; GCN: s_endpgm 24 define amdgpu_kernel void @system_release() { 25 entry: 26 fence release 27 ret void 28 } 29 30 ; FUNC-LABEL: {{^}}system_acq_rel: 31 ; GCN: %bb.0 32 ; GCN-NOT: ATOMIC_FENCE 33 ; GCN: s_waitcnt vmcnt(0){{$}} 34 ; GFX6: buffer_wbinvl1{{$}} 35 ; GFX8: buffer_wbinvl1_vol{{$}} 36 ; GCN: s_endpgm 37 define amdgpu_kernel void @system_acq_rel() { 38 entry: 39 fence acq_rel 40 ret void 41 } 42 43 ; FUNC-LABEL: {{^}}system_seq_cst: 44 ; GCN: %bb.0 45 ; GCN-NOT: ATOMIC_FENCE 46 ; GCN: s_waitcnt vmcnt(0){{$}} 47 ; GFX6: buffer_wbinvl1{{$}} 48 ; GFX8: buffer_wbinvl1_vol{{$}} 49 ; GCN: s_endpgm 50 define amdgpu_kernel void @system_seq_cst() { 51 entry: 52 fence seq_cst 53 ret void 54 } 55 56 ; FUNC-LABEL: {{^}}singlethread_acquire: 57 ; GCN: %bb.0 58 ; GCN-NOT: ATOMIC_FENCE 59 ; GCN: s_endpgm 60 define amdgpu_kernel void @singlethread_acquire() { 61 entry: 62 fence syncscope("singlethread") acquire 63 ret void 64 } 65 66 ; FUNC-LABEL: {{^}}singlethread_release: 67 ; GCN: %bb.0 68 ; GCN-NOT: ATOMIC_FENCE 69 ; GCN: s_endpgm 70 define amdgpu_kernel void @singlethread_release() { 71 entry: 72 fence syncscope("singlethread") release 73 ret void 74 } 75 76 ; FUNC-LABEL: {{^}}singlethread_acq_rel: 77 ; GCN: %bb.0 78 ; GCN-NOT: ATOMIC_FENCE 79 ; GCN: s_endpgm 80 define amdgpu_kernel void @singlethread_acq_rel() { 81 entry: 82 fence syncscope("singlethread") acq_rel 83 ret void 84 } 85 86 ; FUNC-LABEL: {{^}}singlethread_seq_cst: 87 ; GCN: %bb.0 88 ; GCN-NOT: ATOMIC_FENCE 89 ; GCN: s_endpgm 90 define amdgpu_kernel void @singlethread_seq_cst() { 91 entry: 92 fence syncscope("singlethread") seq_cst 93 ret void 94 } 95 96 ; FUNC-LABEL: {{^}}agent_acquire: 97 ; GCN: %bb.0 98 ; GCN-NOT: ATOMIC_FENCE 99 ; GFX6: s_waitcnt vmcnt(0){{$}} 100 ; GFX6-NEXT: buffer_wbinvl1{{$}} 101 ; GFX8: s_waitcnt vmcnt(0){{$}} 102 ; GFX8-NEXT: buffer_wbinvl1_vol{{$}} 103 ; GCN: s_endpgm 104 define amdgpu_kernel void @agent_acquire() { 105 entry: 106 fence syncscope("agent") acquire 107 ret void 108 } 109 110 ; FUNC-LABEL: {{^}}agent_release: 111 ; GCN: %bb.0 112 ; GCN-NOT: ATOMIC_FENCE 113 ; GCN: s_waitcnt vmcnt(0){{$}} 114 ; GCN: s_endpgm 115 define amdgpu_kernel void @agent_release() { 116 entry: 117 fence syncscope("agent") release 118 ret void 119 } 120 121 ; FUNC-LABEL: {{^}}agent_acq_rel: 122 ; GCN: %bb.0 123 ; GCN-NOT: ATOMIC_FENCE 124 ; GCN: s_waitcnt vmcnt(0){{$}} 125 ; GFX6: buffer_wbinvl1{{$}} 126 ; GFX8: buffer_wbinvl1_vol{{$}} 127 ; GCN: s_endpgm 128 define amdgpu_kernel void @agent_acq_rel() { 129 entry: 130 fence syncscope("agent") acq_rel 131 ret void 132 } 133 134 ; FUNC-LABEL: {{^}}agent_seq_cst: 135 ; GCN: %bb.0 136 ; GCN-NOT: ATOMIC_FENCE 137 ; GCN: s_waitcnt vmcnt(0){{$}} 138 ; GFX6: buffer_wbinvl1{{$}} 139 ; GFX8: buffer_wbinvl1_vol{{$}} 140 ; GCN: s_endpgm 141 define amdgpu_kernel void @agent_seq_cst() { 142 entry: 143 fence syncscope("agent") seq_cst 144 ret void 145 } 146 147 ; FUNC-LABEL: {{^}}workgroup_acquire: 148 ; GCN: %bb.0 149 ; GFX68-NOT: s_waitcnt vmcnt(0){{$}} 150 ; GCN-NOT: ATOMIC_FENCE 151 ; GCN: s_endpgm 152 define amdgpu_kernel void @workgroup_acquire() { 153 entry: 154 fence syncscope("workgroup") acquire 155 ret void 156 } 157 158 ; FUNC-LABEL: {{^}}workgroup_release: 159 ; GCN: %bb.0 160 ; GFX68-NOT: s_waitcnt vmcnt(0){{$}} 161 ; GCN-NOT: ATOMIC_FENCE 162 ; GCN: s_endpgm 163 define amdgpu_kernel void @workgroup_release() { 164 entry: 165 fence syncscope("workgroup") release 166 ret void 167 } 168 169 ; FUNC-LABEL: {{^}}workgroup_acq_rel: 170 ; GCN: %bb.0 171 ; GFX68-NOT: s_waitcnt vmcnt(0){{$}} 172 ; GCN-NOT: ATOMIC_FENCE 173 ; GCN: s_endpgm 174 define amdgpu_kernel void @workgroup_acq_rel() { 175 entry: 176 fence syncscope("workgroup") acq_rel 177 ret void 178 } 179 180 ; FUNC-LABEL: {{^}}workgroup_seq_cst: 181 ; GCN: %bb.0 182 ; GFX68-NOT: s_waitcnt vmcnt(0){{$}} 183 ; GCN-NOT: ATOMIC_FENCE 184 ; GCN: s_endpgm 185 define amdgpu_kernel void @workgroup_seq_cst() { 186 entry: 187 fence syncscope("workgroup") seq_cst 188 ret void 189 } 190 191 ; FUNC-LABEL: {{^}}wavefront_acquire: 192 ; GCN: %bb.0 193 ; GCN-NOT: ATOMIC_FENCE 194 ; GCN: s_endpgm 195 define amdgpu_kernel void @wavefront_acquire() { 196 entry: 197 fence syncscope("wavefront") acquire 198 ret void 199 } 200 201 ; FUNC-LABEL: {{^}}wavefront_release: 202 ; GCN: %bb.0 203 ; GCN-NOT: ATOMIC_FENCE 204 ; GCN: s_endpgm 205 define amdgpu_kernel void @wavefront_release() { 206 entry: 207 fence syncscope("wavefront") release 208 ret void 209 } 210 211 ; FUNC-LABEL: {{^}}wavefront_acq_rel: 212 ; GCN: %bb.0 213 ; GCN-NOT: ATOMIC_FENCE 214 ; GCN: s_endpgm 215 define amdgpu_kernel void @wavefront_acq_rel() { 216 entry: 217 fence syncscope("wavefront") acq_rel 218 ret void 219 } 220 221 ; FUNC-LABEL: {{^}}wavefront_seq_cst: 222 ; GCN: %bb.0 223 ; GCN-NOT: ATOMIC_FENCE 224 ; GCN: s_endpgm 225 define amdgpu_kernel void @wavefront_seq_cst() { 226 entry: 227 fence syncscope("wavefront") seq_cst 228 ret void 229 } 230