blob: 2616d84bcd9afa135c3824d1263c0bd32743f278 [file] [log] [blame]
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +00001; RUN: llc -march=amdgcn -mcpu=bonaire -verify-machineinstrs < %s | FileCheck -enable-var-scope -check-prefixes=GCN,CI,CIVI %s
2; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,VI,CIVI %s
3; RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,GFX9 %s
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +00004
Matt Arsenault79f837c2017-03-30 22:21:40 +00005declare i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* nocapture, i32, i32, i32, i1) #2
6declare i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* nocapture, i32, i32, i32, i1) #2
Yaxun Liu2a22c5d2018-02-02 16:07:16 +00007declare i32 @llvm.amdgcn.atomic.dec.i32.p0i32(i32* nocapture, i32, i32, i32, i1) #2
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +00008
Matt Arsenault79f837c2017-03-30 22:21:40 +00009declare i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* nocapture, i64, i32, i32, i1) #2
10declare i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* nocapture, i64, i32, i32, i1) #2
Yaxun Liu2a22c5d2018-02-02 16:07:16 +000011declare i64 @llvm.amdgcn.atomic.dec.i64.p0i64(i64* nocapture, i64, i32, i32, i1) #2
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000012
13declare i32 @llvm.amdgcn.workitem.id.x() #1
14
Matt Arsenault79f837c2017-03-30 22:21:40 +000015; Make sure no crash on invalid non-constant
16; GCN-LABEL: {{^}}invalid_variable_order_lds_atomic_dec_ret_i32:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +000017; CIVI-DAG: s_mov_b32 m0
18; GFX9-NOT: m0
Matt Arsenault79f837c2017-03-30 22:21:40 +000019define amdgpu_kernel void @invalid_variable_order_lds_atomic_dec_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr, i32 %order.var) #0 {
20 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %ptr, i32 42, i32 %order.var, i32 0, i1 false)
21 store i32 %result, i32 addrspace(1)* %out
22 ret void
23}
24
25; Make sure no crash on invalid non-constant
26; GCN-LABEL: {{^}}invalid_variable_scope_lds_atomic_dec_ret_i32:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +000027; CIVI-DAG: s_mov_b32 m0
28; GFX9-NOT: m0
Matt Arsenault79f837c2017-03-30 22:21:40 +000029define amdgpu_kernel void @invalid_variable_scope_lds_atomic_dec_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr, i32 %scope.var) #0 {
30 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %ptr, i32 42, i32 0, i32 %scope.var, i1 false)
31 store i32 %result, i32 addrspace(1)* %out
32 ret void
33}
34
35; Make sure no crash on invalid non-constant
36; GCN-LABEL: {{^}}invalid_variable_volatile_lds_atomic_dec_ret_i32:
37define amdgpu_kernel void @invalid_variable_volatile_lds_atomic_dec_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr, i1 %volatile.var) #0 {
38 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %ptr, i32 42, i32 0, i32 0, i1 %volatile.var)
39 store i32 %result, i32 addrspace(1)* %out
40 ret void
41}
42
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000043; GCN-LABEL: {{^}}lds_atomic_dec_ret_i32:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +000044; CIVI-DAG: s_mov_b32 m0
45; GFX9-NOT: m0
46
47; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000048; GCN: ds_dec_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[K]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000049define amdgpu_kernel void @lds_atomic_dec_ret_i32(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) #0 {
Matt Arsenault79f837c2017-03-30 22:21:40 +000050 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %ptr, i32 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000051 store i32 %result, i32 addrspace(1)* %out
52 ret void
53}
54
55; GCN-LABEL: {{^}}lds_atomic_dec_ret_i32_offset:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +000056; CIVI-DAG: s_mov_b32 m0
57; GFX9-NOT: m0
58
59; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000060; GCN: ds_dec_rtn_u32 v{{[0-9]+}}, v{{[0-9]+}}, [[K]] offset:16
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000061define amdgpu_kernel void @lds_atomic_dec_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(3)* %ptr) #0 {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000062 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
Matt Arsenault79f837c2017-03-30 22:21:40 +000063 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %gep, i32 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000064 store i32 %result, i32 addrspace(1)* %out
65 ret void
66}
67
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +000068; GCN-LABEL: {{^}}lds_atomic_dec_noret_i32:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +000069; CIVI-DAG: s_mov_b32 m0
70; GFX9-NOT: m0
71
72; GCN-DAG: s_load_dword [[SPTR:s[0-9]+]],
73; GCN-DAG: v_mov_b32_e32 [[DATA:v[0-9]+]], 4
74; GCN-DAG: v_mov_b32_e32 [[VPTR:v[0-9]+]], [[SPTR]]
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000075; GCN: ds_dec_u32 [[VPTR]], [[DATA]]
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000076define amdgpu_kernel void @lds_atomic_dec_noret_i32(i32 addrspace(3)* %ptr) nounwind {
Matt Arsenault79f837c2017-03-30 22:21:40 +000077 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %ptr, i32 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000078 ret void
79}
80
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +000081; GCN-LABEL: {{^}}lds_atomic_dec_noret_i32_offset:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +000082; CIVI-DAG: s_mov_b32 m0
83; GFX9-NOT: m0
84
85; GCN-DAG: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000086; GCN: ds_dec_u32 v{{[0-9]+}}, [[K]] offset:16
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000087define amdgpu_kernel void @lds_atomic_dec_noret_i32_offset(i32 addrspace(3)* %ptr) nounwind {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000088 %gep = getelementptr i32, i32 addrspace(3)* %ptr, i32 4
Matt Arsenault79f837c2017-03-30 22:21:40 +000089 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %gep, i32 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000090 ret void
91}
92
93; GCN-LABEL: {{^}}global_atomic_dec_ret_i32:
94; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +000095; CIVI: buffer_atomic_dec [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 glc{{$}}
96; GFX9: global_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]], off glc{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +000097define amdgpu_kernel void @global_atomic_dec_ret_i32(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) #0 {
Matt Arsenault79f837c2017-03-30 22:21:40 +000098 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %ptr, i32 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +000099 store i32 %result, i32 addrspace(1)* %out
100 ret void
101}
102
103; GCN-LABEL: {{^}}global_atomic_dec_ret_i32_offset:
104; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000105; CIVI: buffer_atomic_dec [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:16 glc{{$}}
106; GFX9: global_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]], off offset:16 glc{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000107define amdgpu_kernel void @global_atomic_dec_ret_i32_offset(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) #0 {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000108 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Matt Arsenault79f837c2017-03-30 22:21:40 +0000109 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %gep, i32 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000110 store i32 %result, i32 addrspace(1)* %out
111 ret void
112}
113
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000114; GCN-LABEL: {{^}}global_atomic_dec_noret_i32:
115; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
116; CIVI: buffer_atomic_dec [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}}
117; GFX9: global_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]], off{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000118define amdgpu_kernel void @global_atomic_dec_noret_i32(i32 addrspace(1)* %ptr) nounwind {
Matt Arsenault79f837c2017-03-30 22:21:40 +0000119 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %ptr, i32 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000120 ret void
121}
122
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000123; GCN-LABEL: {{^}}global_atomic_dec_noret_i32_offset:
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000124; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000125; CIVI: buffer_atomic_dec [[K]], off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:16{{$}}
126; GFX9: global_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]], off offset:16{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000127define amdgpu_kernel void @global_atomic_dec_noret_i32_offset(i32 addrspace(1)* %ptr) nounwind {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000128 %gep = getelementptr i32, i32 addrspace(1)* %ptr, i32 4
Matt Arsenault79f837c2017-03-30 22:21:40 +0000129 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %gep, i32 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000130 ret void
131}
132
133; GCN-LABEL: {{^}}global_atomic_dec_ret_i32_offset_addr64:
134; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
135; CI: buffer_atomic_dec [[K]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:20 glc{{$}}
136; VI: flat_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000137define amdgpu_kernel void @global_atomic_dec_ret_i32_offset_addr64(i32 addrspace(1)* %out, i32 addrspace(1)* %ptr) #0 {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000138 %id = call i32 @llvm.amdgcn.workitem.id.x()
139 %gep.tid = getelementptr i32, i32 addrspace(1)* %ptr, i32 %id
140 %out.gep = getelementptr i32, i32 addrspace(1)* %out, i32 %id
141 %gep = getelementptr i32, i32 addrspace(1)* %gep.tid, i32 5
Matt Arsenault79f837c2017-03-30 22:21:40 +0000142 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %gep, i32 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000143 store i32 %result, i32 addrspace(1)* %out.gep
144 ret void
145}
146
147; GCN-LABEL: {{^}}global_atomic_dec_noret_i32_offset_addr64:
148; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
149; CI: buffer_atomic_dec [[K]], v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:20{{$}}
150; VI: flat_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000151define amdgpu_kernel void @global_atomic_dec_noret_i32_offset_addr64(i32 addrspace(1)* %ptr) #0 {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000152 %id = call i32 @llvm.amdgcn.workitem.id.x()
153 %gep.tid = getelementptr i32, i32 addrspace(1)* %ptr, i32 %id
154 %gep = getelementptr i32, i32 addrspace(1)* %gep.tid, i32 5
Matt Arsenault79f837c2017-03-30 22:21:40 +0000155 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p1i32(i32 addrspace(1)* %gep, i32 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000156 ret void
157}
158
Matt Arsenault7757c592016-06-09 23:42:54 +0000159; GCN-LABEL: {{^}}flat_atomic_dec_ret_i32:
160; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
161; GCN: flat_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000162define amdgpu_kernel void @flat_atomic_dec_ret_i32(i32* %out, i32* %ptr) #0 {
163 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p0i32(i32* %ptr, i32 42, i32 0, i32 0, i1 false)
164 store i32 %result, i32* %out
Matt Arsenault7757c592016-06-09 23:42:54 +0000165 ret void
166}
167
168; GCN-LABEL: {{^}}flat_atomic_dec_ret_i32_offset:
169; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000170; CIVI: flat_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}}
171; GFX9: flat_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] offset:16 glc{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000172define amdgpu_kernel void @flat_atomic_dec_ret_i32_offset(i32* %out, i32* %ptr) #0 {
173 %gep = getelementptr i32, i32* %ptr, i32 4
174 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p0i32(i32* %gep, i32 42, i32 0, i32 0, i1 false)
175 store i32 %result, i32* %out
Matt Arsenault7757c592016-06-09 23:42:54 +0000176 ret void
177}
178
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000179; GCN-LABEL: {{^}}flat_atomic_dec_noret_i32:
180; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenault7757c592016-06-09 23:42:54 +0000181; GCN: flat_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000182define amdgpu_kernel void @flat_atomic_dec_noret_i32(i32* %ptr) nounwind {
183 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p0i32(i32* %ptr, i32 42, i32 0, i32 0, i1 false)
Matt Arsenault7757c592016-06-09 23:42:54 +0000184 ret void
185}
186
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000187; GCN-LABEL: {{^}}flat_atomic_dec_noret_i32_offset:
Matt Arsenault7757c592016-06-09 23:42:54 +0000188; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000189; CIVI: flat_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}}
190; GFX9: flat_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]] offset:16{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000191define amdgpu_kernel void @flat_atomic_dec_noret_i32_offset(i32* %ptr) nounwind {
192 %gep = getelementptr i32, i32* %ptr, i32 4
193 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p0i32(i32* %gep, i32 42, i32 0, i32 0, i1 false)
Matt Arsenault7757c592016-06-09 23:42:54 +0000194 ret void
195}
196
197; GCN-LABEL: {{^}}flat_atomic_dec_ret_i32_offset_addr64:
198; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000199; CIVI: flat_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] glc{{$}}
200; GFX9: flat_atomic_dec v{{[0-9]+}}, v{{\[[0-9]+:[0-9]+\]}}, [[K]] offset:20 glc{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000201define amdgpu_kernel void @flat_atomic_dec_ret_i32_offset_addr64(i32* %out, i32* %ptr) #0 {
Matt Arsenault7757c592016-06-09 23:42:54 +0000202 %id = call i32 @llvm.amdgcn.workitem.id.x()
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000203 %gep.tid = getelementptr i32, i32* %ptr, i32 %id
204 %out.gep = getelementptr i32, i32* %out, i32 %id
205 %gep = getelementptr i32, i32* %gep.tid, i32 5
206 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p0i32(i32* %gep, i32 42, i32 0, i32 0, i1 false)
207 store i32 %result, i32* %out.gep
Matt Arsenault7757c592016-06-09 23:42:54 +0000208 ret void
209}
210
211; GCN-LABEL: {{^}}flat_atomic_dec_noret_i32_offset_addr64:
212; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 42
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000213; CIVI: flat_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]]{{$}}
214; GFX9: flat_atomic_dec v{{\[[0-9]+:[0-9]+\]}}, [[K]] offset:20{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000215define amdgpu_kernel void @flat_atomic_dec_noret_i32_offset_addr64(i32* %ptr) #0 {
Matt Arsenault7757c592016-06-09 23:42:54 +0000216 %id = call i32 @llvm.amdgcn.workitem.id.x()
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000217 %gep.tid = getelementptr i32, i32* %ptr, i32 %id
218 %gep = getelementptr i32, i32* %gep.tid, i32 5
219 %result = call i32 @llvm.amdgcn.atomic.dec.i32.p0i32(i32* %gep, i32 42, i32 0, i32 0, i1 false)
Matt Arsenault7757c592016-06-09 23:42:54 +0000220 ret void
221}
222
223; GCN-LABEL: {{^}}flat_atomic_dec_ret_i64:
224; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
225; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
226; GCN: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000227define amdgpu_kernel void @flat_atomic_dec_ret_i64(i64* %out, i64* %ptr) #0 {
228 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p0i64(i64* %ptr, i64 42, i32 0, i32 0, i1 false)
229 store i64 %result, i64* %out
Matt Arsenault7757c592016-06-09 23:42:54 +0000230 ret void
231}
232
233; GCN-LABEL: {{^}}flat_atomic_dec_ret_i64_offset:
234; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
235; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000236; CIVI: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}}
237; GFX9: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} offset:32 glc{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000238define amdgpu_kernel void @flat_atomic_dec_ret_i64_offset(i64* %out, i64* %ptr) #0 {
239 %gep = getelementptr i64, i64* %ptr, i32 4
240 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p0i64(i64* %gep, i64 42, i32 0, i32 0, i1 false)
241 store i64 %result, i64* %out
Matt Arsenault7757c592016-06-09 23:42:54 +0000242 ret void
243}
244
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000245; GCN-LABEL: {{^}}flat_atomic_dec_noret_i64:
Matt Arsenault7757c592016-06-09 23:42:54 +0000246; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
247; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
248; GCN: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000249define amdgpu_kernel void @flat_atomic_dec_noret_i64(i64* %ptr) nounwind {
250 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p0i64(i64* %ptr, i64 42, i32 0, i32 0, i1 false)
Matt Arsenault7757c592016-06-09 23:42:54 +0000251 ret void
252}
253
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000254; GCN-LABEL: {{^}}flat_atomic_dec_noret_i64_offset:
Matt Arsenault7757c592016-06-09 23:42:54 +0000255; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
256; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000257; CIVI: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]$}}
258; GFX9: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} offset:32{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000259define amdgpu_kernel void @flat_atomic_dec_noret_i64_offset(i64* %ptr) nounwind {
260 %gep = getelementptr i64, i64* %ptr, i32 4
261 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p0i64(i64* %gep, i64 42, i32 0, i32 0, i1 false)
Matt Arsenault7757c592016-06-09 23:42:54 +0000262 ret void
263}
264
265; GCN-LABEL: {{^}}flat_atomic_dec_ret_i64_offset_addr64:
Stanislav Mekhanoshinc90347d2017-04-12 20:48:56 +0000266; GCN: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
267; GCN: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000268; CIVI: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}}
269; GFX9: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} offset:40 glc{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000270define amdgpu_kernel void @flat_atomic_dec_ret_i64_offset_addr64(i64* %out, i64* %ptr) #0 {
Matt Arsenault7757c592016-06-09 23:42:54 +0000271 %id = call i32 @llvm.amdgcn.workitem.id.x()
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000272 %gep.tid = getelementptr i64, i64* %ptr, i32 %id
273 %out.gep = getelementptr i64, i64* %out, i32 %id
274 %gep = getelementptr i64, i64* %gep.tid, i32 5
275 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p0i64(i64* %gep, i64 42, i32 0, i32 0, i1 false)
276 store i64 %result, i64* %out.gep
Matt Arsenault7757c592016-06-09 23:42:54 +0000277 ret void
278}
279
280; GCN-LABEL: {{^}}flat_atomic_dec_noret_i64_offset_addr64:
Stanislav Mekhanoshinc90347d2017-04-12 20:48:56 +0000281; GCN: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
282; GCN: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000283; CIVI: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]$}}
284; GFX9: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} offset:40{{$}}
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000285define amdgpu_kernel void @flat_atomic_dec_noret_i64_offset_addr64(i64* %ptr) #0 {
Matt Arsenault7757c592016-06-09 23:42:54 +0000286 %id = call i32 @llvm.amdgcn.workitem.id.x()
Yaxun Liu2a22c5d2018-02-02 16:07:16 +0000287 %gep.tid = getelementptr i64, i64* %ptr, i32 %id
288 %gep = getelementptr i64, i64* %gep.tid, i32 5
289 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p0i64(i64* %gep, i64 42, i32 0, i32 0, i1 false)
Matt Arsenault7757c592016-06-09 23:42:54 +0000290 ret void
291}
292
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000293@lds0 = addrspace(3) global [512 x i32] undef
294
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000295; GCN-LABEL: {{^}}atomic_dec_shl_base_lds_0:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000296; CIVI-DAG: s_mov_b32 m0
297; GFX9-NOT: m0
298
299; GCN-DAG: v_lshlrev_b32_e32 [[PTR:v[0-9]+]], 2, {{v[0-9]+}}
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000300; GCN: ds_dec_rtn_u32 {{v[0-9]+}}, [[PTR]], {{v[0-9]+}} offset:8
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000301define amdgpu_kernel void @atomic_dec_shl_base_lds_0(i32 addrspace(1)* %out, i32 addrspace(1)* %add_use) #0 {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000302 %tid.x = tail call i32 @llvm.amdgcn.workitem.id.x() #1
303 %idx.0 = add nsw i32 %tid.x, 2
304 %arrayidx0 = getelementptr inbounds [512 x i32], [512 x i32] addrspace(3)* @lds0, i32 0, i32 %idx.0
Matt Arsenault79f837c2017-03-30 22:21:40 +0000305 %val0 = call i32 @llvm.amdgcn.atomic.dec.i32.p3i32(i32 addrspace(3)* %arrayidx0, i32 9, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000306 store i32 %idx.0, i32 addrspace(1)* %add_use
307 store i32 %val0, i32 addrspace(1)* %out
308 ret void
309}
310
311; GCN-LABEL: {{^}}lds_atomic_dec_ret_i64:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000312; CIVI-DAG: s_mov_b32 m0
313; GFX9-NOT: m0
314
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000315; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
316; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
317; GCN: ds_dec_rtn_u64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000318define amdgpu_kernel void @lds_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) #0 {
Matt Arsenault79f837c2017-03-30 22:21:40 +0000319 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* %ptr, i64 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000320 store i64 %result, i64 addrspace(1)* %out
321 ret void
322}
323
324; GCN-LABEL: {{^}}lds_atomic_dec_ret_i64_offset:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000325; CIVI-DAG: s_mov_b32 m0
326; GFX9-NOT: m0
327
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000328; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
329; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
330; GCN: ds_dec_rtn_u64 v{{\[[0-9]+:[0-9]+\]}}, v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} offset:32
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000331define amdgpu_kernel void @lds_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(3)* %ptr) #0 {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000332 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault79f837c2017-03-30 22:21:40 +0000333 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* %gep, i64 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000334 store i64 %result, i64 addrspace(1)* %out
335 ret void
336}
337
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000338; GCN-LABEL: {{^}}lds_atomic_dec_noret_i64:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000339; CIVI-DAG: s_mov_b32 m0
340; GFX9-NOT: m0
341
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000342; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
343; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
344; GCN: ds_dec_u64 v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000345define amdgpu_kernel void @lds_atomic_dec_noret_i64(i64 addrspace(3)* %ptr) nounwind {
Matt Arsenault79f837c2017-03-30 22:21:40 +0000346 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* %ptr, i64 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000347 ret void
348}
349
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000350; GCN-LABEL: {{^}}lds_atomic_dec_noret_i64_offset:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000351; CIVI-DAG: s_mov_b32 m0
352; GFX9-NOT: m0
353
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000354; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
355; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
356; GCN: ds_dec_u64 v{{[0-9]+}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} offset:32{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000357define amdgpu_kernel void @lds_atomic_dec_noret_i64_offset(i64 addrspace(3)* %ptr) nounwind {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000358 %gep = getelementptr i64, i64 addrspace(3)* %ptr, i32 4
Matt Arsenault79f837c2017-03-30 22:21:40 +0000359 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* %gep, i64 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000360 ret void
361}
362
363; GCN-LABEL: {{^}}global_atomic_dec_ret_i64:
364; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
365; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000366; CIVI: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 glc{{$}}
367; GFX9: global_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off glc{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000368define amdgpu_kernel void @global_atomic_dec_ret_i64(i64 addrspace(1)* %out, i64 addrspace(1)* %ptr) #0 {
Matt Arsenault79f837c2017-03-30 22:21:40 +0000369 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %ptr, i64 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000370 store i64 %result, i64 addrspace(1)* %out
371 ret void
372}
373
374; GCN-LABEL: {{^}}global_atomic_dec_ret_i64_offset:
375; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
376; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000377; CIVI: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:32 glc{{$}}
378; GFX9: global_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off offset:32 glc{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000379define amdgpu_kernel void @global_atomic_dec_ret_i64_offset(i64 addrspace(1)* %out, i64 addrspace(1)* %ptr) #0 {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000380 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i32 4
Matt Arsenault79f837c2017-03-30 22:21:40 +0000381 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %gep, i64 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000382 store i64 %result, i64 addrspace(1)* %out
383 ret void
384}
385
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000386; GCN-LABEL: {{^}}global_atomic_dec_noret_i64:
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000387; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
388; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000389; CIVI: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0{{$}}
390; GFX9: global_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000391define amdgpu_kernel void @global_atomic_dec_noret_i64(i64 addrspace(1)* %ptr) nounwind {
Matt Arsenault79f837c2017-03-30 22:21:40 +0000392 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %ptr, i64 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000393 ret void
394}
395
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000396; GCN-LABEL: {{^}}global_atomic_dec_noret_i64_offset:
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000397; GCN-DAG: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
398; GCN-DAG: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
Matt Arsenaultcf9b6d82017-11-12 23:40:12 +0000399; CIVI: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off, s{{\[[0-9]+:[0-9]+\]}}, 0 offset:32{{$}}
400; GFX9: global_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}, off offset:32{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000401define amdgpu_kernel void @global_atomic_dec_noret_i64_offset(i64 addrspace(1)* %ptr) nounwind {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000402 %gep = getelementptr i64, i64 addrspace(1)* %ptr, i32 4
Matt Arsenault79f837c2017-03-30 22:21:40 +0000403 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %gep, i64 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000404 ret void
405}
406
407; GCN-LABEL: {{^}}global_atomic_dec_ret_i64_offset_addr64:
Stanislav Mekhanoshinc90347d2017-04-12 20:48:56 +0000408; GCN: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
Stanislav Mekhanoshin5fa289f2017-05-22 16:58:10 +0000409; CI: v_mov_b32_e32 v{{[0-9]+}}, 0{{$}}
Stanislav Mekhanoshinc90347d2017-04-12 20:48:56 +0000410; GCN: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000411; CI: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:40 glc{{$}}
412; VI: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}} glc{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000413define amdgpu_kernel void @global_atomic_dec_ret_i64_offset_addr64(i64 addrspace(1)* %out, i64 addrspace(1)* %ptr) #0 {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000414 %id = call i32 @llvm.amdgcn.workitem.id.x()
415 %gep.tid = getelementptr i64, i64 addrspace(1)* %ptr, i32 %id
416 %out.gep = getelementptr i64, i64 addrspace(1)* %out, i32 %id
417 %gep = getelementptr i64, i64 addrspace(1)* %gep.tid, i32 5
Matt Arsenault79f837c2017-03-30 22:21:40 +0000418 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %gep, i64 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000419 store i64 %result, i64 addrspace(1)* %out.gep
420 ret void
421}
422
423; GCN-LABEL: {{^}}global_atomic_dec_noret_i64_offset_addr64:
Stanislav Mekhanoshinc90347d2017-04-12 20:48:56 +0000424; GCN: v_mov_b32_e32 v[[KLO:[0-9]+]], 42
Stanislav Mekhanoshin5fa289f2017-05-22 16:58:10 +0000425; CI: v_mov_b32_e32 v{{[0-9]+}}, 0{{$}}
Stanislav Mekhanoshinc90347d2017-04-12 20:48:56 +0000426; GCN: v_mov_b32_e32 v[[KHI:[0-9]+]], 0{{$}}
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000427; CI: buffer_atomic_dec_x2 v{{\[}}[[KLO]]:[[KHI]]{{\]}}, v{{\[[0-9]+:[0-9]+\]}}, s{{\[[0-9]+:[0-9]+\]}}, 0 addr64 offset:40{{$}}
428; VI: flat_atomic_dec_x2 v{{\[[0-9]+:[0-9]+\]}}, v{{\[}}[[KLO]]:[[KHI]]{{\]}}{{$}}
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000429define amdgpu_kernel void @global_atomic_dec_noret_i64_offset_addr64(i64 addrspace(1)* %ptr) #0 {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000430 %id = call i32 @llvm.amdgcn.workitem.id.x()
431 %gep.tid = getelementptr i64, i64 addrspace(1)* %ptr, i32 %id
432 %gep = getelementptr i64, i64 addrspace(1)* %gep.tid, i32 5
Matt Arsenault79f837c2017-03-30 22:21:40 +0000433 %result = call i64 @llvm.amdgcn.atomic.dec.i64.p1i64(i64 addrspace(1)* %gep, i64 42, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000434 ret void
435}
436
437@lds1 = addrspace(3) global [512 x i64] undef, align 8
438
439; GCN-LABEL: {{^}}atomic_dec_shl_base_lds_0_i64:
Matt Arsenault3f71c0e2017-11-29 00:55:57 +0000440; CIVI-DAG: s_mov_b32 m0
441; GFX9-NOT: m0
442
443; GCN-DAG: v_lshlrev_b32_e32 [[PTR:v[0-9]+]], 3, {{v[0-9]+}}
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000444; GCN: ds_dec_rtn_u64 v{{\[[0-9]+:[0-9]+\]}}, [[PTR]], v{{\[[0-9]+:[0-9]+\]}} offset:16
Matt Arsenault3dbeefa2017-03-21 21:39:51 +0000445define amdgpu_kernel void @atomic_dec_shl_base_lds_0_i64(i64 addrspace(1)* %out, i32 addrspace(1)* %add_use) #0 {
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000446 %tid.x = tail call i32 @llvm.amdgcn.workitem.id.x() #1
447 %idx.0 = add nsw i32 %tid.x, 2
448 %arrayidx0 = getelementptr inbounds [512 x i64], [512 x i64] addrspace(3)* @lds1, i32 0, i32 %idx.0
Matt Arsenault79f837c2017-03-30 22:21:40 +0000449 %val0 = call i64 @llvm.amdgcn.atomic.dec.i64.p3i64(i64 addrspace(3)* %arrayidx0, i64 9, i32 0, i32 0, i1 false)
Matt Arsenaulta9dbdca2016-04-12 14:05:04 +0000450 store i32 %idx.0, i32 addrspace(1)* %add_use
451 store i64 %val0, i64 addrspace(1)* %out
452 ret void
453}
454
455attributes #0 = { nounwind }
456attributes #1 = { nounwind readnone }
457attributes #2 = { nounwind argmemonly }