1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=CI %s 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.atomic.inc.i32.p1i32(i32 addrspace(1)* nocapture, i32) #2 5*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.atomic.inc.i32.p3i32(i32 addrspace(3)* nocapture, i32) #2 6*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.atomic.inc.i32.p4i32(i32 addrspace(4)* nocapture, i32) #2 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.amdgcn.atomic.inc.i64.p1i64(i64 addrspace(1)* nocapture, i64) #2 9*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.amdgcn.atomic.inc.i64.p3i64(i64 addrspace(3)* nocapture, i64) #2 10*9880d681SAndroid Build Coastguard Workerdeclare i64 @llvm.amdgcn.atomic.inc.i64.p4i64(i64 addrspace(4)* nocapture, i64) #2 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #1 13*9880d681SAndroid Build Coastguard Worker 14*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}lds_atomic_inc_ret_i32: 15*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 16*9880d681SAndroid Build Coastguard Worker; GCN: ds_inc_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[K]] 17*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_inc_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) #0 { 18*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p3i32(i32 addrspace(3)* %ptr, i32 42) 19*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 20*9880d681SAndroid Build Coastguard Worker ret void 21*9880d681SAndroid Build Coastguard Worker} 22*9880d681SAndroid Build Coastguard Worker 23*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}lds_atomic_inc_ret_i32_offset: 24*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 25*9880d681SAndroid Build Coastguard Worker; GCN: ds_inc_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[K]] offset:16 26*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_inc_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) #0 { 27*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 28*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p3i32(i32 addrspace(3)* %gep, i32 42) 29*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 30*9880d681SAndroid Build Coastguard Worker ret void 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker 33*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i32: 34*9880d681SAndroid Build Coastguard Worker; GCN: s_load_dword [[SPTR:s[0-9]+]], 35*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[DATA:v[0-9]+]], 4 36*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]] 37*9880d681SAndroid Build Coastguard Worker; GCN: ds_inc_u32 [[VPTR]], [[DATA]] 38*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_inc_noret_i32(i32 addrspace(3)* %ptr) nounwind { 39*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p3i32(i32 addrspace(3)* %ptr, i32 42) 40*9880d681SAndroid Build Coastguard Worker ret void 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i32_offset: 44*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 45*9880d681SAndroid Build Coastguard Worker; GCN: ds_inc_u32 v{{[0-9]+}}, [[K]] offset:16 46*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_inc_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind { 47*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4 48*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p3i32(i32 addrspace(3)* %gep, i32 42) 49*9880d681SAndroid Build Coastguard Worker ret void 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_inc_ret_i32: 53*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 54*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_inc [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 glc{{$}} 55*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_ret_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) #0 { 56*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p1i32(i32 addrspace(1)* %ptr, i32 42) 57*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 58*9880d681SAndroid Build Coastguard Worker ret void 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_inc_ret_i32_offset: 62*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 63*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_inc [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:16 glc{{$}} 64*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) #0 { 65*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4 66*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p1i32(i32 addrspace(1)* %gep, i32 42) 67*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out 68*9880d681SAndroid Build Coastguard Worker ret void 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}global_atomic_inc_noret_i32: 72*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_inc [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}} 73*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_noret_i32(i32 addrspace(1)* %ptr) nounwind { 74*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p1i32(i32 addrspace(1)* %ptr, i32 42) 75*9880d681SAndroid Build Coastguard Worker ret void 76*9880d681SAndroid Build Coastguard Worker} 77*9880d681SAndroid Build Coastguard Worker 78*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}global_atomic_inc_noret_i32_offset: 79*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 80*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_inc [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:16{{$}} 81*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_noret_i32_offset(i32 addrspace(1)* %ptr) nounwind { 82*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4 83*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p1i32(i32 addrspace(1)* %gep, i32 42) 84*9880d681SAndroid Build Coastguard Worker ret void 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_inc_ret_i32_offset_addr64: 88*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 89*9880d681SAndroid Build Coastguard Worker; CI: buffer_atomic_inc [[K]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:20 glc{{$}} 90*9880d681SAndroid Build Coastguard Worker; VI: flat_atomic_inc v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}} 91*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_ret_i32_offset_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) #0 { 92*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 93*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i32, i32 addrspace(1)* %ptr, i32 %id 94*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i32, i32 addrspace(1)* %out, i32 %id 95*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(1)* %gep.tid, i32 5 96*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p1i32(i32 addrspace(1)* %gep, i32 42) 97*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(1)* %out.gep 98*9880d681SAndroid Build Coastguard Worker ret void 99*9880d681SAndroid Build Coastguard Worker} 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_inc_noret_i32_offset_addr64: 102*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 103*9880d681SAndroid Build Coastguard Worker; CI: buffer_atomic_inc [[K]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:20{{$}} 104*9880d681SAndroid Build Coastguard Worker; VI: flat_atomic_inc v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}} 105*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_noret_i32_offset_addr64(i32 addrspace(1)* %ptr) #0 { 106*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 107*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i32, i32 addrspace(1)* %ptr, i32 %id 108*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(1)* %gep.tid, i32 5 109*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p1i32(i32 addrspace(1)* %gep, i32 42) 110*9880d681SAndroid Build Coastguard Worker ret void 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker@lds0 = addrspace(3) global [512 x i32] undef, align 4 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}atomic_inc_shl_base_lds_0_i32: 116*9880d681SAndroid Build Coastguard Worker; GCN: v_lshlrev_b32_e32 [[PTR:v[0-9]+]], 2, {{v[0-9]+}} 117*9880d681SAndroid Build Coastguard Worker; GCN: ds_inc_rtn_u32 {{v[0-9]+}}, [[PTR]], {{v[0-9]+}} offset:8 118*9880d681SAndroid Build Coastguard Workerdefine void @atomic_inc_shl_base_lds_0_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %add_use) #0 { 119*9880d681SAndroid Build Coastguard Worker %tid.x = tail call i32 @llvm.amdgcn.workitem.id.x() #1 120*9880d681SAndroid Build Coastguard Worker %idx.0 = add nsw i32 %tid.x, 2 121*9880d681SAndroid Build Coastguard Worker %arrayidx0 = getelementptr inbounds [512 x i32], [512 x i32] addrspace(3)* @lds0, i32 0, i32 %idx.0 122*9880d681SAndroid Build Coastguard Worker %val0 = call i32 @llvm.amdgcn.atomic.inc.i32.p3i32(i32 addrspace(3)* %arrayidx0, i32 9) 123*9880d681SAndroid Build Coastguard Worker store i32 %idx.0, i32 addrspace(1)* %add_use 124*9880d681SAndroid Build Coastguard Worker store i32 %val0, i32 addrspace(1)* %out 125*9880d681SAndroid Build Coastguard Worker ret void 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}lds_atomic_inc_ret_i64: 129*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 130*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 131*9880d681SAndroid Build Coastguard Worker; GCN: ds_inc_rtn_u64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}{{$}} 132*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_inc_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) #0 { 133*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p3i64(i64 addrspace(3)* %ptr, i64 42) 134*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out 135*9880d681SAndroid Build Coastguard Worker ret void 136*9880d681SAndroid Build Coastguard Worker} 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}lds_atomic_inc_ret_i64_offset: 139*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 140*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 141*9880d681SAndroid Build Coastguard Worker; GCN: ds_inc_rtn_u64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} offset:32 142*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_inc_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) #0 { 143*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 144*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p3i64(i64 addrspace(3)* %gep, i64 42) 145*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out 146*9880d681SAndroid Build Coastguard Worker ret void 147*9880d681SAndroid Build Coastguard Worker} 148*9880d681SAndroid Build Coastguard Worker 149*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64: 150*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 151*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 152*9880d681SAndroid Build Coastguard Worker; GCN: ds_inc_u64 v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}{{$}} 153*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_inc_noret_i64(i64 addrspace(3)* %ptr) nounwind { 154*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p3i64(i64 addrspace(3)* %ptr, i64 42) 155*9880d681SAndroid Build Coastguard Worker ret void 156*9880d681SAndroid Build Coastguard Worker} 157*9880d681SAndroid Build Coastguard Worker 158*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}lds_atomic_inc_noret_i64_offset: 159*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 160*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 161*9880d681SAndroid Build Coastguard Worker; GCN: ds_inc_u64 v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} offset:32{{$}} 162*9880d681SAndroid Build Coastguard Workerdefine void @lds_atomic_inc_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind { 163*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4 164*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p3i64(i64 addrspace(3)* %gep, i64 42) 165*9880d681SAndroid Build Coastguard Worker ret void 166*9880d681SAndroid Build Coastguard Worker} 167*9880d681SAndroid Build Coastguard Worker 168*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_inc_ret_i64: 169*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 170*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 171*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_inc_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 glc{{$}} 172*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_ret_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %ptr) #0 { 173*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p1i64(i64 addrspace(1)* %ptr, i64 42) 174*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out 175*9880d681SAndroid Build Coastguard Worker ret void 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_inc_ret_i64_offset: 179*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 180*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 181*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_inc_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:32 glc{{$}} 182*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %ptr) #0 { 183*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(1)* %ptr, i32 4 184*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p1i64(i64 addrspace(1)* %gep, i64 42) 185*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out 186*9880d681SAndroid Build Coastguard Worker ret void 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}global_atomic_inc_noret_i64: 190*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 191*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 192*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_inc_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}} 193*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_noret_i64(i64 addrspace(1)* %ptr) nounwind { 194*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p1i64(i64 addrspace(1)* %ptr, i64 42) 195*9880d681SAndroid Build Coastguard Worker ret void 196*9880d681SAndroid Build Coastguard Worker} 197*9880d681SAndroid Build Coastguard Worker 198*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}global_atomic_inc_noret_i64_offset: 199*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 200*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 201*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_inc_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:32{{$}} 202*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_noret_i64_offset(i64 addrspace(1)* %ptr) nounwind { 203*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(1)* %ptr, i32 4 204*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p1i64(i64 addrspace(1)* %gep, i64 42) 205*9880d681SAndroid Build Coastguard Worker ret void 206*9880d681SAndroid Build Coastguard Worker} 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_inc_ret_i64_offset_addr64: 209*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 210*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 211*9880d681SAndroid Build Coastguard Worker; CI: buffer_atomic_inc_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:40 glc{{$}} 212*9880d681SAndroid Build Coastguard Worker; VI: flat_atomic_inc_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}} 213*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_ret_i64_offset_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %ptr) #0 { 214*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 215*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i64, i64 addrspace(1)* %ptr, i32 %id 216*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id 217*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(1)* %gep.tid, i32 5 218*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p1i64(i64 addrspace(1)* %gep, i64 42) 219*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(1)* %out.gep 220*9880d681SAndroid Build Coastguard Worker ret void 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}global_atomic_inc_noret_i64_offset_addr64: 224*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 225*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 226*9880d681SAndroid Build Coastguard Worker; CI: buffer_atomic_inc_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:40{{$}} 227*9880d681SAndroid Build Coastguard Worker; VI: flat_atomic_inc_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}{{$}} 228*9880d681SAndroid Build Coastguard Workerdefine void @global_atomic_inc_noret_i64_offset_addr64(i64 addrspace(1)* %ptr) #0 { 229*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 230*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i64, i64 addrspace(1)* %ptr, i32 %id 231*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(1)* %gep.tid, i32 5 232*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p1i64(i64 addrspace(1)* %gep, i64 42) 233*9880d681SAndroid Build Coastguard Worker ret void 234*9880d681SAndroid Build Coastguard Worker} 235*9880d681SAndroid Build Coastguard Worker 236*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_inc_ret_i32: 237*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 238*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}} 239*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_ret_i32(i32 addrspace(4)* %out, i32 addrspace(4)* %ptr) #0 { 240*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p4i32(i32 addrspace(4)* %ptr, i32 42) 241*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(4)* %out 242*9880d681SAndroid Build Coastguard Worker ret void 243*9880d681SAndroid Build Coastguard Worker} 244*9880d681SAndroid Build Coastguard Worker 245*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_inc_ret_i32_offset: 246*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 247*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}} 248*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_ret_i32_offset(i32 addrspace(4)* %out, i32 addrspace(4)* %ptr) #0 { 249*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(4)* %ptr, i32 4 250*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p4i32(i32 addrspace(4)* %gep, i32 42) 251*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(4)* %out 252*9880d681SAndroid Build Coastguard Worker ret void 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}flat_atomic_inc_noret_i32: 256*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}} 257*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_noret_i32(i32 addrspace(4)* %ptr) nounwind { 258*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p4i32(i32 addrspace(4)* %ptr, i32 42) 259*9880d681SAndroid Build Coastguard Worker ret void 260*9880d681SAndroid Build Coastguard Worker} 261*9880d681SAndroid Build Coastguard Worker 262*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}flat_atomic_inc_noret_i32_offset: 263*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 264*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}} 265*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_noret_i32_offset(i32 addrspace(4)* %ptr) nounwind { 266*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(4)* %ptr, i32 4 267*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p4i32(i32 addrspace(4)* %gep, i32 42) 268*9880d681SAndroid Build Coastguard Worker ret void 269*9880d681SAndroid Build Coastguard Worker} 270*9880d681SAndroid Build Coastguard Worker 271*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_inc_ret_i32_offset_addr64: 272*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 273*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}} 274*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_ret_i32_offset_addr64(i32 addrspace(4)* %out, i32 addrspace(4)* %ptr) #0 { 275*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 276*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i32, i32 addrspace(4)* %ptr, i32 %id 277*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i32, i32 addrspace(4)* %out, i32 %id 278*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(4)* %gep.tid, i32 5 279*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p4i32(i32 addrspace(4)* %gep, i32 42) 280*9880d681SAndroid Build Coastguard Worker store i32 %result, i32 addrspace(4)* %out.gep 281*9880d681SAndroid Build Coastguard Worker ret void 282*9880d681SAndroid Build Coastguard Worker} 283*9880d681SAndroid Build Coastguard Worker 284*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_inc_noret_i32_offset_addr64: 285*9880d681SAndroid Build Coastguard Worker; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42 286*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}} 287*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_noret_i32_offset_addr64(i32 addrspace(4)* %ptr) #0 { 288*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 289*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i32, i32 addrspace(4)* %ptr, i32 %id 290*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(4)* %gep.tid, i32 5 291*9880d681SAndroid Build Coastguard Worker %result = call i32 @llvm.amdgcn.atomic.inc.i32.p4i32(i32 addrspace(4)* %gep, i32 42) 292*9880d681SAndroid Build Coastguard Worker ret void 293*9880d681SAndroid Build Coastguard Worker} 294*9880d681SAndroid Build Coastguard Worker 295*9880d681SAndroid Build Coastguard Worker@lds1 = addrspace(3) global [512 x i64] undef, align 8 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}atomic_inc_shl_base_lds_0_i64: 298*9880d681SAndroid Build Coastguard Worker; GCN: v_lshlrev_b32_e32 [[PTR:v[0-9]+]], 3, {{v[0-9]+}} 299*9880d681SAndroid Build Coastguard Worker; GCN: ds_inc_rtn_u64 v{{\[[0-9]+:[0-9]+\]}}, [[PTR]], v{{\[[0-9]+:[0-9]+\]}} offset:16 300*9880d681SAndroid Build Coastguard Workerdefine void @atomic_inc_shl_base_lds_0_i64(i64 addrspace(1)* %out, i32 addrspace(1)* %add_use) #0 { 301*9880d681SAndroid Build Coastguard Worker %tid.x = tail call i32 @llvm.amdgcn.workitem.id.x() #1 302*9880d681SAndroid Build Coastguard Worker %idx.0 = add nsw i32 %tid.x, 2 303*9880d681SAndroid Build Coastguard Worker %arrayidx0 = getelementptr inbounds [512 x i64], [512 x i64] addrspace(3)* @lds1, i32 0, i32 %idx.0 304*9880d681SAndroid Build Coastguard Worker %val0 = call i64 @llvm.amdgcn.atomic.inc.i64.p3i64(i64 addrspace(3)* %arrayidx0, i64 9) 305*9880d681SAndroid Build Coastguard Worker store i32 %idx.0, i32 addrspace(1)* %add_use 306*9880d681SAndroid Build Coastguard Worker store i64 %val0, i64 addrspace(1)* %out 307*9880d681SAndroid Build Coastguard Worker ret void 308*9880d681SAndroid Build Coastguard Worker} 309*9880d681SAndroid Build Coastguard Worker 310*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 311*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone } 312*9880d681SAndroid Build Coastguard Workerattributes #2 = { nounwind argmemonly } 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Worker 316*9880d681SAndroid Build Coastguard Worker 317*9880d681SAndroid Build Coastguard Worker 318*9880d681SAndroid Build Coastguard Worker 319*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_inc_ret_i64: 320*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 321*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 322*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}} 323*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_ret_i64(i64 addrspace(4)* %out, i64 addrspace(4)* %ptr) #0 { 324*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p4i64(i64 addrspace(4)* %ptr, i64 42) 325*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(4)* %out 326*9880d681SAndroid Build Coastguard Worker ret void 327*9880d681SAndroid Build Coastguard Worker} 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_inc_ret_i64_offset: 330*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 331*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 332*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}} 333*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_ret_i64_offset(i64 addrspace(4)* %out, i64 addrspace(4)* %ptr) #0 { 334*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(4)* %ptr, i32 4 335*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p4i64(i64 addrspace(4)* %gep, i64 42) 336*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(4)* %out 337*9880d681SAndroid Build Coastguard Worker ret void 338*9880d681SAndroid Build Coastguard Worker} 339*9880d681SAndroid Build Coastguard Worker 340*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}flat_atomic_inc_noret_i64: 341*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 342*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 343*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]$}} 344*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_noret_i64(i64 addrspace(4)* %ptr) nounwind { 345*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p4i64(i64 addrspace(4)* %ptr, i64 42) 346*9880d681SAndroid Build Coastguard Worker ret void 347*9880d681SAndroid Build Coastguard Worker} 348*9880d681SAndroid Build Coastguard Worker 349*9880d681SAndroid Build Coastguard Worker; FUNC-LABEL: {{^}}flat_atomic_inc_noret_i64_offset: 350*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 351*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 352*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]$}} 353*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_noret_i64_offset(i64 addrspace(4)* %ptr) nounwind { 354*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(4)* %ptr, i32 4 355*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p4i64(i64 addrspace(4)* %gep, i64 42) 356*9880d681SAndroid Build Coastguard Worker ret void 357*9880d681SAndroid Build Coastguard Worker} 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_inc_ret_i64_offset_addr64: 360*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 361*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 362*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}} 363*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_ret_i64_offset_addr64(i64 addrspace(4)* %out, i64 addrspace(4)* %ptr) #0 { 364*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 365*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i64, i64 addrspace(4)* %ptr, i32 %id 366*9880d681SAndroid Build Coastguard Worker %out.gep = getelementptr i64, i64 addrspace(4)* %out, i32 %id 367*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(4)* %gep.tid, i32 5 368*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p4i64(i64 addrspace(4)* %gep, i64 42) 369*9880d681SAndroid Build Coastguard Worker store i64 %result, i64 addrspace(4)* %out.gep 370*9880d681SAndroid Build Coastguard Worker ret void 371*9880d681SAndroid Build Coastguard Worker} 372*9880d681SAndroid Build Coastguard Worker 373*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}flat_atomic_inc_noret_i64_offset_addr64: 374*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42 375*9880d681SAndroid Build Coastguard Worker; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}} 376*9880d681SAndroid Build Coastguard Worker; GCN: flat_atomic_inc_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]$}} 377*9880d681SAndroid Build Coastguard Workerdefine void @flat_atomic_inc_noret_i64_offset_addr64(i64 addrspace(4)* %ptr) #0 { 378*9880d681SAndroid Build Coastguard Worker %id = call i32 @llvm.amdgcn.workitem.id.x() 379*9880d681SAndroid Build Coastguard Worker %gep.tid = getelementptr i64, i64 addrspace(4)* %ptr, i32 %id 380*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i64, i64 addrspace(4)* %gep.tid, i32 5 381*9880d681SAndroid Build Coastguard Worker %result = call i64 @llvm.amdgcn.atomic.inc.i64.p4i64(i64 addrspace(4)* %gep, i64 42) 382*9880d681SAndroid Build Coastguard Worker ret void 383*9880d681SAndroid Build Coastguard Worker} 384