1*9880d681SAndroid Build Coastguard Worker; RUN: llc -march=amdgcn -mcpu=tahiti -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=SI %s 2*9880d681SAndroid Build Coastguard Worker; XUN: llc -march=amdgcn -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefix=GCN -check-prefix=VI %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; FIXME: broken on VI because flat instructions need to be emitted 5*9880d681SAndroid Build Coastguard Worker; instead of addr64 equivalent of the _OFFSET variants. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Worker; Check that moving the pointer out of the resource descriptor to 8*9880d681SAndroid Build Coastguard Worker; vaddr works for atomics. 9*9880d681SAndroid Build Coastguard Worker 10*9880d681SAndroid Build Coastguard Workerdeclare i32 @llvm.amdgcn.workitem.id.x() #1 11*9880d681SAndroid Build Coastguard Worker 12*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}atomic_max_i32: 13*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_smax v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:400 glc{{$}} 14*9880d681SAndroid Build Coastguard Workerdefine void @atomic_max_i32(i32 addrspace(1)* %out, i32 addrspace(1)* addrspace(1)* %in, i32 addrspace(1)* %x, i32 %y) #0 { 15*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() 16*9880d681SAndroid Build Coastguard Worker %tid.gep = getelementptr i32 addrspace(1)*, i32 addrspace(1)* addrspace(1)* %in, i32 %tid 17*9880d681SAndroid Build Coastguard Worker %ptr = load volatile i32 addrspace(1)*, i32 addrspace(1)* addrspace(1)* %tid.gep 18*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %tid, 1 19*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %xor, 0 20*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %atomic, label %exit 21*9880d681SAndroid Build Coastguard Worker 22*9880d681SAndroid Build Coastguard Workeratomic: 23*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 100 24*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw max i32 addrspace(1)* %gep, i32 %y seq_cst 25*9880d681SAndroid Build Coastguard Worker store i32 %ret, i32 addrspace(1)* %out 26*9880d681SAndroid Build Coastguard Worker br label %exit 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerexit: 29*9880d681SAndroid Build Coastguard Worker ret void 30*9880d681SAndroid Build Coastguard Worker} 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker; GCN-LABEL: {{^}}atomic_max_i32_noret: 33*9880d681SAndroid Build Coastguard Worker; GCN: buffer_atomic_smax v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:400{{$}} 34*9880d681SAndroid Build Coastguard Workerdefine void @atomic_max_i32_noret(i32 addrspace(1)* %out, i32 addrspace(1)* addrspace(1)* %in, i32 addrspace(1)* %x, i32 %y) #0 { 35*9880d681SAndroid Build Coastguard Worker %tid = call i32 @llvm.amdgcn.workitem.id.x() 36*9880d681SAndroid Build Coastguard Worker %tid.gep = getelementptr i32 addrspace(1)*, i32 addrspace(1)* addrspace(1)* %in, i32 %tid 37*9880d681SAndroid Build Coastguard Worker %ptr = load volatile i32 addrspace(1)*, i32 addrspace(1)* addrspace(1)* %tid.gep 38*9880d681SAndroid Build Coastguard Worker %xor = xor i32 %tid, 1 39*9880d681SAndroid Build Coastguard Worker %cmp = icmp ne i32 %xor, 0 40*9880d681SAndroid Build Coastguard Worker br i1 %cmp, label %atomic, label %exit 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workeratomic: 43*9880d681SAndroid Build Coastguard Worker %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 100 44*9880d681SAndroid Build Coastguard Worker %ret = atomicrmw max i32 addrspace(1)* %gep, i32 %y seq_cst 45*9880d681SAndroid Build Coastguard Worker br label %exit 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Workerexit: 48*9880d681SAndroid Build Coastguard Worker ret void 49*9880d681SAndroid Build Coastguard Worker} 50*9880d681SAndroid Build Coastguard Worker 51*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind } 52*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind readnone } 53