xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/move-to-valu-atomicrmw.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
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