xref: /aosp_15_r20/external/llvm/test/CodeGen/AMDGPU/flat-address-space.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -march=amdgcn -mcpu=bonaire -mattr=-promote-alloca < %s | FileCheck -check-prefix=CHECK -check-prefix=CHECK-NO-PROMOTE %s
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -march=amdgcn -mcpu=bonaire -mattr=+promote-alloca < %s | FileCheck -check-prefix=CHECK -check-prefix=CHECK-PROMOTE %s
3*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -march=amdgcn -mcpu=tonga -mattr=-promote-alloca < %s | FileCheck -check-prefix=CHECK -check-prefix=CHECK-NO-PROMOTE %s
4*9880d681SAndroid Build Coastguard Worker; RUN: llc -O0 -march=amdgcn -mcpu=tonga -mattr=+promote-alloca < %s | FileCheck -check-prefix=CHECK -check-prefix=CHECK-PROMOTE %s
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Worker; Disable optimizations in case there are optimizations added that
7*9880d681SAndroid Build Coastguard Worker; specialize away generic pointer accesses.
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; These testcases might become useless when there are optimizations to
11*9880d681SAndroid Build Coastguard Worker; remove generic pointers.
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}store_flat_i32:
14*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_load_dwordx2 s{{\[}}[[LO_SREG:[0-9]+]]:[[HI_SREG:[0-9]+]]],
15*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: s_load_dword s[[SDATA:[0-9]+]],
16*9880d681SAndroid Build Coastguard Worker; CHECK: s_waitcnt lgkmcnt(0)
17*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v[[DATA:[0-9]+]], s[[SDATA]]
18*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v[[LO_VREG:[0-9]+]], s[[LO_SREG]]
19*9880d681SAndroid Build Coastguard Worker; CHECK-DAG: v_mov_b32_e32 v[[HI_VREG:[0-9]+]], s[[HI_SREG]]
20*9880d681SAndroid Build Coastguard Worker; CHECK: flat_store_dword v{{\[}}[[LO_VREG]]:[[HI_VREG]]{{\]}}, v[[DATA]]
21*9880d681SAndroid Build Coastguard Workerdefine void @store_flat_i32(i32 addrspace(1)* %gptr, i32 %x) #0 {
22*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast i32 addrspace(1)* %gptr to i32 addrspace(4)*
23*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32 addrspace(4)* %fptr, align 4
24*9880d681SAndroid Build Coastguard Worker  ret void
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}store_flat_i64:
28*9880d681SAndroid Build Coastguard Worker; CHECK: flat_store_dwordx2
29*9880d681SAndroid Build Coastguard Workerdefine void @store_flat_i64(i64 addrspace(1)* %gptr, i64 %x) #0 {
30*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast i64 addrspace(1)* %gptr to i64 addrspace(4)*
31*9880d681SAndroid Build Coastguard Worker  store i64 %x, i64 addrspace(4)* %fptr, align 8
32*9880d681SAndroid Build Coastguard Worker  ret void
33*9880d681SAndroid Build Coastguard Worker}
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}store_flat_v4i32:
36*9880d681SAndroid Build Coastguard Worker; CHECK: flat_store_dwordx4
37*9880d681SAndroid Build Coastguard Workerdefine void @store_flat_v4i32(<4 x i32> addrspace(1)* %gptr, <4 x i32> %x) #0 {
38*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast <4 x i32> addrspace(1)* %gptr to <4 x i32> addrspace(4)*
39*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %x, <4 x i32> addrspace(4)* %fptr, align 16
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}store_flat_trunc_i16:
44*9880d681SAndroid Build Coastguard Worker; CHECK: flat_store_short
45*9880d681SAndroid Build Coastguard Workerdefine void @store_flat_trunc_i16(i16 addrspace(1)* %gptr, i32 %x) #0 {
46*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast i16 addrspace(1)* %gptr to i16 addrspace(4)*
47*9880d681SAndroid Build Coastguard Worker  %y = trunc i32 %x to i16
48*9880d681SAndroid Build Coastguard Worker  store i16 %y, i16 addrspace(4)* %fptr, align 2
49*9880d681SAndroid Build Coastguard Worker  ret void
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: {{^}}store_flat_trunc_i8:
53*9880d681SAndroid Build Coastguard Worker; CHECK: flat_store_byte
54*9880d681SAndroid Build Coastguard Workerdefine void @store_flat_trunc_i8(i8 addrspace(1)* %gptr, i32 %x) #0 {
55*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast i8 addrspace(1)* %gptr to i8 addrspace(4)*
56*9880d681SAndroid Build Coastguard Worker  %y = trunc i32 %x to i8
57*9880d681SAndroid Build Coastguard Worker  store i8 %y, i8 addrspace(4)* %fptr, align 2
58*9880d681SAndroid Build Coastguard Worker  ret void
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_flat_i32:
64*9880d681SAndroid Build Coastguard Worker; CHECK: flat_load_dword
65*9880d681SAndroid Build Coastguard Workerdefine void @load_flat_i32(i32 addrspace(1)* noalias %out, i32 addrspace(1)* noalias %gptr) #0 {
66*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast i32 addrspace(1)* %gptr to i32 addrspace(4)*
67*9880d681SAndroid Build Coastguard Worker  %fload = load i32, i32 addrspace(4)* %fptr, align 4
68*9880d681SAndroid Build Coastguard Worker  store i32 %fload, i32 addrspace(1)* %out, align 4
69*9880d681SAndroid Build Coastguard Worker  ret void
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_flat_i64:
73*9880d681SAndroid Build Coastguard Worker; CHECK: flat_load_dwordx2
74*9880d681SAndroid Build Coastguard Workerdefine void @load_flat_i64(i64 addrspace(1)* noalias %out, i64 addrspace(1)* noalias %gptr) #0 {
75*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast i64 addrspace(1)* %gptr to i64 addrspace(4)*
76*9880d681SAndroid Build Coastguard Worker  %fload = load i64, i64 addrspace(4)* %fptr, align 4
77*9880d681SAndroid Build Coastguard Worker  store i64 %fload, i64 addrspace(1)* %out, align 8
78*9880d681SAndroid Build Coastguard Worker  ret void
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_flat_v4i32:
82*9880d681SAndroid Build Coastguard Worker; CHECK: flat_load_dwordx4
83*9880d681SAndroid Build Coastguard Workerdefine void @load_flat_v4i32(<4 x i32> addrspace(1)* noalias %out, <4 x i32> addrspace(1)* noalias %gptr) #0 {
84*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast <4 x i32> addrspace(1)* %gptr to <4 x i32> addrspace(4)*
85*9880d681SAndroid Build Coastguard Worker  %fload = load <4 x i32>, <4 x i32> addrspace(4)* %fptr, align 4
86*9880d681SAndroid Build Coastguard Worker  store <4 x i32> %fload, <4 x i32> addrspace(1)* %out, align 8
87*9880d681SAndroid Build Coastguard Worker  ret void
88*9880d681SAndroid Build Coastguard Worker}
89*9880d681SAndroid Build Coastguard Worker
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sextload_flat_i8:
91*9880d681SAndroid Build Coastguard Worker; CHECK: flat_load_sbyte
92*9880d681SAndroid Build Coastguard Workerdefine void @sextload_flat_i8(i32 addrspace(1)* noalias %out, i8 addrspace(1)* noalias %gptr) #0 {
93*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast i8 addrspace(1)* %gptr to i8 addrspace(4)*
94*9880d681SAndroid Build Coastguard Worker  %fload = load i8, i8 addrspace(4)* %fptr, align 4
95*9880d681SAndroid Build Coastguard Worker  %ext = sext i8 %fload to i32
96*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
97*9880d681SAndroid Build Coastguard Worker  ret void
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: zextload_flat_i8:
101*9880d681SAndroid Build Coastguard Worker; CHECK: flat_load_ubyte
102*9880d681SAndroid Build Coastguard Workerdefine void @zextload_flat_i8(i32 addrspace(1)* noalias %out, i8 addrspace(1)* noalias %gptr) #0 {
103*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast i8 addrspace(1)* %gptr to i8 addrspace(4)*
104*9880d681SAndroid Build Coastguard Worker  %fload = load i8, i8 addrspace(4)* %fptr, align 4
105*9880d681SAndroid Build Coastguard Worker  %ext = zext i8 %fload to i32
106*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
107*9880d681SAndroid Build Coastguard Worker  ret void
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sextload_flat_i16:
111*9880d681SAndroid Build Coastguard Worker; CHECK: flat_load_sshort
112*9880d681SAndroid Build Coastguard Workerdefine void @sextload_flat_i16(i32 addrspace(1)* noalias %out, i16 addrspace(1)* noalias %gptr) #0 {
113*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast i16 addrspace(1)* %gptr to i16 addrspace(4)*
114*9880d681SAndroid Build Coastguard Worker  %fload = load i16, i16 addrspace(4)* %fptr, align 4
115*9880d681SAndroid Build Coastguard Worker  %ext = sext i16 %fload to i32
116*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
117*9880d681SAndroid Build Coastguard Worker  ret void
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: zextload_flat_i16:
121*9880d681SAndroid Build Coastguard Worker; CHECK: flat_load_ushort
122*9880d681SAndroid Build Coastguard Workerdefine void @zextload_flat_i16(i32 addrspace(1)* noalias %out, i16 addrspace(1)* noalias %gptr) #0 {
123*9880d681SAndroid Build Coastguard Worker  %fptr = addrspacecast i16 addrspace(1)* %gptr to i16 addrspace(4)*
124*9880d681SAndroid Build Coastguard Worker  %fload = load i16, i16 addrspace(4)* %fptr, align 4
125*9880d681SAndroid Build Coastguard Worker  %ext = zext i16 %fload to i32
126*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32 addrspace(1)* %out, align 4
127*9880d681SAndroid Build Coastguard Worker  ret void
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerattributes #0 = { nounwind }
131*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind convergent }
132*9880d681SAndroid Build Coastguard Workerattributes #3 = { nounwind readnone }
133