1+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
12; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_32 | FileCheck %s
23; RUN: %if ptxas %{ llc < %s -mtriple=nvptx64 -mcpu=sm_32 | %ptxas-verify %}
34
@@ -22,145 +23,305 @@ declare double @llvm.nvvm.ldg.global.f.f64.p1(ptr addrspace(1) %ptr, i32 %align)
2223declare half @llvm.nvvm.ldg.global.f.f16.p1 (ptr addrspace (1 ) %ptr , i32 %align )
2324declare <2 x half > @llvm.nvvm.ldg.global.f.v2f16.p1 (ptr addrspace (1 ) %ptr , i32 %align )
2425
25- ; CHECK-LABEL: test_ldu_i8
2626define i8 @test_ldu_i8 (ptr addrspace (1 ) %ptr ) {
27- ; CHECK: ldu.global.u8
27+ ; CHECK-LABEL: test_ldu_i8(
28+ ; CHECK: {
29+ ; CHECK-NEXT: .reg .b16 %rs<2>;
30+ ; CHECK-NEXT: .reg .b32 %r<3>;
31+ ; CHECK-NEXT: .reg .b64 %rd<2>;
32+ ; CHECK-EMPTY:
33+ ; CHECK-NEXT: // %bb.0:
34+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldu_i8_param_0];
35+ ; CHECK-NEXT: ldu.global.u8 %rs1, [%rd1];
36+ ; CHECK-NEXT: cvt.u32.u16 %r1, %rs1;
37+ ; CHECK-NEXT: and.b32 %r2, %r1, 255;
38+ ; CHECK-NEXT: st.param.b32 [func_retval0], %r2;
39+ ; CHECK-NEXT: ret;
2840 %val = tail call i8 @llvm.nvvm.ldu.global.i.i8.p1 (ptr addrspace (1 ) %ptr , i32 4 )
2941 ret i8 %val
3042}
3143
32- ; CHECK-LABEL: test_ldu_i16
3344define i16 @test_ldu_i16 (ptr addrspace (1 ) %ptr ) {
34- ; CHECK: ldu.global.u16
45+ ; CHECK-LABEL: test_ldu_i16(
46+ ; CHECK: {
47+ ; CHECK-NEXT: .reg .b16 %rs<2>;
48+ ; CHECK-NEXT: .reg .b32 %r<2>;
49+ ; CHECK-NEXT: .reg .b64 %rd<2>;
50+ ; CHECK-EMPTY:
51+ ; CHECK-NEXT: // %bb.0:
52+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldu_i16_param_0];
53+ ; CHECK-NEXT: ldu.global.u16 %rs1, [%rd1];
54+ ; CHECK-NEXT: cvt.u32.u16 %r1, %rs1;
55+ ; CHECK-NEXT: st.param.b32 [func_retval0], %r1;
56+ ; CHECK-NEXT: ret;
3557 %val = tail call i16 @llvm.nvvm.ldu.global.i.i16.p1 (ptr addrspace (1 ) %ptr , i32 2 )
3658 ret i16 %val
3759}
3860
39- ; CHECK-LABEL: test_ldu_i32
4061define i32 @test_ldu_i32 (ptr addrspace (1 ) %ptr ) {
41- ; CHECK: ldu.global.u32
62+ ; CHECK-LABEL: test_ldu_i32(
63+ ; CHECK: {
64+ ; CHECK-NEXT: .reg .b32 %r<2>;
65+ ; CHECK-NEXT: .reg .b64 %rd<2>;
66+ ; CHECK-EMPTY:
67+ ; CHECK-NEXT: // %bb.0:
68+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldu_i32_param_0];
69+ ; CHECK-NEXT: ldu.global.u32 %r1, [%rd1];
70+ ; CHECK-NEXT: st.param.b32 [func_retval0], %r1;
71+ ; CHECK-NEXT: ret;
4272 %val = tail call i32 @llvm.nvvm.ldu.global.i.i32.p1 (ptr addrspace (1 ) %ptr , i32 4 )
4373 ret i32 %val
4474}
4575
46- ; CHECK-LABEL: test_ldu_i64
4776define i64 @test_ldu_i64 (ptr addrspace (1 ) %ptr ) {
48- ; CHECK: ldu.global.u64
77+ ; CHECK-LABEL: test_ldu_i64(
78+ ; CHECK: {
79+ ; CHECK-NEXT: .reg .b64 %rd<3>;
80+ ; CHECK-EMPTY:
81+ ; CHECK-NEXT: // %bb.0:
82+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldu_i64_param_0];
83+ ; CHECK-NEXT: ldu.global.u64 %rd2, [%rd1];
84+ ; CHECK-NEXT: st.param.b64 [func_retval0], %rd2;
85+ ; CHECK-NEXT: ret;
4986 %val = tail call i64 @llvm.nvvm.ldu.global.i.i64.p1 (ptr addrspace (1 ) %ptr , i32 8 )
5087 ret i64 %val
5188}
5289
53- ; CHECK-LABEL: test_ldu_p
5490define ptr @test_ldu_p (ptr addrspace (1 ) %ptr ) {
55- ; CHECK: ldu.global.u64
91+ ; CHECK-LABEL: test_ldu_p(
92+ ; CHECK: {
93+ ; CHECK-NEXT: .reg .b64 %rd<3>;
94+ ; CHECK-EMPTY:
95+ ; CHECK-NEXT: // %bb.0:
96+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldu_p_param_0];
97+ ; CHECK-NEXT: ldu.global.u64 %rd2, [%rd1];
98+ ; CHECK-NEXT: st.param.b64 [func_retval0], %rd2;
99+ ; CHECK-NEXT: ret;
56100 %val = tail call ptr @llvm.nvvm.ldu.global.p.p1 (ptr addrspace (1 ) %ptr , i32 8 )
57101 ret ptr %val
58102}
59103
60-
61- ; CHECK-LABEL: test_ldu_f32
62104define float @test_ldu_f32 (ptr addrspace (1 ) %ptr ) {
63- ; CHECK: ldu.global.f32
105+ ; CHECK-LABEL: test_ldu_f32(
106+ ; CHECK: {
107+ ; CHECK-NEXT: .reg .f32 %f<2>;
108+ ; CHECK-NEXT: .reg .b64 %rd<2>;
109+ ; CHECK-EMPTY:
110+ ; CHECK-NEXT: // %bb.0:
111+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldu_f32_param_0];
112+ ; CHECK-NEXT: ldu.global.f32 %f1, [%rd1];
113+ ; CHECK-NEXT: st.param.f32 [func_retval0], %f1;
114+ ; CHECK-NEXT: ret;
64115 %val = tail call float @llvm.nvvm.ldu.global.f.f32.p1 (ptr addrspace (1 ) %ptr , i32 4 )
65116 ret float %val
66117}
67118
68- ; CHECK-LABEL: test_ldu_f64
69119define double @test_ldu_f64 (ptr addrspace (1 ) %ptr ) {
70- ; CHECK: ldu.global.f64
120+ ; CHECK-LABEL: test_ldu_f64(
121+ ; CHECK: {
122+ ; CHECK-NEXT: .reg .b64 %rd<2>;
123+ ; CHECK-NEXT: .reg .f64 %fd<2>;
124+ ; CHECK-EMPTY:
125+ ; CHECK-NEXT: // %bb.0:
126+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldu_f64_param_0];
127+ ; CHECK-NEXT: ldu.global.f64 %fd1, [%rd1];
128+ ; CHECK-NEXT: st.param.f64 [func_retval0], %fd1;
129+ ; CHECK-NEXT: ret;
71130 %val = tail call double @llvm.nvvm.ldu.global.f.f64.p1 (ptr addrspace (1 ) %ptr , i32 8 )
72131 ret double %val
73132}
74133
75- ; CHECK-LABEL: test_ldu_f16
76134define half @test_ldu_f16 (ptr addrspace (1 ) %ptr ) {
77- ; CHECK: ldu.global.u16
135+ ; CHECK-LABEL: test_ldu_f16(
136+ ; CHECK: {
137+ ; CHECK-NEXT: .reg .b16 %rs<2>;
138+ ; CHECK-NEXT: .reg .b64 %rd<2>;
139+ ; CHECK-EMPTY:
140+ ; CHECK-NEXT: // %bb.0:
141+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldu_f16_param_0];
142+ ; CHECK-NEXT: ldu.global.u16 %rs1, [%rd1];
143+ ; CHECK-NEXT: st.param.b16 [func_retval0], %rs1;
144+ ; CHECK-NEXT: ret;
78145 %val = tail call half @llvm.nvvm.ldu.global.f.f16.p1 (ptr addrspace (1 ) %ptr , i32 2 )
79146 ret half %val
80147}
81148
82- ; CHECK-LABEL: test_ldu_v2f16
83149define <2 x half > @test_ldu_v2f16 (ptr addrspace (1 ) %ptr ) {
84- ; CHECK: ldu.global.u32
150+ ; CHECK-LABEL: test_ldu_v2f16(
151+ ; CHECK: {
152+ ; CHECK-NEXT: .reg .b32 %r<2>;
153+ ; CHECK-NEXT: .reg .b64 %rd<2>;
154+ ; CHECK-EMPTY:
155+ ; CHECK-NEXT: // %bb.0:
156+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldu_v2f16_param_0];
157+ ; CHECK-NEXT: ldu.global.u32 %r1, [%rd1];
158+ ; CHECK-NEXT: st.param.b32 [func_retval0], %r1;
159+ ; CHECK-NEXT: ret;
85160 %val = tail call <2 x half > @llvm.nvvm.ldu.global.f.v2f16.p1 (ptr addrspace (1 ) %ptr , i32 4 )
86161 ret <2 x half > %val
87162}
88163
89- ; CHECK-LABEL: test_ldg_i8
90164define i8 @test_ldg_i8 (ptr addrspace (1 ) %ptr ) {
91- ; CHECK: ld.global.nc.u8
165+ ; CHECK-LABEL: test_ldg_i8(
166+ ; CHECK: {
167+ ; CHECK-NEXT: .reg .b16 %rs<2>;
168+ ; CHECK-NEXT: .reg .b32 %r<2>;
169+ ; CHECK-NEXT: .reg .b64 %rd<2>;
170+ ; CHECK-EMPTY:
171+ ; CHECK-NEXT: // %bb.0:
172+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldg_i8_param_0];
173+ ; CHECK-NEXT: ld.global.nc.u8 %rs1, [%rd1];
174+ ; CHECK-NEXT: cvt.u32.u8 %r1, %rs1;
175+ ; CHECK-NEXT: st.param.b32 [func_retval0], %r1;
176+ ; CHECK-NEXT: ret;
92177 %val = tail call i8 @llvm.nvvm.ldg.global.i.i8.p1 (ptr addrspace (1 ) %ptr , i32 4 )
93178 ret i8 %val
94179}
95180
96- ; CHECK-LABEL: test_ldg_i16
97181define i16 @test_ldg_i16 (ptr addrspace (1 ) %ptr ) {
98- ; CHECK: ld.global.nc.u16
182+ ; CHECK-LABEL: test_ldg_i16(
183+ ; CHECK: {
184+ ; CHECK-NEXT: .reg .b16 %rs<2>;
185+ ; CHECK-NEXT: .reg .b32 %r<2>;
186+ ; CHECK-NEXT: .reg .b64 %rd<2>;
187+ ; CHECK-EMPTY:
188+ ; CHECK-NEXT: // %bb.0:
189+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldg_i16_param_0];
190+ ; CHECK-NEXT: ld.global.nc.u16 %rs1, [%rd1];
191+ ; CHECK-NEXT: cvt.u32.u16 %r1, %rs1;
192+ ; CHECK-NEXT: st.param.b32 [func_retval0], %r1;
193+ ; CHECK-NEXT: ret;
99194 %val = tail call i16 @llvm.nvvm.ldg.global.i.i16.p1 (ptr addrspace (1 ) %ptr , i32 2 )
100195 ret i16 %val
101196}
102197
103- ; CHECK-LABEL: test_ldg_i32
104198define i32 @test_ldg_i32 (ptr addrspace (1 ) %ptr ) {
105- ; CHECK: ld.global.nc.u32
199+ ; CHECK-LABEL: test_ldg_i32(
200+ ; CHECK: {
201+ ; CHECK-NEXT: .reg .b32 %r<2>;
202+ ; CHECK-NEXT: .reg .b64 %rd<2>;
203+ ; CHECK-EMPTY:
204+ ; CHECK-NEXT: // %bb.0:
205+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldg_i32_param_0];
206+ ; CHECK-NEXT: ld.global.nc.u32 %r1, [%rd1];
207+ ; CHECK-NEXT: st.param.b32 [func_retval0], %r1;
208+ ; CHECK-NEXT: ret;
106209 %val = tail call i32 @llvm.nvvm.ldg.global.i.i32.p1 (ptr addrspace (1 ) %ptr , i32 4 )
107210 ret i32 %val
108211}
109212
110- ; CHECK-LABEL: test_ldg_i64
111213define i64 @test_ldg_i64 (ptr addrspace (1 ) %ptr ) {
112- ; CHECK: ld.global.nc.u64
214+ ; CHECK-LABEL: test_ldg_i64(
215+ ; CHECK: {
216+ ; CHECK-NEXT: .reg .b64 %rd<3>;
217+ ; CHECK-EMPTY:
218+ ; CHECK-NEXT: // %bb.0:
219+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldg_i64_param_0];
220+ ; CHECK-NEXT: ld.global.nc.u64 %rd2, [%rd1];
221+ ; CHECK-NEXT: st.param.b64 [func_retval0], %rd2;
222+ ; CHECK-NEXT: ret;
113223 %val = tail call i64 @llvm.nvvm.ldg.global.i.i64.p1 (ptr addrspace (1 ) %ptr , i32 8 )
114224 ret i64 %val
115225}
116226
117- ; CHECK-LABEL: test_ldg_p
118227define ptr @test_ldg_p (ptr addrspace (1 ) %ptr ) {
119- ; CHECK: ld.global.nc.u64
228+ ; CHECK-LABEL: test_ldg_p(
229+ ; CHECK: {
230+ ; CHECK-NEXT: .reg .b64 %rd<3>;
231+ ; CHECK-EMPTY:
232+ ; CHECK-NEXT: // %bb.0:
233+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldg_p_param_0];
234+ ; CHECK-NEXT: ld.global.nc.u64 %rd2, [%rd1];
235+ ; CHECK-NEXT: st.param.b64 [func_retval0], %rd2;
236+ ; CHECK-NEXT: ret;
120237 %val = tail call ptr @llvm.nvvm.ldg.global.p.p1 (ptr addrspace (1 ) %ptr , i32 8 )
121238 ret ptr %val
122239}
123240
124- ; CHECK-LABEL: test_ldg_f32
125241define float @test_ldg_f32 (ptr addrspace (1 ) %ptr ) {
126- ; CHECK: ld.global.nc.f32
242+ ; CHECK-LABEL: test_ldg_f32(
243+ ; CHECK: {
244+ ; CHECK-NEXT: .reg .f32 %f<2>;
245+ ; CHECK-NEXT: .reg .b64 %rd<2>;
246+ ; CHECK-EMPTY:
247+ ; CHECK-NEXT: // %bb.0:
248+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldg_f32_param_0];
249+ ; CHECK-NEXT: ld.global.nc.f32 %f1, [%rd1];
250+ ; CHECK-NEXT: st.param.f32 [func_retval0], %f1;
251+ ; CHECK-NEXT: ret;
127252 %val = tail call float @llvm.nvvm.ldg.global.f.f32.p1 (ptr addrspace (1 ) %ptr , i32 4 )
128253 ret float %val
129254}
130255
131- ; CHECK-LABEL: test_ldg_f64
132256define double @test_ldg_f64 (ptr addrspace (1 ) %ptr ) {
133- ; CHECK: ld.global.nc.f64
257+ ; CHECK-LABEL: test_ldg_f64(
258+ ; CHECK: {
259+ ; CHECK-NEXT: .reg .b64 %rd<2>;
260+ ; CHECK-NEXT: .reg .f64 %fd<2>;
261+ ; CHECK-EMPTY:
262+ ; CHECK-NEXT: // %bb.0:
263+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldg_f64_param_0];
264+ ; CHECK-NEXT: ld.global.nc.f64 %fd1, [%rd1];
265+ ; CHECK-NEXT: st.param.f64 [func_retval0], %fd1;
266+ ; CHECK-NEXT: ret;
134267 %val = tail call double @llvm.nvvm.ldg.global.f.f64.p1 (ptr addrspace (1 ) %ptr , i32 8 )
135268 ret double %val
136269}
137270
138- ; CHECK-LABEL: test_ldg_f16
139271define half @test_ldg_f16 (ptr addrspace (1 ) %ptr ) {
140- ; CHECK: ld.global.nc.u16
272+ ; CHECK-LABEL: test_ldg_f16(
273+ ; CHECK: {
274+ ; CHECK-NEXT: .reg .b16 %rs<2>;
275+ ; CHECK-NEXT: .reg .b64 %rd<2>;
276+ ; CHECK-EMPTY:
277+ ; CHECK-NEXT: // %bb.0:
278+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldg_f16_param_0];
279+ ; CHECK-NEXT: ld.global.nc.u16 %rs1, [%rd1];
280+ ; CHECK-NEXT: st.param.b16 [func_retval0], %rs1;
281+ ; CHECK-NEXT: ret;
141282 %val = tail call half @llvm.nvvm.ldg.global.f.f16.p1 (ptr addrspace (1 ) %ptr , i32 2 )
142283 ret half %val
143284}
144285
145- ; CHECK-LABEL: test_ldg_v2f16
146286define <2 x half > @test_ldg_v2f16 (ptr addrspace (1 ) %ptr ) {
147- ; CHECK: ld.global.nc.u32
287+ ; CHECK-LABEL: test_ldg_v2f16(
288+ ; CHECK: {
289+ ; CHECK-NEXT: .reg .b32 %r<2>;
290+ ; CHECK-NEXT: .reg .b64 %rd<2>;
291+ ; CHECK-EMPTY:
292+ ; CHECK-NEXT: // %bb.0:
293+ ; CHECK-NEXT: ld.param.u64 %rd1, [test_ldg_v2f16_param_0];
294+ ; CHECK-NEXT: ld.global.nc.u32 %r1, [%rd1];
295+ ; CHECK-NEXT: st.param.b32 [func_retval0], %r1;
296+ ; CHECK-NEXT: ret;
148297 %val = tail call <2 x half > @llvm.nvvm.ldg.global.f.v2f16.p1 (ptr addrspace (1 ) %ptr , i32 4 )
149298 ret <2 x half > %val
150299}
151300
152301@g = addrspace (1 ) global i32 0
153302
154- ; CHECK-LABEL: test_ldg_asi
155303define i32 @test_ldg_asi () {
156- ; CHECK: ld.global.nc.u32 %r{{.*}}, [g+4]
304+ ; CHECK-LABEL: test_ldg_asi(
305+ ; CHECK: {
306+ ; CHECK-NEXT: .reg .b32 %r<2>;
307+ ; CHECK-EMPTY:
308+ ; CHECK-NEXT: // %bb.0:
309+ ; CHECK-NEXT: ld.global.nc.u32 %r1, [g+4];
310+ ; CHECK-NEXT: st.param.b32 [func_retval0], %r1;
311+ ; CHECK-NEXT: ret;
157312 %val = tail call i32 @llvm.nvvm.ldg.global.i.i32.p1 (ptr addrspace (1 ) getelementptr (i8 , ptr addrspace (1 ) @g , i32 4 ), i32 4 )
158313 ret i32 %val
159314}
160315
161- ; CHECK-LABEL: test_lug_asi
162316define i32 @test_lug_asi () {
163- ; CHECK: ldu.global.u32 %r{{.*}}, [g+4]
317+ ; CHECK-LABEL: test_lug_asi(
318+ ; CHECK: {
319+ ; CHECK-NEXT: .reg .b32 %r<2>;
320+ ; CHECK-EMPTY:
321+ ; CHECK-NEXT: // %bb.0:
322+ ; CHECK-NEXT: ldu.global.u32 %r1, [g+4];
323+ ; CHECK-NEXT: st.param.b32 [func_retval0], %r1;
324+ ; CHECK-NEXT: ret;
164325 %val = tail call i32 @llvm.nvvm.ldu.global.i.i32.p1 (ptr addrspace (1 ) getelementptr (i8 , ptr addrspace (1 ) @g , i32 4 ), i32 4 )
165326 ret i32 %val
166327}
0 commit comments