1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py 2# RUN: llc -mtriple=amdgcn -mcpu=tahiti -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX6 %s 3# RUN: llc -mtriple=amdgcn -mcpu=hawaii -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX7 %s 4# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX9 %s 5# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX9 %s 6# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX9 %s 7# RUN: llc -mtriple=amdgcn -mcpu=gfx1200 -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX9 %s 8 9--- 10 11name: load_atomic_local_s32_seq_cst 12legalized: true 13regBankSelected: true 14tracksRegLiveness: true 15 16body: | 17 bb.0: 18 liveins: $vgpr0 19 20 ; GFX6-LABEL: name: load_atomic_local_s32_seq_cst 21 ; GFX6: liveins: $vgpr0 22 ; GFX6-NEXT: {{ $}} 23 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 24 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 25 ; GFX6-NEXT: [[DS_READ_B32_:%[0-9]+]]:vgpr_32 = DS_READ_B32 [[COPY]], 0, 0, implicit $m0, implicit $exec :: (load seq_cst (s32), addrspace 3) 26 ; GFX6-NEXT: $vgpr0 = COPY [[DS_READ_B32_]] 27 ; GFX7-LABEL: name: load_atomic_local_s32_seq_cst 28 ; GFX7: liveins: $vgpr0 29 ; GFX7-NEXT: {{ $}} 30 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 31 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 32 ; GFX7-NEXT: [[DS_READ_B32_:%[0-9]+]]:vgpr_32 = DS_READ_B32 [[COPY]], 0, 0, implicit $m0, implicit $exec :: (load seq_cst (s32), addrspace 3) 33 ; GFX7-NEXT: $vgpr0 = COPY [[DS_READ_B32_]] 34 ; GFX9-LABEL: name: load_atomic_local_s32_seq_cst 35 ; GFX9: liveins: $vgpr0 36 ; GFX9-NEXT: {{ $}} 37 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 38 ; GFX9-NEXT: [[DS_READ_B32_gfx9_:%[0-9]+]]:vgpr_32 = DS_READ_B32_gfx9 [[COPY]], 0, 0, implicit $exec :: (load seq_cst (s32), addrspace 3) 39 ; GFX9-NEXT: $vgpr0 = COPY [[DS_READ_B32_gfx9_]] 40 %0:vgpr(p3) = COPY $vgpr0 41 %1:vgpr(s32) = G_LOAD %0 :: (load seq_cst (s32), align 4, addrspace 3) 42 $vgpr0 = COPY %1 43 44... 45 46--- 47 48name: load_atomic_local_v2s16_seq_cst 49legalized: true 50regBankSelected: true 51tracksRegLiveness: true 52 53body: | 54 bb.0: 55 liveins: $vgpr0 56 57 ; GFX6-LABEL: name: load_atomic_local_v2s16_seq_cst 58 ; GFX6: liveins: $vgpr0 59 ; GFX6-NEXT: {{ $}} 60 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 61 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 62 ; GFX6-NEXT: [[LOAD:%[0-9]+]]:vgpr_32(<2 x s16>) = G_LOAD [[COPY]](p3) :: (load seq_cst (<2 x s16>), addrspace 3) 63 ; GFX6-NEXT: $vgpr0 = COPY [[LOAD]](<2 x s16>) 64 ; GFX7-LABEL: name: load_atomic_local_v2s16_seq_cst 65 ; GFX7: liveins: $vgpr0 66 ; GFX7-NEXT: {{ $}} 67 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 68 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 69 ; GFX7-NEXT: [[LOAD:%[0-9]+]]:vgpr_32(<2 x s16>) = G_LOAD [[COPY]](p3) :: (load seq_cst (<2 x s16>), addrspace 3) 70 ; GFX7-NEXT: $vgpr0 = COPY [[LOAD]](<2 x s16>) 71 ; GFX9-LABEL: name: load_atomic_local_v2s16_seq_cst 72 ; GFX9: liveins: $vgpr0 73 ; GFX9-NEXT: {{ $}} 74 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 75 ; GFX9-NEXT: [[LOAD:%[0-9]+]]:vgpr_32(<2 x s16>) = G_LOAD [[COPY]](p3) :: (load seq_cst (<2 x s16>), addrspace 3) 76 ; GFX9-NEXT: $vgpr0 = COPY [[LOAD]](<2 x s16>) 77 %0:vgpr(p3) = COPY $vgpr0 78 %1:vgpr(<2 x s16>) = G_LOAD %0 :: (load seq_cst (<2 x s16>), align 4, addrspace 3) 79 $vgpr0 = COPY %1 80 81... 82 83--- 84 85name: load_atomic_local_p3_seq_cst 86legalized: true 87regBankSelected: true 88tracksRegLiveness: true 89 90body: | 91 bb.0: 92 liveins: $vgpr0 93 94 ; GFX6-LABEL: name: load_atomic_local_p3_seq_cst 95 ; GFX6: liveins: $vgpr0 96 ; GFX6-NEXT: {{ $}} 97 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 98 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 99 ; GFX6-NEXT: [[LOAD:%[0-9]+]]:vgpr_32(p3) = G_LOAD [[COPY]](p3) :: (load seq_cst (p3), addrspace 3) 100 ; GFX6-NEXT: $vgpr0 = COPY [[LOAD]](p3) 101 ; GFX7-LABEL: name: load_atomic_local_p3_seq_cst 102 ; GFX7: liveins: $vgpr0 103 ; GFX7-NEXT: {{ $}} 104 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 105 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 106 ; GFX7-NEXT: [[LOAD:%[0-9]+]]:vgpr_32(p3) = G_LOAD [[COPY]](p3) :: (load seq_cst (p3), addrspace 3) 107 ; GFX7-NEXT: $vgpr0 = COPY [[LOAD]](p3) 108 ; GFX9-LABEL: name: load_atomic_local_p3_seq_cst 109 ; GFX9: liveins: $vgpr0 110 ; GFX9-NEXT: {{ $}} 111 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 112 ; GFX9-NEXT: [[LOAD:%[0-9]+]]:vgpr_32(p3) = G_LOAD [[COPY]](p3) :: (load seq_cst (p3), addrspace 3) 113 ; GFX9-NEXT: $vgpr0 = COPY [[LOAD]](p3) 114 %0:vgpr(p3) = COPY $vgpr0 115 %1:vgpr(p3) = G_LOAD %0 :: (load seq_cst (p3), align 4, addrspace 3) 116 $vgpr0 = COPY %1 117 118... 119 120--- 121 122name: load_atomic_local_s64_seq_cst 123legalized: true 124regBankSelected: true 125tracksRegLiveness: true 126 127body: | 128 bb.0: 129 liveins: $vgpr0 130 131 ; GFX6-LABEL: name: load_atomic_local_s64_seq_cst 132 ; GFX6: liveins: $vgpr0 133 ; GFX6-NEXT: {{ $}} 134 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 135 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 136 ; GFX6-NEXT: [[DS_READ_B64_:%[0-9]+]]:vreg_64 = DS_READ_B64 [[COPY]], 0, 0, implicit $m0, implicit $exec :: (load seq_cst (s64), addrspace 3) 137 ; GFX6-NEXT: $vgpr0_vgpr1 = COPY [[DS_READ_B64_]] 138 ; GFX7-LABEL: name: load_atomic_local_s64_seq_cst 139 ; GFX7: liveins: $vgpr0 140 ; GFX7-NEXT: {{ $}} 141 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 142 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 143 ; GFX7-NEXT: [[DS_READ_B64_:%[0-9]+]]:vreg_64 = DS_READ_B64 [[COPY]], 0, 0, implicit $m0, implicit $exec :: (load seq_cst (s64), addrspace 3) 144 ; GFX7-NEXT: $vgpr0_vgpr1 = COPY [[DS_READ_B64_]] 145 ; GFX9-LABEL: name: load_atomic_local_s64_seq_cst 146 ; GFX9: liveins: $vgpr0 147 ; GFX9-NEXT: {{ $}} 148 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 149 ; GFX9-NEXT: [[DS_READ_B64_gfx9_:%[0-9]+]]:vreg_64 = DS_READ_B64_gfx9 [[COPY]], 0, 0, implicit $exec :: (load seq_cst (s64), addrspace 3) 150 ; GFX9-NEXT: $vgpr0_vgpr1 = COPY [[DS_READ_B64_gfx9_]] 151 %0:vgpr(p3) = COPY $vgpr0 152 %1:vgpr(s64) = G_LOAD %0 :: (load seq_cst (s64), align 8, addrspace 3) 153 $vgpr0_vgpr1 = COPY %1 154 155... 156 157--- 158 159name: load_atomic_local_v2s32_seq_cst 160legalized: true 161regBankSelected: true 162tracksRegLiveness: true 163 164body: | 165 bb.0: 166 liveins: $vgpr0 167 168 ; GFX6-LABEL: name: load_atomic_local_v2s32_seq_cst 169 ; GFX6: liveins: $vgpr0 170 ; GFX6-NEXT: {{ $}} 171 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 172 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 173 ; GFX6-NEXT: [[LOAD:%[0-9]+]]:vreg_64(<2 x s32>) = G_LOAD [[COPY]](p3) :: (load seq_cst (<2 x s32>), addrspace 3) 174 ; GFX6-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](<2 x s32>) 175 ; GFX7-LABEL: name: load_atomic_local_v2s32_seq_cst 176 ; GFX7: liveins: $vgpr0 177 ; GFX7-NEXT: {{ $}} 178 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 179 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 180 ; GFX7-NEXT: [[LOAD:%[0-9]+]]:vreg_64(<2 x s32>) = G_LOAD [[COPY]](p3) :: (load seq_cst (<2 x s32>), addrspace 3) 181 ; GFX7-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](<2 x s32>) 182 ; GFX9-LABEL: name: load_atomic_local_v2s32_seq_cst 183 ; GFX9: liveins: $vgpr0 184 ; GFX9-NEXT: {{ $}} 185 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 186 ; GFX9-NEXT: [[LOAD:%[0-9]+]]:vreg_64(<2 x s32>) = G_LOAD [[COPY]](p3) :: (load seq_cst (<2 x s32>), addrspace 3) 187 ; GFX9-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](<2 x s32>) 188 %0:vgpr(p3) = COPY $vgpr0 189 %1:vgpr(<2 x s32>) = G_LOAD %0 :: (load seq_cst (<2 x s32>), align 8, addrspace 3) 190 $vgpr0_vgpr1 = COPY %1 191 192... 193 194--- 195 196name: load_atomic_local_v4s16_seq_cst 197legalized: true 198regBankSelected: true 199tracksRegLiveness: true 200 201body: | 202 bb.0: 203 liveins: $vgpr0 204 205 ; GFX6-LABEL: name: load_atomic_local_v4s16_seq_cst 206 ; GFX6: liveins: $vgpr0 207 ; GFX6-NEXT: {{ $}} 208 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 209 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 210 ; GFX6-NEXT: [[LOAD:%[0-9]+]]:vreg_64(<4 x s16>) = G_LOAD [[COPY]](p3) :: (load seq_cst (<4 x s16>), addrspace 3) 211 ; GFX6-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](<4 x s16>) 212 ; GFX7-LABEL: name: load_atomic_local_v4s16_seq_cst 213 ; GFX7: liveins: $vgpr0 214 ; GFX7-NEXT: {{ $}} 215 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 216 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 217 ; GFX7-NEXT: [[LOAD:%[0-9]+]]:vreg_64(<4 x s16>) = G_LOAD [[COPY]](p3) :: (load seq_cst (<4 x s16>), addrspace 3) 218 ; GFX7-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](<4 x s16>) 219 ; GFX9-LABEL: name: load_atomic_local_v4s16_seq_cst 220 ; GFX9: liveins: $vgpr0 221 ; GFX9-NEXT: {{ $}} 222 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 223 ; GFX9-NEXT: [[LOAD:%[0-9]+]]:vreg_64(<4 x s16>) = G_LOAD [[COPY]](p3) :: (load seq_cst (<4 x s16>), addrspace 3) 224 ; GFX9-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](<4 x s16>) 225 %0:vgpr(p3) = COPY $vgpr0 226 %1:vgpr(<4 x s16>) = G_LOAD %0 :: (load seq_cst (<4 x s16>), align 8, addrspace 3) 227 $vgpr0_vgpr1 = COPY %1 228 229... 230 231--- 232 233name: load_atomic_local_p1_seq_cst 234legalized: true 235regBankSelected: true 236tracksRegLiveness: true 237 238body: | 239 bb.0: 240 liveins: $vgpr0 241 242 ; GFX6-LABEL: name: load_atomic_local_p1_seq_cst 243 ; GFX6: liveins: $vgpr0 244 ; GFX6-NEXT: {{ $}} 245 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 246 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 247 ; GFX6-NEXT: [[LOAD:%[0-9]+]]:vreg_64(p1) = G_LOAD [[COPY]](p3) :: (load seq_cst (p1), addrspace 3) 248 ; GFX6-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](p1) 249 ; GFX7-LABEL: name: load_atomic_local_p1_seq_cst 250 ; GFX7: liveins: $vgpr0 251 ; GFX7-NEXT: {{ $}} 252 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 253 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 254 ; GFX7-NEXT: [[LOAD:%[0-9]+]]:vreg_64(p1) = G_LOAD [[COPY]](p3) :: (load seq_cst (p1), addrspace 3) 255 ; GFX7-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](p1) 256 ; GFX9-LABEL: name: load_atomic_local_p1_seq_cst 257 ; GFX9: liveins: $vgpr0 258 ; GFX9-NEXT: {{ $}} 259 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 260 ; GFX9-NEXT: [[LOAD:%[0-9]+]]:vreg_64(p1) = G_LOAD [[COPY]](p3) :: (load seq_cst (p1), addrspace 3) 261 ; GFX9-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](p1) 262 %0:vgpr(p3) = COPY $vgpr0 263 %1:vgpr(p1) = G_LOAD %0 :: (load seq_cst (p1), align 8, addrspace 3) 264 $vgpr0_vgpr1 = COPY %1 265 266... 267 268--- 269 270name: load_atomic_local_p0_seq_cst 271legalized: true 272regBankSelected: true 273tracksRegLiveness: true 274 275body: | 276 bb.0: 277 liveins: $vgpr0 278 279 ; GFX6-LABEL: name: load_atomic_local_p0_seq_cst 280 ; GFX6: liveins: $vgpr0 281 ; GFX6-NEXT: {{ $}} 282 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 283 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 284 ; GFX6-NEXT: [[LOAD:%[0-9]+]]:vreg_64(p0) = G_LOAD [[COPY]](p3) :: (load seq_cst (p0), addrspace 3) 285 ; GFX6-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](p0) 286 ; GFX7-LABEL: name: load_atomic_local_p0_seq_cst 287 ; GFX7: liveins: $vgpr0 288 ; GFX7-NEXT: {{ $}} 289 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 290 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 291 ; GFX7-NEXT: [[LOAD:%[0-9]+]]:vreg_64(p0) = G_LOAD [[COPY]](p3) :: (load seq_cst (p0), addrspace 3) 292 ; GFX7-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](p0) 293 ; GFX9-LABEL: name: load_atomic_local_p0_seq_cst 294 ; GFX9: liveins: $vgpr0 295 ; GFX9-NEXT: {{ $}} 296 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr(p3) = COPY $vgpr0 297 ; GFX9-NEXT: [[LOAD:%[0-9]+]]:vreg_64(p0) = G_LOAD [[COPY]](p3) :: (load seq_cst (p0), addrspace 3) 298 ; GFX9-NEXT: $vgpr0_vgpr1 = COPY [[LOAD]](p0) 299 %0:vgpr(p3) = COPY $vgpr0 300 %1:vgpr(p0) = G_LOAD %0 :: (load seq_cst (p0), align 8, addrspace 3) 301 $vgpr0_vgpr1 = COPY %1 302 303... 304 305--- 306 307name: load_atomic_local_s32_seq_cst_gep_65535 308legalized: true 309regBankSelected: true 310tracksRegLiveness: true 311 312body: | 313 bb.0: 314 liveins: $vgpr0 315 316 ; GFX6-LABEL: name: load_atomic_local_s32_seq_cst_gep_65535 317 ; GFX6: liveins: $vgpr0 318 ; GFX6-NEXT: {{ $}} 319 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 320 ; GFX6-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 65535, implicit $exec 321 ; GFX6-NEXT: [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, dead [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY]], [[V_MOV_B32_e32_]], 0, implicit $exec 322 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 323 ; GFX6-NEXT: [[DS_READ_B32_:%[0-9]+]]:vgpr_32 = DS_READ_B32 [[V_ADD_CO_U32_e64_]], 0, 0, implicit $m0, implicit $exec :: (load seq_cst (s32), addrspace 3) 324 ; GFX6-NEXT: $vgpr0 = COPY [[DS_READ_B32_]] 325 ; GFX7-LABEL: name: load_atomic_local_s32_seq_cst_gep_65535 326 ; GFX7: liveins: $vgpr0 327 ; GFX7-NEXT: {{ $}} 328 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 329 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 330 ; GFX7-NEXT: [[DS_READ_B32_:%[0-9]+]]:vgpr_32 = DS_READ_B32 [[COPY]], 65535, 0, implicit $m0, implicit $exec :: (load seq_cst (s32), addrspace 3) 331 ; GFX7-NEXT: $vgpr0 = COPY [[DS_READ_B32_]] 332 ; GFX9-LABEL: name: load_atomic_local_s32_seq_cst_gep_65535 333 ; GFX9: liveins: $vgpr0 334 ; GFX9-NEXT: {{ $}} 335 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 336 ; GFX9-NEXT: [[DS_READ_B32_gfx9_:%[0-9]+]]:vgpr_32 = DS_READ_B32_gfx9 [[COPY]], 65535, 0, implicit $exec :: (load seq_cst (s32), addrspace 3) 337 ; GFX9-NEXT: $vgpr0 = COPY [[DS_READ_B32_gfx9_]] 338 %0:vgpr(p3) = COPY $vgpr0 339 %1:vgpr(s32) = G_CONSTANT i32 65535 340 %2:vgpr(p3) = G_PTR_ADD %0, %1 341 %3:vgpr(s32) = G_LOAD %2 :: (load seq_cst (s32), align 4, addrspace 3) 342 $vgpr0 = COPY %3 343 344... 345