Home | History | Annotate | Download | only in AMDGPU
      1 ; RUN: llc -march=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI -check-prefix=FUNC %s
      2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI -check-prefix=FUNC %s
      3 
      4 ; FUNC-LABEL: {{^}}atomic_add_i32_offset:
      5 ; GCN: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
      6 define void @atomic_add_i32_offset(i32 addrspace(1)* %out, i32 %in) {
      7 entry:
      8   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
      9   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
     10   ret void
     11 }
     12 
     13 ; FUNC-LABEL: {{^}}atomic_add_i32_soffset:
     14 ; GCN: s_mov_b32 [[SREG:s[0-9]+]], 0x8ca0
     15 ; GCN: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], [[SREG]]{{$}}
     16 define void @atomic_add_i32_soffset(i32 addrspace(1)* %out, i32 %in) {
     17 entry:
     18   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 9000
     19   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
     20   ret void
     21 }
     22 
     23 ; FUNC-LABEL: {{^}}atomic_add_i32_huge_offset:
     24 ; SI-DAG: v_mov_b32_e32 v[[PTRLO:[0-9]+]], 0xdeac
     25 ; SI-DAG: v_mov_b32_e32 v[[PTRHI:[0-9]+]], 0xabcd
     26 ; SI: buffer_atomic_add v{{[0-9]+}}, v{{\[}}[[PTRLO]]:[[PTRHI]]{{\]}}, s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
     27 ; VI: flat_atomic_add
     28 define void @atomic_add_i32_huge_offset(i32 addrspace(1)* %out, i32 %in) {
     29 entry:
     30   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 47224239175595
     31 
     32   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
     33   ret void
     34 }
     35 
     36 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_offset:
     37 ; GCN: buffer_atomic_add [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
     38 ; GCN: buffer_store_dword [[RET]]
     39 define void @atomic_add_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
     40 entry:
     41   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
     42   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
     43   store i32 %val, i32 addrspace(1)* %out2
     44   ret void
     45 }
     46 
     47 ; FUNC-LABEL: {{^}}atomic_add_i32_addr64_offset:
     48 ; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
     49 ; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
     50 define void @atomic_add_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
     51 entry:
     52   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
     53   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
     54   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
     55   ret void
     56 }
     57 
     58 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64_offset:
     59 ; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
     60 ; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
     61 ; GCN: buffer_store_dword [[RET]]
     62 define void @atomic_add_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
     63 entry:
     64   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
     65   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
     66   %val = atomicrmw volatile add i32 addrspace(1)* %gep, i32 %in seq_cst
     67   store i32 %val, i32 addrspace(1)* %out2
     68   ret void
     69 }
     70 
     71 ; FUNC-LABEL: {{^}}atomic_add_i32:
     72 ; GCN: buffer_atomic_add v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
     73 define void @atomic_add_i32(i32 addrspace(1)* %out, i32 %in) {
     74 entry:
     75   %val = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
     76   ret void
     77 }
     78 
     79 ; FUNC-LABEL: {{^}}atomic_add_i32_ret:
     80 ; GCN: buffer_atomic_add [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
     81 ; GCN: buffer_store_dword [[RET]]
     82 define void @atomic_add_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
     83 entry:
     84   %val = atomicrmw volatile add i32 addrspace(1)* %out, i32 %in seq_cst
     85   store i32 %val, i32 addrspace(1)* %out2
     86   ret void
     87 }
     88 
     89 ; FUNC-LABEL: {{^}}atomic_add_i32_addr64:
     90 ; SI: buffer_atomic_add v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
     91 ; VI: flat_atomic_add v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
     92 define void @atomic_add_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
     93 entry:
     94   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
     95   %val = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
     96   ret void
     97 }
     98 
     99 ; FUNC-LABEL: {{^}}atomic_add_i32_ret_addr64:
    100 ; SI: buffer_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    101 ; VI: flat_atomic_add [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    102 ; GCN: buffer_store_dword [[RET]]
    103 define void @atomic_add_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    104 entry:
    105   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    106   %val = atomicrmw volatile add i32 addrspace(1)* %ptr, i32 %in seq_cst
    107   store i32 %val, i32 addrspace(1)* %out2
    108   ret void
    109 }
    110 
    111 ; FUNC-LABEL: {{^}}atomic_and_i32_offset:
    112 ; GCN: buffer_atomic_and v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
    113 define void @atomic_and_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    114 entry:
    115   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    116   %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
    117   ret void
    118 }
    119 
    120 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_offset:
    121 ; GCN: buffer_atomic_and [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    122 ; GCN: buffer_store_dword [[RET]]
    123 define void @atomic_and_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    124 entry:
    125   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    126   %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
    127   store i32 %val, i32 addrspace(1)* %out2
    128   ret void
    129 }
    130 
    131 ; FUNC-LABEL: {{^}}atomic_and_i32_addr64_offset:
    132 ; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
    133 ; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    134 define void @atomic_and_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    135 entry:
    136   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    137   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    138   %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
    139   ret void
    140 }
    141 
    142 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64_offset:
    143 ; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    144 ; VI: flat_atomic_and [[RET:v[0-9]]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    145 ; GCN: buffer_store_dword [[RET]]
    146 define void @atomic_and_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    147 entry:
    148   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    149   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    150   %val = atomicrmw volatile and i32 addrspace(1)* %gep, i32 %in seq_cst
    151   store i32 %val, i32 addrspace(1)* %out2
    152   ret void
    153 }
    154 
    155 ; FUNC-LABEL: {{^}}atomic_and_i32:
    156 ; GCN: buffer_atomic_and v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
    157 define void @atomic_and_i32(i32 addrspace(1)* %out, i32 %in) {
    158 entry:
    159   %val = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
    160   ret void
    161 }
    162 
    163 ; FUNC-LABEL: {{^}}atomic_and_i32_ret:
    164 ; GCN: buffer_atomic_and [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    165 ; GCN: buffer_store_dword [[RET]]
    166 define void @atomic_and_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    167 entry:
    168   %val = atomicrmw volatile and i32 addrspace(1)* %out, i32 %in seq_cst
    169   store i32 %val, i32 addrspace(1)* %out2
    170   ret void
    171 }
    172 
    173 ; FUNC-LABEL: {{^}}atomic_and_i32_addr64:
    174 ; SI: buffer_atomic_and v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
    175 ; VI: flat_atomic_and v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    176 define void @atomic_and_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    177 entry:
    178   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    179   %val = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
    180   ret void
    181 }
    182 
    183 ; FUNC-LABEL: {{^}}atomic_and_i32_ret_addr64:
    184 ; SI: buffer_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    185 ; VI: flat_atomic_and [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    186 ; GCN: buffer_store_dword [[RET]]
    187 define void @atomic_and_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    188 entry:
    189   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    190   %val = atomicrmw volatile and i32 addrspace(1)* %ptr, i32 %in seq_cst
    191   store i32 %val, i32 addrspace(1)* %out2
    192   ret void
    193 }
    194 
    195 ; FUNC-LABEL: {{^}}atomic_sub_i32_offset:
    196 ; GCN: buffer_atomic_sub v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
    197 define void @atomic_sub_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    198 entry:
    199   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    200   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
    201   ret void
    202 }
    203 
    204 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_offset:
    205 ; GCN: buffer_atomic_sub [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    206 ; GCN: buffer_store_dword [[RET]]
    207 define void @atomic_sub_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    208 entry:
    209   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    210   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
    211   store i32 %val, i32 addrspace(1)* %out2
    212   ret void
    213 }
    214 
    215 ; FUNC-LABEL: {{^}}atomic_sub_i32_addr64_offset:
    216 ; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
    217 ; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    218 define void @atomic_sub_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    219 entry:
    220   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    221   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    222   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
    223   ret void
    224 }
    225 
    226 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64_offset:
    227 ; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    228 ; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    229 ; GCN: buffer_store_dword [[RET]]
    230 define void @atomic_sub_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    231 entry:
    232   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    233   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    234   %val = atomicrmw volatile sub i32 addrspace(1)* %gep, i32 %in seq_cst
    235   store i32 %val, i32 addrspace(1)* %out2
    236   ret void
    237 }
    238 
    239 ; FUNC-LABEL: {{^}}atomic_sub_i32:
    240 ; GCN: buffer_atomic_sub v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
    241 define void @atomic_sub_i32(i32 addrspace(1)* %out, i32 %in) {
    242 entry:
    243   %val = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
    244   ret void
    245 }
    246 
    247 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret:
    248 ; GCN: buffer_atomic_sub [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    249 ; GCN: buffer_store_dword [[RET]]
    250 define void @atomic_sub_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    251 entry:
    252   %val = atomicrmw volatile sub i32 addrspace(1)* %out, i32 %in seq_cst
    253   store i32 %val, i32 addrspace(1)* %out2
    254   ret void
    255 }
    256 
    257 ; FUNC-LABEL: {{^}}atomic_sub_i32_addr64:
    258 ; SI: buffer_atomic_sub v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
    259 ; VI: flat_atomic_sub v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    260 define void @atomic_sub_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    261 entry:
    262   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    263   %val = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
    264   ret void
    265 }
    266 
    267 ; FUNC-LABEL: {{^}}atomic_sub_i32_ret_addr64:
    268 ; SI: buffer_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    269 ; VI: flat_atomic_sub [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    270 ; GCN: buffer_store_dword [[RET]]
    271 define void @atomic_sub_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    272 entry:
    273   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    274   %val = atomicrmw volatile sub i32 addrspace(1)* %ptr, i32 %in seq_cst
    275   store i32 %val, i32 addrspace(1)* %out2
    276   ret void
    277 }
    278 
    279 ; FUNC-LABEL: {{^}}atomic_max_i32_offset:
    280 ; GCN: buffer_atomic_smax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
    281 define void @atomic_max_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    282 entry:
    283   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    284   %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
    285   ret void
    286 }
    287 
    288 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_offset:
    289 ; GCN: buffer_atomic_smax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    290 ; GCN: buffer_store_dword [[RET]]
    291 define void @atomic_max_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    292 entry:
    293   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    294   %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
    295   store i32 %val, i32 addrspace(1)* %out2
    296   ret void
    297 }
    298 
    299 ; FUNC-LABEL: {{^}}atomic_max_i32_addr64_offset:
    300 ; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
    301 ; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    302 define void @atomic_max_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    303 entry:
    304   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    305   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    306   %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
    307   ret void
    308 }
    309 
    310 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64_offset:
    311 ; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    312 ; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    313 ; GCN: buffer_store_dword [[RET]]
    314 define void @atomic_max_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    315 entry:
    316   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    317   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    318   %val = atomicrmw volatile max i32 addrspace(1)* %gep, i32 %in seq_cst
    319   store i32 %val, i32 addrspace(1)* %out2
    320   ret void
    321 }
    322 
    323 ; FUNC-LABEL: {{^}}atomic_max_i32:
    324 ; GCN: buffer_atomic_smax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
    325 define void @atomic_max_i32(i32 addrspace(1)* %out, i32 %in) {
    326 entry:
    327   %val = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
    328   ret void
    329 }
    330 
    331 ; FUNC-LABEL: {{^}}atomic_max_i32_ret:
    332 ; GCN: buffer_atomic_smax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    333 ; GCN: buffer_store_dword [[RET]]
    334 define void @atomic_max_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    335 entry:
    336   %val = atomicrmw volatile max i32 addrspace(1)* %out, i32 %in seq_cst
    337   store i32 %val, i32 addrspace(1)* %out2
    338   ret void
    339 }
    340 
    341 ; FUNC-LABEL: {{^}}atomic_max_i32_addr64:
    342 ; SI: buffer_atomic_smax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
    343 ; VI: flat_atomic_smax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    344 define void @atomic_max_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    345 entry:
    346   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    347   %val = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
    348   ret void
    349 }
    350 
    351 ; FUNC-LABEL: {{^}}atomic_max_i32_ret_addr64:
    352 ; SI: buffer_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    353 ; VI: flat_atomic_smax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    354 ; GCN: buffer_store_dword [[RET]]
    355 define void @atomic_max_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    356 entry:
    357   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    358   %val = atomicrmw volatile max i32 addrspace(1)* %ptr, i32 %in seq_cst
    359   store i32 %val, i32 addrspace(1)* %out2
    360   ret void
    361 }
    362 
    363 ; FUNC-LABEL: {{^}}atomic_umax_i32_offset:
    364 ; GCN: buffer_atomic_umax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
    365 define void @atomic_umax_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    366 entry:
    367   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    368   %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
    369   ret void
    370 }
    371 
    372 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_offset:
    373 ; GCN: buffer_atomic_umax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    374 ; GCN: buffer_store_dword [[RET]]
    375 define void @atomic_umax_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    376 entry:
    377   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    378   %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
    379   store i32 %val, i32 addrspace(1)* %out2
    380   ret void
    381 }
    382 
    383 ; FUNC-LABEL: {{^}}atomic_umax_i32_addr64_offset:
    384 ; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
    385 ; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    386 define void @atomic_umax_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    387 entry:
    388   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    389   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    390   %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
    391   ret void
    392 }
    393 
    394 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64_offset:
    395 ; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    396 ; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    397 ; GCN: buffer_store_dword [[RET]]
    398 define void @atomic_umax_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    399 entry:
    400   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    401   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    402   %val = atomicrmw volatile umax i32 addrspace(1)* %gep, i32 %in seq_cst
    403   store i32 %val, i32 addrspace(1)* %out2
    404   ret void
    405 }
    406 
    407 ; FUNC-LABEL: {{^}}atomic_umax_i32:
    408 ; GCN: buffer_atomic_umax v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
    409 define void @atomic_umax_i32(i32 addrspace(1)* %out, i32 %in) {
    410 entry:
    411   %val = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
    412   ret void
    413 }
    414 
    415 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret:
    416 ; GCN: buffer_atomic_umax [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    417 ; GCN: buffer_store_dword [[RET]]
    418 define void @atomic_umax_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    419 entry:
    420   %val = atomicrmw volatile umax i32 addrspace(1)* %out, i32 %in seq_cst
    421   store i32 %val, i32 addrspace(1)* %out2
    422   ret void
    423 }
    424 
    425 ; FUNC-LABEL: {{^}}atomic_umax_i32_addr64:
    426 ; SI: buffer_atomic_umax v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
    427 ; VI: flat_atomic_umax v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    428 define void @atomic_umax_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    429 entry:
    430   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    431   %val = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
    432   ret void
    433 }
    434 
    435 ; FUNC-LABEL: {{^}}atomic_umax_i32_ret_addr64:
    436 ; SI: buffer_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    437 ; VI: flat_atomic_umax [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    438 ; GCN: buffer_store_dword [[RET]]
    439 define void @atomic_umax_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    440 entry:
    441   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    442   %val = atomicrmw volatile umax i32 addrspace(1)* %ptr, i32 %in seq_cst
    443   store i32 %val, i32 addrspace(1)* %out2
    444   ret void
    445 }
    446 
    447 ; FUNC-LABEL: {{^}}atomic_min_i32_offset:
    448 ; GCN: buffer_atomic_smin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
    449 define void @atomic_min_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    450 entry:
    451   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    452   %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
    453   ret void
    454 }
    455 
    456 ; FUNC-LABEL: {{^}}atomic_min_i32_ret_offset:
    457 ; GCN: buffer_atomic_smin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    458 ; GCN: buffer_store_dword [[RET]]
    459 define void @atomic_min_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    460 entry:
    461   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    462   %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
    463   store i32 %val, i32 addrspace(1)* %out2
    464   ret void
    465 }
    466 
    467 ; FUNC-LABEL: {{^}}atomic_min_i32_addr64_offset:
    468 ; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
    469 ; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    470 define void @atomic_min_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    471 entry:
    472   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    473   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    474   %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
    475   ret void
    476 }
    477 
    478 ; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64_offset:
    479 ; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    480 ; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    481 ; GCN: buffer_store_dword [[RET]]
    482 define void @atomic_min_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    483 entry:
    484   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    485   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    486   %val = atomicrmw volatile min i32 addrspace(1)* %gep, i32 %in seq_cst
    487   store i32 %val, i32 addrspace(1)* %out2
    488   ret void
    489 }
    490 
    491 ; FUNC-LABEL: {{^}}atomic_min_i32:
    492 ; GCN: buffer_atomic_smin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
    493 define void @atomic_min_i32(i32 addrspace(1)* %out, i32 %in) {
    494 entry:
    495   %val = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
    496   ret void
    497 }
    498 
    499 ; FUNC-LABEL: {{^}}atomic_min_i32_ret:
    500 ; GCN: buffer_atomic_smin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    501 ; GCN: buffer_store_dword [[RET]]
    502 define void @atomic_min_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    503 entry:
    504   %val = atomicrmw volatile min i32 addrspace(1)* %out, i32 %in seq_cst
    505   store i32 %val, i32 addrspace(1)* %out2
    506   ret void
    507 }
    508 
    509 ; FUNC-LABEL: {{^}}atomic_min_i32_addr64:
    510 ; SI: buffer_atomic_smin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
    511 ; VI: flat_atomic_smin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    512 define void @atomic_min_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    513 entry:
    514   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    515   %val = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
    516   ret void
    517 }
    518 
    519 ; FUNC-LABEL: {{^}}atomic_min_i32_ret_addr64:
    520 ; SI: buffer_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    521 ; VI: flat_atomic_smin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    522 ; GCN: buffer_store_dword [[RET]]
    523 define void @atomic_min_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    524 entry:
    525   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    526   %val = atomicrmw volatile min i32 addrspace(1)* %ptr, i32 %in seq_cst
    527   store i32 %val, i32 addrspace(1)* %out2
    528   ret void
    529 }
    530 
    531 ; FUNC-LABEL: {{^}}atomic_umin_i32_offset:
    532 ; GCN: buffer_atomic_umin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
    533 define void @atomic_umin_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    534 entry:
    535   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    536   %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
    537   ret void
    538 }
    539 
    540 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret_offset:
    541 ; GCN: buffer_atomic_umin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    542 ; GCN: buffer_store_dword [[RET]]
    543 define void @atomic_umin_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    544 entry:
    545   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    546   %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
    547   store i32 %val, i32 addrspace(1)* %out2
    548   ret void
    549 }
    550 
    551 ; FUNC-LABEL: {{^}}atomic_umin_i32_addr64_offset:
    552 ; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
    553 ; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    554 define void @atomic_umin_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    555 entry:
    556   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    557   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    558   %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
    559   ret void
    560 }
    561 
    562 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64_offset:
    563 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    564 ; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    565 ; GCN: buffer_store_dword [[RET]]
    566 define void @atomic_umin_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    567 entry:
    568   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    569   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    570   %val = atomicrmw volatile umin i32 addrspace(1)* %gep, i32 %in seq_cst
    571   store i32 %val, i32 addrspace(1)* %out2
    572   ret void
    573 }
    574 
    575 ; FUNC-LABEL: {{^}}atomic_umin_i32:
    576 ; GCN: buffer_atomic_umin v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
    577 define void @atomic_umin_i32(i32 addrspace(1)* %out, i32 %in) {
    578 entry:
    579   %val = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
    580   ret void
    581 }
    582 
    583 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret:
    584 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    585 ; GCN: buffer_store_dword [[RET]]
    586 define void @atomic_umin_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    587 entry:
    588   %val = atomicrmw volatile umin i32 addrspace(1)* %out, i32 %in seq_cst
    589   store i32 %val, i32 addrspace(1)* %out2
    590   ret void
    591 }
    592 
    593 ; FUNC-LABEL: {{^}}atomic_umin_i32_addr64:
    594 ; SI: buffer_atomic_umin v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
    595 ; VI: flat_atomic_umin v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    596 define void @atomic_umin_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    597 entry:
    598   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    599   %val = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
    600   ret void
    601 }
    602 
    603 ; FUNC-LABEL: {{^}}atomic_umin_i32_ret_addr64:
    604 ; SI: buffer_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    605 ; VI: flat_atomic_umin [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    606 ; GCN: buffer_store_dword [[RET]]
    607 define void @atomic_umin_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    608 entry:
    609   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    610   %val = atomicrmw volatile umin i32 addrspace(1)* %ptr, i32 %in seq_cst
    611   store i32 %val, i32 addrspace(1)* %out2
    612   ret void
    613 }
    614 
    615 ; FUNC-LABEL: {{^}}atomic_or_i32_offset:
    616 ; GCN: buffer_atomic_or v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
    617 define void @atomic_or_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    618 entry:
    619   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    620   %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
    621   ret void
    622 }
    623 
    624 ; FUNC-LABEL: {{^}}atomic_or_i32_ret_offset:
    625 ; GCN: buffer_atomic_or [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    626 ; GCN: buffer_store_dword [[RET]]
    627 define void @atomic_or_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    628 entry:
    629   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    630   %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
    631   store i32 %val, i32 addrspace(1)* %out2
    632   ret void
    633 }
    634 
    635 ; FUNC-LABEL: {{^}}atomic_or_i32_addr64_offset:
    636 ; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
    637 ; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    638 define void @atomic_or_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    639 entry:
    640   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    641   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    642   %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
    643   ret void
    644 }
    645 
    646 ; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64_offset:
    647 ; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    648 ; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    649 ; GCN: buffer_store_dword [[RET]]
    650 define void @atomic_or_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    651 entry:
    652   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    653   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    654   %val = atomicrmw volatile or i32 addrspace(1)* %gep, i32 %in seq_cst
    655   store i32 %val, i32 addrspace(1)* %out2
    656   ret void
    657 }
    658 
    659 ; FUNC-LABEL: {{^}}atomic_or_i32:
    660 ; GCN: buffer_atomic_or v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
    661 define void @atomic_or_i32(i32 addrspace(1)* %out, i32 %in) {
    662 entry:
    663   %val = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
    664   ret void
    665 }
    666 
    667 ; FUNC-LABEL: {{^}}atomic_or_i32_ret:
    668 ; GCN: buffer_atomic_or [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    669 ; GCN: buffer_store_dword [[RET]]
    670 define void @atomic_or_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    671 entry:
    672   %val = atomicrmw volatile or i32 addrspace(1)* %out, i32 %in seq_cst
    673   store i32 %val, i32 addrspace(1)* %out2
    674   ret void
    675 }
    676 
    677 ; FUNC-LABEL: {{^}}atomic_or_i32_addr64:
    678 ; SI: buffer_atomic_or v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
    679 ; VI: flat_atomic_or v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    680 define void @atomic_or_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    681 entry:
    682   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    683   %val = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
    684   ret void
    685 }
    686 
    687 ; FUNC-LABEL: {{^}}atomic_or_i32_ret_addr64:
    688 ; SI: buffer_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    689 ; VI: flat_atomic_or [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    690 ; GCN: buffer_store_dword [[RET]]
    691 define void @atomic_or_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    692 entry:
    693   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    694   %val = atomicrmw volatile or i32 addrspace(1)* %ptr, i32 %in seq_cst
    695   store i32 %val, i32 addrspace(1)* %out2
    696   ret void
    697 }
    698 
    699 ; FUNC-LABEL: {{^}}atomic_xchg_i32_offset:
    700 ; GCN: buffer_atomic_swap v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
    701 define void @atomic_xchg_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    702 entry:
    703   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    704   %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
    705   ret void
    706 }
    707 
    708 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_offset:
    709 ; GCN: buffer_atomic_swap [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    710 ; GCN: buffer_store_dword [[RET]]
    711 define void @atomic_xchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    712 entry:
    713   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    714   %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
    715   store i32 %val, i32 addrspace(1)* %out2
    716   ret void
    717 }
    718 
    719 ; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64_offset:
    720 ; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
    721 
    722 ; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}}{{$}}
    723 define void @atomic_xchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    724 entry:
    725   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    726   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    727   %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
    728   ret void
    729 }
    730 
    731 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64_offset:
    732 ; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    733 
    734 ; VI: flat_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    735 ; GCN: buffer_store_dword [[RET]]
    736 define void @atomic_xchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    737 entry:
    738   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    739   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    740   %val = atomicrmw volatile xchg i32 addrspace(1)* %gep, i32 %in seq_cst
    741   store i32 %val, i32 addrspace(1)* %out2
    742   ret void
    743 }
    744 
    745 ; FUNC-LABEL: {{^}}atomic_xchg_i32:
    746 ; GCN: buffer_atomic_swap v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
    747 define void @atomic_xchg_i32(i32 addrspace(1)* %out, i32 %in) {
    748 entry:
    749   %val = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
    750   ret void
    751 }
    752 
    753 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret:
    754 ; GCN: buffer_atomic_swap [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    755 ; GCN: buffer_store_dword [[RET]]
    756 define void @atomic_xchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    757 entry:
    758   %val = atomicrmw volatile xchg i32 addrspace(1)* %out, i32 %in seq_cst
    759   store i32 %val, i32 addrspace(1)* %out2
    760   ret void
    761 }
    762 
    763 ; FUNC-LABEL: {{^}}atomic_xchg_i32_addr64:
    764 ; SI: buffer_atomic_swap v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
    765 ; VI: flat_atomic_swap v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    766 define void @atomic_xchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    767 entry:
    768   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    769   %val = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
    770   ret void
    771 }
    772 
    773 ; FUNC-LABEL: {{^}}atomic_xchg_i32_ret_addr64:
    774 ; SI: buffer_atomic_swap [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    775 ; VI: flat_atomic_swap [[RET:v[0-9]+]],  v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    776 ; GCN: buffer_store_dword [[RET]]
    777 define void @atomic_xchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    778 entry:
    779   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    780   %val = atomicrmw volatile xchg i32 addrspace(1)* %ptr, i32 %in seq_cst
    781   store i32 %val, i32 addrspace(1)* %out2
    782   ret void
    783 }
    784 
    785 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_offset:
    786 ; GCN: buffer_atomic_cmpswap v[{{[0-9]+}}:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
    787 define void @atomic_cmpxchg_i32_offset(i32 addrspace(1)* %out, i32 %in, i32 %old) {
    788 entry:
    789   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    790   %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
    791   ret void
    792 }
    793 
    794 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_offset:
    795 ; GCN: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]{{:[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    796 ; GCN: buffer_store_dword v[[RET]]
    797 define void @atomic_cmpxchg_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i32 %old) {
    798 entry:
    799   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    800   %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
    801   %extract0 = extractvalue { i32, i1 } %val, 0
    802   store i32 %extract0, i32 addrspace(1)* %out2
    803   ret void
    804 }
    805 
    806 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_addr64_offset:
    807 ; SI: buffer_atomic_cmpswap v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
    808 
    809 ; VI: flat_atomic_cmpswap v[{{[0-9]+\:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}]{{$}}
    810 define void @atomic_cmpxchg_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index, i32 %old) {
    811 entry:
    812   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    813   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    814   %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
    815   ret void
    816 }
    817 
    818 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_addr64_offset:
    819 ; SI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    820 ; VI: flat_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}}
    821 ; GCN: buffer_store_dword v[[RET]]
    822 define void @atomic_cmpxchg_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index, i32 %old) {
    823 entry:
    824   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    825   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    826   %val = cmpxchg volatile i32 addrspace(1)* %gep, i32 %old, i32 %in seq_cst seq_cst
    827   %extract0 = extractvalue { i32, i1 } %val, 0
    828   store i32 %extract0, i32 addrspace(1)* %out2
    829   ret void
    830 }
    831 
    832 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32:
    833 ; GCN: buffer_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
    834 define void @atomic_cmpxchg_i32(i32 addrspace(1)* %out, i32 %in, i32 %old) {
    835 entry:
    836   %val = cmpxchg volatile i32 addrspace(1)* %out, i32 %old, i32 %in seq_cst seq_cst
    837   ret void
    838 }
    839 
    840 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret:
    841 ; GCN: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    842 ; GCN: buffer_store_dword v[[RET]]
    843 define void @atomic_cmpxchg_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i32 %old) {
    844 entry:
    845   %val = cmpxchg volatile i32 addrspace(1)* %out, i32 %old, i32 %in seq_cst seq_cst
    846   %extract0 = extractvalue { i32, i1 } %val, 0
    847   store i32 %extract0, i32 addrspace(1)* %out2
    848   ret void
    849 }
    850 
    851 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_addr64:
    852 ; SI: buffer_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
    853 ; VI: flat_atomic_cmpswap v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}]{{$}}
    854 define void @atomic_cmpxchg_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index, i32 %old) {
    855 entry:
    856   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    857   %val = cmpxchg volatile i32 addrspace(1)* %ptr, i32 %old, i32 %in seq_cst seq_cst
    858   ret void
    859 }
    860 
    861 ; FUNC-LABEL: {{^}}atomic_cmpxchg_i32_ret_addr64:
    862 ; SI: buffer_atomic_cmpswap v{{\[}}[[RET:[0-9]+]]:{{[0-9]+}}], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    863 ; VI: flat_atomic_cmpswap v[[RET:[0-9]+]], v[{{[0-9]+:[0-9]+}}], v[{{[0-9]+:[0-9]+}}] glc{{$}}
    864 ; GCN: buffer_store_dword v[[RET]]
    865 define void @atomic_cmpxchg_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index, i32 %old) {
    866 entry:
    867   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    868   %val = cmpxchg volatile i32 addrspace(1)* %ptr, i32 %old, i32 %in seq_cst seq_cst
    869   %extract0 = extractvalue { i32, i1 } %val, 0
    870   store i32 %extract0, i32 addrspace(1)* %out2
    871   ret void
    872 }
    873 
    874 ; FUNC-LABEL: {{^}}atomic_xor_i32_offset:
    875 ; GCN: buffer_atomic_xor v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16{{$}}
    876 define void @atomic_xor_i32_offset(i32 addrspace(1)* %out, i32 %in) {
    877 entry:
    878   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    879   %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
    880   ret void
    881 }
    882 
    883 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret_offset:
    884 ; GCN: buffer_atomic_xor [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    885 ; GCN: buffer_store_dword [[RET]]
    886 define void @atomic_xor_i32_ret_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    887 entry:
    888   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
    889   %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
    890   store i32 %val, i32 addrspace(1)* %out2
    891   ret void
    892 }
    893 
    894 ; FUNC-LABEL: {{^}}atomic_xor_i32_addr64_offset:
    895 ; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16{{$}}
    896 ; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    897 define void @atomic_xor_i32_addr64_offset(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    898 entry:
    899   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    900   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    901   %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
    902   ret void
    903 }
    904 
    905 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64_offset:
    906 ; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    907 ; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    908 ; GCN: buffer_store_dword [[RET]]
    909 define void @atomic_xor_i32_ret_addr64_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    910 entry:
    911   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    912   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    913   %val = atomicrmw volatile xor i32 addrspace(1)* %gep, i32 %in seq_cst
    914   store i32 %val, i32 addrspace(1)* %out2
    915   ret void
    916 }
    917 
    918 ; FUNC-LABEL: {{^}}atomic_xor_i32:
    919 ; GCN: buffer_atomic_xor v{{[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0{{$}}
    920 define void @atomic_xor_i32(i32 addrspace(1)* %out, i32 %in) {
    921 entry:
    922   %val = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
    923   ret void
    924 }
    925 
    926 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret:
    927 ; GCN: buffer_atomic_xor [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    928 ; GCN: buffer_store_dword [[RET]]
    929 define void @atomic_xor_i32_ret(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in) {
    930 entry:
    931   %val = atomicrmw volatile xor i32 addrspace(1)* %out, i32 %in seq_cst
    932   store i32 %val, i32 addrspace(1)* %out2
    933   ret void
    934 }
    935 
    936 ; FUNC-LABEL: {{^}}atomic_xor_i32_addr64:
    937 ; SI: buffer_atomic_xor v{{[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64{{$}}
    938 ; VI: flat_atomic_xor v[{{[0-9]+:[0-9]+}}], v{{[0-9]+$}}
    939 define void @atomic_xor_i32_addr64(i32 addrspace(1)* %out, i32 %in, i64 %index) {
    940 entry:
    941   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    942   %val = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
    943   ret void
    944 }
    945 
    946 ; FUNC-LABEL: {{^}}atomic_xor_i32_ret_addr64:
    947 ; SI: buffer_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    948 ; VI: flat_atomic_xor [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}], v{{[0-9]+}} glc{{$}}
    949 ; GCN: buffer_store_dword [[RET]]
    950 define void @atomic_xor_i32_ret_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %out2, i32 %in, i64 %index) {
    951 entry:
    952   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
    953   %val = atomicrmw volatile xor i32 addrspace(1)* %ptr, i32 %in seq_cst
    954   store i32 %val, i32 addrspace(1)* %out2
    955   ret void
    956 }
    957 
    958 ; FUNC-LABEL: {{^}}atomic_load_i32_offset:
    959 ; SI: buffer_load_dword [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
    960 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}] glc{{$}}
    961 ; GCN: buffer_store_dword [[RET]]
    962 define void @atomic_load_i32_offset(i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
    963 entry:
    964   %gep = getelementptr i32, i32 addrspace(1)* %in, i64 4
    965   %val = load atomic i32, i32 addrspace(1)* %gep  seq_cst, align 4
    966   store i32 %val, i32 addrspace(1)* %out
    967   ret void
    968 }
    969 
    970 ; FUNC-LABEL: {{^}}atomic_load_i32:
    971 ; SI: buffer_load_dword [[RET:v[0-9]+]], off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc
    972 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}] glc
    973 ; GCN: buffer_store_dword [[RET]]
    974 define void @atomic_load_i32(i32 addrspace(1)* %in, i32 addrspace(1)* %out) {
    975 entry:
    976   %val = load atomic i32, i32 addrspace(1)* %in seq_cst, align 4
    977   store i32 %val, i32 addrspace(1)* %out
    978   ret void
    979 }
    980 
    981 ; FUNC-LABEL: {{^}}atomic_load_i32_addr64_offset:
    982 ; SI: buffer_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
    983 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}] glc{{$}}
    984 ; GCN: buffer_store_dword [[RET]]
    985 define void @atomic_load_i32_addr64_offset(i32 addrspace(1)* %in, i32 addrspace(1)* %out, i64 %index) {
    986 entry:
    987   %ptr = getelementptr i32, i32 addrspace(1)* %in, i64 %index
    988   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
    989   %val = load atomic i32, i32 addrspace(1)* %gep seq_cst, align 4
    990   store i32 %val, i32 addrspace(1)* %out
    991   ret void
    992 }
    993 
    994 ; FUNC-LABEL: {{^}}atomic_load_i32_addr64:
    995 ; SI: buffer_load_dword [[RET:v[0-9]+]], v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
    996 ; VI: flat_load_dword [[RET:v[0-9]+]], v[{{[0-9]+:[0-9]+}}] glc{{$}}
    997 ; GCN: buffer_store_dword [[RET]]
    998 define void @atomic_load_i32_addr64(i32 addrspace(1)* %in, i32 addrspace(1)* %out, i64 %index) {
    999 entry:
   1000   %ptr = getelementptr i32, i32 addrspace(1)* %in, i64 %index
   1001   %val = load atomic i32, i32 addrspace(1)* %ptr seq_cst, align 4
   1002   store i32 %val, i32 addrspace(1)* %out
   1003   ret void
   1004 }
   1005 
   1006 ; FUNC-LABEL: {{^}}atomic_store_i32_offset:
   1007 ; SI: buffer_store_dword {{v[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 offset:16 glc{{$}}
   1008 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}}
   1009 define void @atomic_store_i32_offset(i32 %in, i32 addrspace(1)* %out) {
   1010 entry:
   1011   %gep = getelementptr i32, i32 addrspace(1)* %out, i64 4
   1012   store atomic i32 %in, i32 addrspace(1)* %gep  seq_cst, align 4
   1013   ret void
   1014 }
   1015 
   1016 ; FUNC-LABEL: {{^}}atomic_store_i32:
   1017 ; SI: buffer_store_dword {{v[0-9]+}}, off, s[{{[0-9]+}}:{{[0-9]+}}], 0 glc{{$}}
   1018 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}}
   1019 define void @atomic_store_i32(i32 %in, i32 addrspace(1)* %out) {
   1020 entry:
   1021   store atomic i32 %in, i32 addrspace(1)* %out seq_cst, align 4
   1022   ret void
   1023 }
   1024 
   1025 ; FUNC-LABEL: {{^}}atomic_store_i32_addr64_offset:
   1026 ; SI: buffer_store_dword {{v[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 offset:16 glc{{$}}
   1027 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}}
   1028 define void @atomic_store_i32_addr64_offset(i32 %in, i32 addrspace(1)* %out, i64 %index) {
   1029 entry:
   1030   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
   1031   %gep = getelementptr i32, i32 addrspace(1)* %ptr, i64 4
   1032   store atomic i32 %in, i32 addrspace(1)* %gep seq_cst, align 4
   1033   ret void
   1034 }
   1035 
   1036 ; FUNC-LABEL: {{^}}atomic_store_i32_addr64:
   1037 ; SI: buffer_store_dword {{v[0-9]+}}, v[{{[0-9]+}}:{{[0-9]+}}], s[{{[0-9]+}}:{{[0-9]+}}], 0 addr64 glc{{$}}
   1038 ; VI: flat_store_dword v[{{[0-9]+}}:{{[0-9]+}}], {{v[0-9]+}} glc{{$}}
   1039 define void @atomic_store_i32_addr64(i32 %in, i32 addrspace(1)* %out, i64 %index) {
   1040 entry:
   1041   %ptr = getelementptr i32, i32 addrspace(1)* %out, i64 %index
   1042   store atomic i32 %in, i32 addrspace(1)* %ptr seq_cst, align 4
   1043   ret void
   1044 }
   1045