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