1; RUN: llc -march=amdgcn < %s | FileCheck -check-prefix=GCN %s
2
3; Pointer value is stored in a candidate for LDS usage.
4
5; GCN-LABEL: {{^}}stored_lds_pointer_value:
6; GCN: buffer_store_dword v
7define void @stored_lds_pointer_value(float* addrspace(1)* %ptr) #0 {
8  %tmp = alloca float
9  store float 0.0, float *%tmp
10  store float* %tmp, float* addrspace(1)* %ptr
11  ret void
12}
13
14; GCN-LABEL: {{^}}stored_lds_pointer_value_gep:
15; GCN-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD0
16; GCN-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD1
17; GCN: buffer_store_dword v
18; GCN: buffer_store_dword v
19define void @stored_lds_pointer_value_gep(float* addrspace(1)* %ptr, i32 %idx) #0 {
20bb:
21  %tmp = alloca float, i32 16
22  store float 0.0, float* %tmp
23  %tmp2 = getelementptr inbounds float, float* %tmp, i32 %idx
24  store float* %tmp2, float* addrspace(1)* %ptr
25  ret void
26}
27
28; Pointer value is stored in a candidate for vector usage
29; GCN-LABEL: {{^}}stored_vector_pointer_value:
30; GCN-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD0
31; GCN-DAG: s_mov_b32 s{{[0-9]+}}, SCRATCH_RSRC_DWORD1
32; GCN: buffer_store_dword
33; GCN: buffer_store_dword
34; GCN: buffer_store_dword
35; GCN: buffer_store_dword
36define void @stored_vector_pointer_value(i32* addrspace(1)* %out, i32 %index) {
37entry:
38  %tmp0 = alloca [4 x i32]
39  %x = getelementptr [4 x i32], [4 x i32]* %tmp0, i32 0, i32 0
40  %y = getelementptr [4 x i32], [4 x i32]* %tmp0, i32 0, i32 1
41  %z = getelementptr [4 x i32], [4 x i32]* %tmp0, i32 0, i32 2
42  %w = getelementptr [4 x i32], [4 x i32]* %tmp0, i32 0, i32 3
43  store i32 0, i32* %x
44  store i32 1, i32* %y
45  store i32 2, i32* %z
46  store i32 3, i32* %w
47  %tmp1 = getelementptr [4 x i32], [4 x i32]* %tmp0, i32 0, i32 %index
48  store i32* %tmp1, i32* addrspace(1)* %out
49  ret void
50}
51
52attributes #0 = { nounwind }
53