xref: /llvm-project/llvm/test/CodeGen/AMDGPU/addrspacecast.gfx6.ll (revision 4490003a22658dcd12527029b2c8682b63d8a9d6)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -global-isel=0 -mtriple=amdgcn-amd-amdpal -mcpu=tahiti < %s | FileCheck -check-prefixes=CHECK,SDAG %s
3; RUN: llc -global-isel=1 -mtriple=amdgcn-amd-amdpal -mcpu=tahiti < %s | FileCheck -check-prefixes=CHECK,GISEL %s
4
5define ptr @global_to_flat_addrspacecast(ptr addrspace(1) %ptr) {
6; CHECK-LABEL: global_to_flat_addrspacecast:
7; CHECK:       ; %bb.0:
8; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
9; CHECK-NEXT:    s_setpc_b64 s[30:31]
10  %stof = addrspacecast ptr addrspace(1) %ptr to ptr
11  ret ptr %stof
12}
13
14define ptr addrspace(1) @flat_to_gobal_addrspacecast(ptr %ptr) {
15; CHECK-LABEL: flat_to_gobal_addrspacecast:
16; CHECK:       ; %bb.0:
17; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
18; CHECK-NEXT:    s_setpc_b64 s[30:31]
19  %stof = addrspacecast ptr %ptr to ptr addrspace(1)
20  ret ptr addrspace(1) %stof
21}
22
23define ptr @group_to_flat_addrspacecast(ptr addrspace(3) %ptr) {
24; CHECK-LABEL: group_to_flat_addrspacecast:
25; CHECK:       ; %bb.0:
26; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
27; CHECK-NEXT:    s_mov_b64 s[4:5], 0xc4
28; CHECK-NEXT:    s_load_dword s4, s[4:5], 0x0
29; CHECK-NEXT:    v_cmp_ne_u32_e32 vcc, -1, v0
30; CHECK-NEXT:    v_cndmask_b32_e32 v0, 0, v0, vcc
31; CHECK-NEXT:    s_waitcnt lgkmcnt(0)
32; CHECK-NEXT:    v_mov_b32_e32 v1, s4
33; CHECK-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
34; CHECK-NEXT:    s_setpc_b64 s[30:31]
35  %stof = addrspacecast ptr addrspace(3) %ptr to ptr
36  ret ptr %stof
37}
38
39define ptr addrspace(3) @flat_to_group_addrspacecast(ptr %ptr) {
40; CHECK-LABEL: flat_to_group_addrspacecast:
41; CHECK:       ; %bb.0:
42; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
43; CHECK-NEXT:    v_cmp_ne_u64_e32 vcc, 0, v[0:1]
44; CHECK-NEXT:    v_cndmask_b32_e32 v0, -1, v0, vcc
45; CHECK-NEXT:    s_setpc_b64 s[30:31]
46  %stof = addrspacecast ptr %ptr to ptr addrspace(3)
47  ret ptr addrspace(3) %stof
48}
49
50define ptr @private_to_flat_addrspacecast(ptr addrspace(5) %ptr) {
51; CHECK-LABEL: private_to_flat_addrspacecast:
52; CHECK:       ; %bb.0:
53; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
54; CHECK-NEXT:    s_mov_b64 s[4:5], 0xc0
55; CHECK-NEXT:    s_load_dword s4, s[4:5], 0x0
56; CHECK-NEXT:    v_cmp_ne_u32_e32 vcc, -1, v0
57; CHECK-NEXT:    v_cndmask_b32_e32 v0, 0, v0, vcc
58; CHECK-NEXT:    s_waitcnt lgkmcnt(0)
59; CHECK-NEXT:    v_mov_b32_e32 v1, s4
60; CHECK-NEXT:    v_cndmask_b32_e32 v1, 0, v1, vcc
61; CHECK-NEXT:    s_setpc_b64 s[30:31]
62  %stof = addrspacecast ptr addrspace(5) %ptr to ptr
63  ret ptr %stof
64}
65
66define ptr addrspace(5) @flat_to_private_addrspacecast(ptr %ptr) {
67; CHECK-LABEL: flat_to_private_addrspacecast:
68; CHECK:       ; %bb.0:
69; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
70; CHECK-NEXT:    v_cmp_ne_u64_e32 vcc, 0, v[0:1]
71; CHECK-NEXT:    v_cndmask_b32_e32 v0, -1, v0, vcc
72; CHECK-NEXT:    s_setpc_b64 s[30:31]
73  %stof = addrspacecast ptr %ptr to ptr addrspace(5)
74  ret ptr addrspace(5) %stof
75}
76
77define ptr addrspace(6) @constant_to_constant32_addrspacecast(ptr addrspace(4) %ptr, i32 %offset) {
78; CHECK-LABEL: constant_to_constant32_addrspacecast:
79; CHECK:       ; %bb.0:
80; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
81; CHECK-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
82; CHECK-NEXT:    s_setpc_b64 s[30:31]
83  %addrspacecast = addrspacecast ptr addrspace(4) %ptr to ptr addrspace(6)
84  %gep = getelementptr i8, ptr addrspace(6) %addrspacecast, i32 %offset
85  ret ptr addrspace(6) %gep
86}
87
88define ptr addrspace(6) @global_to_constant32_addrspacecast(ptr addrspace(1) %ptr, i32 %offset) {
89; CHECK-LABEL: global_to_constant32_addrspacecast:
90; CHECK:       ; %bb.0:
91; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
92; CHECK-NEXT:    v_add_i32_e32 v0, vcc, v0, v2
93; CHECK-NEXT:    s_setpc_b64 s[30:31]
94  %addrspacecast = addrspacecast ptr addrspace(1) %ptr to ptr addrspace(6)
95  %gep = getelementptr i8, ptr addrspace(6) %addrspacecast, i32 %offset
96  ret ptr addrspace(6) %gep
97}
98
99define ptr @constant32bit_to_flat_addrspacecast_0(ptr addrspace(6) %ptr) {
100; CHECK-LABEL: constant32bit_to_flat_addrspacecast_0:
101; CHECK:       ; %bb.0:
102; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
103; CHECK-NEXT:    v_mov_b32_e32 v1, 0
104; CHECK-NEXT:    s_setpc_b64 s[30:31]
105  %stof = addrspacecast ptr addrspace(6) %ptr to ptr
106  ret ptr %stof
107}
108
109define ptr @constant32bit_to_flat_addrspacecast_1(ptr addrspace(6) %ptr) #0 {
110; CHECK-LABEL: constant32bit_to_flat_addrspacecast_1:
111; CHECK:       ; %bb.0:
112; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
113; CHECK-NEXT:    v_mov_b32_e32 v1, 0xffff8000
114; CHECK-NEXT:    s_setpc_b64 s[30:31]
115  %stof = addrspacecast ptr addrspace(6) %ptr to ptr
116  ret ptr %stof
117}
118
119define ptr @constant32bit_to_flat_addrspacecast_null() {
120; CHECK-LABEL: constant32bit_to_flat_addrspacecast_null:
121; CHECK:       ; %bb.0:
122; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
123; CHECK-NEXT:    v_mov_b32_e32 v0, 0
124; CHECK-NEXT:    v_mov_b32_e32 v1, 0
125; CHECK-NEXT:    s_setpc_b64 s[30:31]
126  %stof = addrspacecast ptr addrspace(6) null to ptr
127  ret ptr %stof
128}
129
130define ptr @constant32bit_to_flat_addrspacecast_undef() #0 {
131; SDAG-LABEL: constant32bit_to_flat_addrspacecast_undef:
132; SDAG:       ; %bb.0:
133; SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
134; SDAG-NEXT:    v_mov_b32_e32 v1, 0
135; SDAG-NEXT:    s_setpc_b64 s[30:31]
136;
137; GISEL-LABEL: constant32bit_to_flat_addrspacecast_undef:
138; GISEL:       ; %bb.0:
139; GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
140; GISEL-NEXT:    s_setpc_b64 s[30:31]
141  %stof = addrspacecast ptr addrspace(6) undef to ptr
142  ret ptr %stof
143}
144
145define ptr @constant32bit_to_flat_addrspacecast_poison() #0 {
146; SDAG-LABEL: constant32bit_to_flat_addrspacecast_poison:
147; SDAG:       ; %bb.0:
148; SDAG-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
149; SDAG-NEXT:    v_mov_b32_e32 v1, 0
150; SDAG-NEXT:    s_setpc_b64 s[30:31]
151;
152; GISEL-LABEL: constant32bit_to_flat_addrspacecast_poison:
153; GISEL:       ; %bb.0:
154; GISEL-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
155; GISEL-NEXT:    s_setpc_b64 s[30:31]
156  %stof = addrspacecast ptr addrspace(6) poison to ptr
157  ret ptr %stof
158}
159
160define ptr @constant32bit_to_flat_addrspacecast_constant() #0 {
161; CHECK-LABEL: constant32bit_to_flat_addrspacecast_constant:
162; CHECK:       ; %bb.0:
163; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
164; CHECK-NEXT:    v_mov_b32_e32 v0, 0x3039
165; CHECK-NEXT:    v_mov_b32_e32 v1, 0xffff8000
166; CHECK-NEXT:    s_setpc_b64 s[30:31]
167  %stof = addrspacecast ptr addrspace(6) inttoptr (i32 12345 to ptr addrspace(6)) to ptr
168  ret ptr %stof
169}
170
171define ptr addrspace(1) @addrspacecast_flat_null_to_global() {
172; CHECK-LABEL: addrspacecast_flat_null_to_global:
173; CHECK:       ; %bb.0:
174; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
175; CHECK-NEXT:    v_mov_b32_e32 v0, 0
176; CHECK-NEXT:    v_mov_b32_e32 v1, 0
177; CHECK-NEXT:    s_setpc_b64 s[30:31]
178  ret ptr addrspace(1) addrspacecast (ptr null to ptr addrspace(1))
179}
180
181define ptr addrspace(3) @addrspacecast_flat_null_to_group() {
182; CHECK-LABEL: addrspacecast_flat_null_to_group:
183; CHECK:       ; %bb.0:
184; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
185; CHECK-NEXT:    v_mov_b32_e32 v0, -1
186; CHECK-NEXT:    s_setpc_b64 s[30:31]
187  ret ptr addrspace(3) addrspacecast (ptr null to ptr addrspace(3))
188}
189
190define ptr addrspace(5) @addrspacecast_flat_null_to_private() {
191; CHECK-LABEL: addrspacecast_flat_null_to_private:
192; CHECK:       ; %bb.0:
193; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
194; CHECK-NEXT:    v_mov_b32_e32 v0, -1
195; CHECK-NEXT:    s_setpc_b64 s[30:31]
196  ret ptr addrspace(5) addrspacecast (ptr null to ptr addrspace(5))
197}
198
199define ptr addrspace(6) @addrspacecast_flat_null_to_constant32bit() {
200; CHECK-LABEL: addrspacecast_flat_null_to_constant32bit:
201; CHECK:       ; %bb.0:
202; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
203; CHECK-NEXT:    v_mov_b32_e32 v0, 0
204; CHECK-NEXT:    s_setpc_b64 s[30:31]
205  ret ptr addrspace(6) addrspacecast (ptr null to ptr addrspace(6))
206}
207
208attributes #0 = { "amdgpu-32bit-address-high-bits"="0xffff8000" }
209
210!llvm.module.flags = !{!0}
211!0 = !{i32 1, !"amdhsa_code_object_version", i32 500}
212