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=fiji -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX7 %s 5# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX9 %s 6# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX9 %s 7# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX11 %s 8 9 10--- 11name: atomic_cmpxchg_s32_local 12legalized: true 13regBankSelected: true 14tracksRegLiveness: true 15body: | 16 bb.0: 17 liveins: $vgpr0, $vgpr1, $vgpr2 18 19 ; GFX6-LABEL: name: atomic_cmpxchg_s32_local 20 ; GFX6: liveins: $vgpr0, $vgpr1, $vgpr2 21 ; GFX6-NEXT: {{ $}} 22 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 23 ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 24 ; GFX6-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 25 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 26 ; GFX6-NEXT: [[DS_CMPST_RTN_B32_:%[0-9]+]]:vgpr_32 = DS_CMPST_RTN_B32 [[COPY]], [[COPY1]], [[COPY2]], 0, 0, implicit $m0, implicit $exec :: (load store seq_cst (s32), addrspace 3) 27 ; GFX6-NEXT: $vgpr0 = COPY [[DS_CMPST_RTN_B32_]] 28 ; GFX7-LABEL: name: atomic_cmpxchg_s32_local 29 ; GFX7: liveins: $vgpr0, $vgpr1, $vgpr2 30 ; GFX7-NEXT: {{ $}} 31 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 32 ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 33 ; GFX7-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 34 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 35 ; GFX7-NEXT: [[DS_CMPST_RTN_B32_:%[0-9]+]]:vgpr_32 = DS_CMPST_RTN_B32 [[COPY]], [[COPY1]], [[COPY2]], 0, 0, implicit $m0, implicit $exec :: (load store seq_cst (s32), addrspace 3) 36 ; GFX7-NEXT: $vgpr0 = COPY [[DS_CMPST_RTN_B32_]] 37 ; GFX9-LABEL: name: atomic_cmpxchg_s32_local 38 ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2 39 ; GFX9-NEXT: {{ $}} 40 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 41 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 42 ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 43 ; GFX9-NEXT: [[DS_CMPST_RTN_B32_gfx9_:%[0-9]+]]:vgpr_32 = DS_CMPST_RTN_B32_gfx9 [[COPY]], [[COPY1]], [[COPY2]], 0, 0, implicit $exec :: (load store seq_cst (s32), addrspace 3) 44 ; GFX9-NEXT: $vgpr0 = COPY [[DS_CMPST_RTN_B32_gfx9_]] 45 ; GFX11-LABEL: name: atomic_cmpxchg_s32_local 46 ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2 47 ; GFX11-NEXT: {{ $}} 48 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 49 ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 50 ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 51 ; GFX11-NEXT: [[DS_CMPSTORE_RTN_B32_gfx9_:%[0-9]+]]:vgpr_32 = DS_CMPSTORE_RTN_B32_gfx9 [[COPY]], [[COPY2]], [[COPY1]], 0, 0, implicit $exec :: (load store seq_cst (s32), addrspace 3) 52 ; GFX11-NEXT: $vgpr0 = COPY [[DS_CMPSTORE_RTN_B32_gfx9_]] 53 %0:vgpr(p3) = COPY $vgpr0 54 %1:vgpr(s32) = COPY $vgpr1 55 %2:vgpr(s32) = COPY $vgpr2 56 %3:vgpr(s32) = G_ATOMIC_CMPXCHG %0, %1, %2 :: (load store seq_cst (s32), addrspace 3) 57 $vgpr0 = COPY %3 58 59... 60 61--- 62name: atomic_cmpxchg_s32_local_gep4 63legalized: true 64regBankSelected: true 65tracksRegLiveness: true 66body: | 67 bb.0: 68 liveins: $vgpr0, $vgpr1, $vgpr2 69 70 ; GFX6-LABEL: name: atomic_cmpxchg_s32_local_gep4 71 ; GFX6: liveins: $vgpr0, $vgpr1, $vgpr2 72 ; GFX6-NEXT: {{ $}} 73 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 74 ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 75 ; GFX6-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 76 ; GFX6-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 4, implicit $exec 77 ; GFX6-NEXT: %4:vgpr_32, dead %6:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY]], [[V_MOV_B32_e32_]], 0, implicit $exec 78 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 79 ; GFX6-NEXT: [[DS_CMPST_RTN_B32_:%[0-9]+]]:vgpr_32 = DS_CMPST_RTN_B32 %4, [[COPY1]], [[COPY2]], 0, 0, implicit $m0, implicit $exec :: (load store seq_cst (s32), addrspace 3) 80 ; GFX6-NEXT: $vgpr0 = COPY [[DS_CMPST_RTN_B32_]] 81 ; GFX7-LABEL: name: atomic_cmpxchg_s32_local_gep4 82 ; GFX7: liveins: $vgpr0, $vgpr1, $vgpr2 83 ; GFX7-NEXT: {{ $}} 84 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 85 ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 86 ; GFX7-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 87 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 88 ; GFX7-NEXT: [[DS_CMPST_RTN_B32_:%[0-9]+]]:vgpr_32 = DS_CMPST_RTN_B32 [[COPY]], [[COPY1]], [[COPY2]], 4, 0, implicit $m0, implicit $exec :: (load store seq_cst (s32), addrspace 3) 89 ; GFX7-NEXT: $vgpr0 = COPY [[DS_CMPST_RTN_B32_]] 90 ; GFX9-LABEL: name: atomic_cmpxchg_s32_local_gep4 91 ; GFX9: liveins: $vgpr0, $vgpr1, $vgpr2 92 ; GFX9-NEXT: {{ $}} 93 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 94 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 95 ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 96 ; GFX9-NEXT: [[DS_CMPST_RTN_B32_gfx9_:%[0-9]+]]:vgpr_32 = DS_CMPST_RTN_B32_gfx9 [[COPY]], [[COPY1]], [[COPY2]], 4, 0, implicit $exec :: (load store seq_cst (s32), addrspace 3) 97 ; GFX9-NEXT: $vgpr0 = COPY [[DS_CMPST_RTN_B32_gfx9_]] 98 ; GFX11-LABEL: name: atomic_cmpxchg_s32_local_gep4 99 ; GFX11: liveins: $vgpr0, $vgpr1, $vgpr2 100 ; GFX11-NEXT: {{ $}} 101 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 102 ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1 103 ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY $vgpr2 104 ; GFX11-NEXT: [[DS_CMPSTORE_RTN_B32_gfx9_:%[0-9]+]]:vgpr_32 = DS_CMPSTORE_RTN_B32_gfx9 [[COPY]], [[COPY2]], [[COPY1]], 4, 0, implicit $exec :: (load store seq_cst (s32), addrspace 3) 105 ; GFX11-NEXT: $vgpr0 = COPY [[DS_CMPSTORE_RTN_B32_gfx9_]] 106 %0:vgpr(p3) = COPY $vgpr0 107 %1:vgpr(s32) = COPY $vgpr1 108 %2:vgpr(s32) = COPY $vgpr2 109 %3:vgpr(s32) = G_CONSTANT i32 4 110 %4:vgpr(p3) = G_PTR_ADD %0, %3 111 %5:vgpr(s32) = G_ATOMIC_CMPXCHG %4, %1, %2 :: (load store seq_cst (s32), addrspace 3) 112 $vgpr0 = COPY %5 113 114... 115 116--- 117name: atomic_cmpxchg_s64_local 118legalized: true 119regBankSelected: true 120tracksRegLiveness: true 121body: | 122 bb.0: 123 liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 124 125 ; GFX6-LABEL: name: atomic_cmpxchg_s64_local 126 ; GFX6: liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 127 ; GFX6-NEXT: {{ $}} 128 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 129 ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vreg_64 = COPY $vgpr1_vgpr2 130 ; GFX6-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr3_vgpr4 131 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 132 ; GFX6-NEXT: [[DS_CMPST_RTN_B64_:%[0-9]+]]:vreg_64 = DS_CMPST_RTN_B64 [[COPY]], [[COPY1]], [[COPY2]], 0, 0, implicit $m0, implicit $exec :: (load store seq_cst (s64), addrspace 3) 133 ; GFX6-NEXT: $vgpr0_vgpr1 = COPY [[DS_CMPST_RTN_B64_]] 134 ; GFX7-LABEL: name: atomic_cmpxchg_s64_local 135 ; GFX7: liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 136 ; GFX7-NEXT: {{ $}} 137 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 138 ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vreg_64 = COPY $vgpr1_vgpr2 139 ; GFX7-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr3_vgpr4 140 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 141 ; GFX7-NEXT: [[DS_CMPST_RTN_B64_:%[0-9]+]]:vreg_64 = DS_CMPST_RTN_B64 [[COPY]], [[COPY1]], [[COPY2]], 0, 0, implicit $m0, implicit $exec :: (load store seq_cst (s64), addrspace 3) 142 ; GFX7-NEXT: $vgpr0_vgpr1 = COPY [[DS_CMPST_RTN_B64_]] 143 ; GFX9-LABEL: name: atomic_cmpxchg_s64_local 144 ; GFX9: liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 145 ; GFX9-NEXT: {{ $}} 146 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 147 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vreg_64 = COPY $vgpr1_vgpr2 148 ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr3_vgpr4 149 ; GFX9-NEXT: [[DS_CMPST_RTN_B64_gfx9_:%[0-9]+]]:vreg_64 = DS_CMPST_RTN_B64_gfx9 [[COPY]], [[COPY1]], [[COPY2]], 0, 0, implicit $exec :: (load store seq_cst (s64), addrspace 3) 150 ; GFX9-NEXT: $vgpr0_vgpr1 = COPY [[DS_CMPST_RTN_B64_gfx9_]] 151 ; GFX11-LABEL: name: atomic_cmpxchg_s64_local 152 ; GFX11: liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 153 ; GFX11-NEXT: {{ $}} 154 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 155 ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vreg_64 = COPY $vgpr1_vgpr2 156 ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr3_vgpr4 157 ; GFX11-NEXT: [[DS_CMPSTORE_RTN_B64_gfx9_:%[0-9]+]]:vreg_64 = DS_CMPSTORE_RTN_B64_gfx9 [[COPY]], [[COPY2]], [[COPY1]], 0, 0, implicit $exec :: (load store seq_cst (s64), addrspace 3) 158 ; GFX11-NEXT: $vgpr0_vgpr1 = COPY [[DS_CMPSTORE_RTN_B64_gfx9_]] 159 %0:vgpr(p3) = COPY $vgpr0 160 %1:vgpr(s64) = COPY $vgpr1_vgpr2 161 %2:vgpr(s64) = COPY $vgpr3_vgpr4 162 %3:vgpr(s64) = G_ATOMIC_CMPXCHG %0, %1, %2 :: (load store seq_cst (s64), addrspace 3) 163 $vgpr0_vgpr1 = COPY %3 164 165... 166 167--- 168name: atomic_cmpxchg_s64_local_gep4 169legalized: true 170regBankSelected: true 171tracksRegLiveness: true 172body: | 173 bb.0: 174 liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 175 176 ; GFX6-LABEL: name: atomic_cmpxchg_s64_local_gep4 177 ; GFX6: liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 178 ; GFX6-NEXT: {{ $}} 179 ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 180 ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vreg_64 = COPY $vgpr1_vgpr2 181 ; GFX6-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr3_vgpr4 182 ; GFX6-NEXT: $m0 = S_MOV_B32 -1 183 ; GFX6-NEXT: [[DS_CMPST_RTN_B64_:%[0-9]+]]:vreg_64 = DS_CMPST_RTN_B64 [[COPY]], [[COPY1]], [[COPY2]], 0, 0, implicit $m0, implicit $exec :: (load store seq_cst (s64), addrspace 3) 184 ; GFX6-NEXT: $vgpr0_vgpr1 = COPY [[DS_CMPST_RTN_B64_]] 185 ; GFX7-LABEL: name: atomic_cmpxchg_s64_local_gep4 186 ; GFX7: liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 187 ; GFX7-NEXT: {{ $}} 188 ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 189 ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vreg_64 = COPY $vgpr1_vgpr2 190 ; GFX7-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr3_vgpr4 191 ; GFX7-NEXT: $m0 = S_MOV_B32 -1 192 ; GFX7-NEXT: [[DS_CMPST_RTN_B64_:%[0-9]+]]:vreg_64 = DS_CMPST_RTN_B64 [[COPY]], [[COPY1]], [[COPY2]], 0, 0, implicit $m0, implicit $exec :: (load store seq_cst (s64), addrspace 3) 193 ; GFX7-NEXT: $vgpr0_vgpr1 = COPY [[DS_CMPST_RTN_B64_]] 194 ; GFX9-LABEL: name: atomic_cmpxchg_s64_local_gep4 195 ; GFX9: liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 196 ; GFX9-NEXT: {{ $}} 197 ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 198 ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vreg_64 = COPY $vgpr1_vgpr2 199 ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr3_vgpr4 200 ; GFX9-NEXT: [[DS_CMPST_RTN_B64_gfx9_:%[0-9]+]]:vreg_64 = DS_CMPST_RTN_B64_gfx9 [[COPY]], [[COPY1]], [[COPY2]], 0, 0, implicit $exec :: (load store seq_cst (s64), addrspace 3) 201 ; GFX9-NEXT: $vgpr0_vgpr1 = COPY [[DS_CMPST_RTN_B64_gfx9_]] 202 ; GFX11-LABEL: name: atomic_cmpxchg_s64_local_gep4 203 ; GFX11: liveins: $vgpr0, $vgpr1_vgpr2, $vgpr3_vgpr4 204 ; GFX11-NEXT: {{ $}} 205 ; GFX11-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0 206 ; GFX11-NEXT: [[COPY1:%[0-9]+]]:vreg_64 = COPY $vgpr1_vgpr2 207 ; GFX11-NEXT: [[COPY2:%[0-9]+]]:vreg_64 = COPY $vgpr3_vgpr4 208 ; GFX11-NEXT: [[DS_CMPSTORE_RTN_B64_gfx9_:%[0-9]+]]:vreg_64 = DS_CMPSTORE_RTN_B64_gfx9 [[COPY]], [[COPY2]], [[COPY1]], 0, 0, implicit $exec :: (load store seq_cst (s64), addrspace 3) 209 ; GFX11-NEXT: $vgpr0_vgpr1 = COPY [[DS_CMPSTORE_RTN_B64_gfx9_]] 210 %0:vgpr(p3) = COPY $vgpr0 211 %1:vgpr(s64) = COPY $vgpr1_vgpr2 212 %2:vgpr(s64) = COPY $vgpr3_vgpr4 213 %3:vgpr(s32) = G_CONSTANT i32 4 214 %4:vgpr(p3) = G_PTR_ADD %0, %3 215 %5:vgpr(s64) = G_ATOMIC_CMPXCHG %0, %1, %2 :: (load store seq_cst (s64), addrspace 3) 216 $vgpr0_vgpr1 = COPY %5 217 218... 219