[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / mixed-ptr-sizes-i686.ll
blob8392e3ed43f248a61aa9ce9f3e8c1fd1b46e2305
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s | FileCheck %s --check-prefixes=ALL,CHECK
3 ; RUN: llc -O0 < %s | FileCheck %s --check-prefixes=ALL,CHECK-O0
5 ; Source to regenerate:
6 ; struct Foo {
7 ;   int * __ptr32 p32;
8 ;   int * __ptr64 p64;
9 ;   __attribute__((address_space(9))) int *p_other;
10 ; };
11 ; void use_foo(Foo *f);
12 ; void test_sign_ext(Foo *f, int * __ptr32 __sptr i) {
13 ;   f->p64 = i;
14 ;   use_foo(f);
15 ; }
16 ; void test_zero_ext(Foo *f, int * __ptr32 __uptr i) {
17 ;   f->p64 = i;
18 ;   use_foo(f);
19 ; }
20 ; void test_trunc(Foo *f, int * __ptr64 i) {
21 ;   f->p32 = i;
22 ;   use_foo(f);
23 ; }
24 ; void test_noop1(Foo *f, int * __ptr32 i) {
25 ;   f->p32 = i;
26 ;   use_foo(f);
27 ; }
28 ; void test_noop2(Foo *f, int * __ptr64 i) {
29 ;   f->p64 = i;
30 ;   use_foo(f);
31 ; }
32 ; void test_null_arg(Foo *f) {
33 ;   test_noop2(f, 0);
34 ; }
35 ; void test_unrecognized(Foo *f, __attribute__((address_space(14))) int *i) {
36 ;   f->p64 = (int * __ptr64)i;
37 ;   use_foo(f);
38 ; }
39 ; void test_unrecognized2(Foo *f, int * __ptr64 i) {
40 ;   f->p_other = i;
41 ;   use_foo(f);
42 ; }
44 ; $ clang -cc1 -triple x86_64-windows-msvc -fms-extensions -O2 -S t.cpp
46 target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:32-n8:16:32-a:0:32-S32"
47 target triple = "i686-unknown-windows-msvc"
49 %struct.Foo = type { i32*, i32 addrspace(272)*, i32 addrspace(9)* }
50 declare dso_local void @use_foo(%struct.Foo*)
52 define dso_local void @test_sign_ext(%struct.Foo* %f, i32* %i) {
53 ; CHECK-LABEL: test_sign_ext:
54 ; CHECK:       # %bb.0: # %entry
55 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
56 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
57 ; CHECK-NEXT:    movl %ecx, 8(%eax)
58 ; CHECK-NEXT:    sarl $31, %ecx
59 ; CHECK-NEXT:    movl %ecx, 12(%eax)
60 ; CHECK-NEXT:    jmp _use_foo # TAILCALL
62 ; CHECK-O0-LABEL: test_sign_ext:
63 ; CHECK-O0:       # %bb.0: # %entry
64 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %edx
65 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
66 ; CHECK-O0-NEXT:    movl %edx, %ecx
67 ; CHECK-O0-NEXT:    sarl $31, %ecx
68 ; CHECK-O0-NEXT:    movl %edx, 8(%eax)
69 ; CHECK-O0-NEXT:    movl %ecx, 12(%eax)
70 ; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL
71 entry:
72   %0 = addrspacecast i32* %i to i32 addrspace(272)*
73   %p64 = getelementptr inbounds %struct.Foo, %struct.Foo* %f, i32 0, i32 1
74   store i32 addrspace(272)* %0, i32 addrspace(272)** %p64, align 8
75   tail call void @use_foo(%struct.Foo* %f)
76   ret void
79 define dso_local void @test_zero_ext(%struct.Foo* %f, i32 addrspace(271)* %i) {
80 ; CHECK-LABEL: test_zero_ext:
81 ; CHECK:       # %bb.0: # %entry
82 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
83 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
84 ; CHECK-NEXT:    movl %eax, 8(%ecx)
85 ; CHECK-NEXT:    movl $0, 12(%ecx)
86 ; CHECK-NEXT:    jmp _use_foo # TAILCALL
88 ; CHECK-O0-LABEL: test_zero_ext:
89 ; CHECK-O0:       # %bb.0: # %entry
90 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx
91 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
92 ; CHECK-O0-NEXT:    movl %ecx, 8(%eax)
93 ; CHECK-O0-NEXT:    movl $0, 12(%eax)
94 ; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL
95 entry:
96   %0 = addrspacecast i32 addrspace(271)* %i to i32 addrspace(272)*
97   %p64 = getelementptr inbounds %struct.Foo, %struct.Foo* %f, i32 0, i32 1
98   store i32 addrspace(272)* %0, i32 addrspace(272)** %p64, align 8
99   tail call void @use_foo(%struct.Foo* %f)
100   ret void
103 define dso_local void @test_trunc(%struct.Foo* %f, i32 addrspace(272)* %i) {
104 ; CHECK-LABEL: test_trunc:
105 ; CHECK:       # %bb.0: # %entry
106 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
107 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
108 ; CHECK-NEXT:    movl %eax, (%ecx)
109 ; CHECK-NEXT:    jmp _use_foo # TAILCALL
111 ; CHECK-O0-LABEL: test_trunc:
112 ; CHECK-O0:       # %bb.0: # %entry
113 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
114 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx
115 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
116 ; CHECK-O0-NEXT:    movl %ecx, (%eax)
117 ; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL
118 entry:
119   %0 = addrspacecast i32 addrspace(272)* %i to i32*
120   %p32 = getelementptr inbounds %struct.Foo, %struct.Foo* %f, i32 0, i32 0
121   store i32* %0, i32** %p32, align 8
122   tail call void @use_foo(%struct.Foo* %f)
123   ret void
126 define dso_local void @test_noop1(%struct.Foo* %f, i32* %i) {
127 ; CHECK-LABEL: test_noop1:
128 ; CHECK:       # %bb.0: # %entry
129 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
130 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
131 ; CHECK-NEXT:    movl %eax, (%ecx)
132 ; CHECK-NEXT:    jmp _use_foo # TAILCALL
134 ; CHECK-O0-LABEL: test_noop1:
135 ; CHECK-O0:       # %bb.0: # %entry
136 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx
137 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
138 ; CHECK-O0-NEXT:    movl %ecx, (%eax)
139 ; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL
140 entry:
141   %p32 = getelementptr inbounds %struct.Foo, %struct.Foo* %f, i32 0, i32 0
142   store i32* %i, i32** %p32, align 8
143   tail call void @use_foo(%struct.Foo* %f)
144   ret void
147 define dso_local void @test_noop2(%struct.Foo* %f, i32 addrspace(272)* %i) {
148 ; CHECK-LABEL: test_noop2:
149 ; CHECK:       # %bb.0: # %entry
150 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
151 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
152 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %edx
153 ; CHECK-NEXT:    movl %ecx, 12(%edx)
154 ; CHECK-NEXT:    movl %eax, 8(%edx)
155 ; CHECK-NEXT:    jmp _use_foo # TAILCALL
157 ; CHECK-O0-LABEL: test_noop2:
158 ; CHECK-O0:       # %bb.0: # %entry
159 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx
160 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %edx
161 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
162 ; CHECK-O0-NEXT:    movl %edx, 8(%eax)
163 ; CHECK-O0-NEXT:    movl %ecx, 12(%eax)
164 ; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL
165 entry:
166   %p64 = getelementptr inbounds %struct.Foo, %struct.Foo* %f, i32 0, i32 1
167   store i32 addrspace(272)* %i, i32 addrspace(272)** %p64, align 8
168   tail call void @use_foo(%struct.Foo* %f)
169   ret void
172 ; Test that null can be passed as a 64-bit pointer.
173 define dso_local void @test_null_arg(%struct.Foo* %f) {
174 ; CHECK-LABEL: test_null_arg:
175 ; CHECK:       # %bb.0: # %entry
176 ; CHECK-NEXT:    pushl $0
177 ; CHECK-NEXT:    pushl $0
178 ; CHECK-NEXT:    pushl {{[0-9]+}}(%esp)
179 ; CHECK-NEXT:    calll _test_noop2
180 ; CHECK-NEXT:    addl $12, %esp
181 ; CHECK-NEXT:    retl
183 ; CHECK-O0-LABEL: test_null_arg:
184 ; CHECK-O0:       # %bb.0: # %entry
185 ; CHECK-O0-NEXT:    subl $12, %esp
186 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx
187 ; CHECK-O0-NEXT:    movl %esp, %eax
188 ; CHECK-O0-NEXT:    movl %ecx, (%eax)
189 ; CHECK-O0-NEXT:    movl $0, 8(%eax)
190 ; CHECK-O0-NEXT:    movl $0, 4(%eax)
191 ; CHECK-O0-NEXT:    calll _test_noop2
192 ; CHECK-O0-NEXT:    addl $12, %esp
193 ; CHECK-O0-NEXT:    retl
194 entry:
195   call void @test_noop2(%struct.Foo* %f, i32 addrspace(272)* null)
196   ret void
199 define dso_local void @test_unrecognized(%struct.Foo* %f, i32 addrspace(14)* %i) {
200 ; CHECK-LABEL: test_unrecognized:
201 ; CHECK:       # %bb.0: # %entry
202 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
203 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
204 ; CHECK-NEXT:    movl %ecx, 8(%eax)
205 ; CHECK-NEXT:    sarl $31, %ecx
206 ; CHECK-NEXT:    movl %ecx, 12(%eax)
207 ; CHECK-NEXT:    jmp _use_foo # TAILCALL
209 ; CHECK-O0-LABEL: test_unrecognized:
210 ; CHECK-O0:       # %bb.0: # %entry
211 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %edx
212 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
213 ; CHECK-O0-NEXT:    movl %edx, %ecx
214 ; CHECK-O0-NEXT:    sarl $31, %ecx
215 ; CHECK-O0-NEXT:    movl %edx, 8(%eax)
216 ; CHECK-O0-NEXT:    movl %ecx, 12(%eax)
217 ; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL
218 entry:
219   %0 = addrspacecast i32 addrspace(14)* %i to i32 addrspace(272)*
220   %p64 = getelementptr inbounds %struct.Foo, %struct.Foo* %f, i32 0, i32 1
221   store i32 addrspace(272)* %0, i32 addrspace(272)** %p64, align 8
222   tail call void @use_foo(%struct.Foo* %f)
223   ret void
226 define dso_local void @test_unrecognized2(%struct.Foo* %f, i32 addrspace(272)* %i) {
227 ; CHECK-LABEL: test_unrecognized2:
228 ; CHECK:       # %bb.0: # %entry
229 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
230 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
231 ; CHECK-NEXT:    movl %eax, 16(%ecx)
232 ; CHECK-NEXT:    jmp _use_foo # TAILCALL
234 ; CHECK-O0-LABEL: test_unrecognized2:
235 ; CHECK-O0:       # %bb.0: # %entry
236 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
237 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx
238 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
239 ; CHECK-O0-NEXT:    movl %ecx, 16(%eax)
240 ; CHECK-O0-NEXT:    jmp _use_foo # TAILCALL
241 entry:
242   %0 = addrspacecast i32 addrspace(272)* %i to i32 addrspace(9)*
243   %p_other = getelementptr inbounds %struct.Foo, %struct.Foo* %f, i32 0, i32 2
244   store i32 addrspace(9)* %0, i32 addrspace(9)** %p_other, align 8
245   tail call void @use_foo(%struct.Foo* %f)
246   ret void
249 define i32 @test_load_sptr32(i32 addrspace(270)* %i) {
250 ; ALL-LABEL: test_load_sptr32:
251 ; ALL:       # %bb.0: # %entry
252 ; ALL-NEXT:    movl {{[0-9]+}}(%esp), %eax
253 ; ALL-NEXT:    movl (%eax), %eax
254 ; ALL-NEXT:    retl
255 entry:
256   %0 = load i32, i32 addrspace(270)* %i, align 4
257   ret i32 %0
260 define i32 @test_load_uptr32(i32 addrspace(271)* %i) {
261 ; ALL-LABEL: test_load_uptr32:
262 ; ALL:       # %bb.0: # %entry
263 ; ALL-NEXT:    movl {{[0-9]+}}(%esp), %eax
264 ; ALL-NEXT:    movl (%eax), %eax
265 ; ALL-NEXT:    retl
266 entry:
267   %0 = load i32, i32 addrspace(271)* %i, align 4
268   ret i32 %0
271 define i32 @test_load_ptr64(i32 addrspace(272)* %i) {
272 ; CHECK-LABEL: test_load_ptr64:
273 ; CHECK:       # %bb.0: # %entry
274 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
275 ; CHECK-NEXT:    movl (%eax), %eax
276 ; CHECK-NEXT:    retl
278 ; CHECK-O0-LABEL: test_load_ptr64:
279 ; CHECK-O0:       # %bb.0: # %entry
280 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
281 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
282 ; CHECK-O0-NEXT:    movl (%eax), %eax
283 ; CHECK-O0-NEXT:    retl
284 entry:
285   %0 = load i32, i32 addrspace(272)* %i, align 8
286   ret i32 %0
289 define void @test_store_sptr32(i32 addrspace(270)* %s, i32 %i) {
290 ; CHECK-LABEL: test_store_sptr32:
291 ; CHECK:       # %bb.0: # %entry
292 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
293 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
294 ; CHECK-NEXT:    movl %eax, (%ecx)
295 ; CHECK-NEXT:    retl
297 ; CHECK-O0-LABEL: test_store_sptr32:
298 ; CHECK-O0:       # %bb.0: # %entry
299 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx
300 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
301 ; CHECK-O0-NEXT:    movl %ecx, (%eax)
302 ; CHECK-O0-NEXT:    retl
303 entry:
304   store i32 %i, i32 addrspace(270)* %s, align 4
305   ret void
308 define void @test_store_uptr32(i32 addrspace(271)* %s, i32 %i) {
309 ; CHECK-LABEL: test_store_uptr32:
310 ; CHECK:       # %bb.0: # %entry
311 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
312 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
313 ; CHECK-NEXT:    movl %eax, (%ecx)
314 ; CHECK-NEXT:    retl
316 ; CHECK-O0-LABEL: test_store_uptr32:
317 ; CHECK-O0:       # %bb.0: # %entry
318 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx
319 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
320 ; CHECK-O0-NEXT:    movl %ecx, (%eax)
321 ; CHECK-O0-NEXT:    retl
322 entry:
323   store i32 %i, i32 addrspace(271)* %s, align 4
324   ret void
327 define void @test_store_ptr64(i32 addrspace(272)* %s, i32 %i) {
328 ; CHECK-LABEL: test_store_ptr64:
329 ; CHECK:       # %bb.0: # %entry
330 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %eax
331 ; CHECK-NEXT:    movl {{[0-9]+}}(%esp), %ecx
332 ; CHECK-NEXT:    movl %eax, (%ecx)
333 ; CHECK-NEXT:    retl
335 ; CHECK-O0-LABEL: test_store_ptr64:
336 ; CHECK-O0:       # %bb.0: # %entry
337 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
338 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %eax
339 ; CHECK-O0-NEXT:    movl {{[0-9]+}}(%esp), %ecx
340 ; CHECK-O0-NEXT:    movl %ecx, (%eax)
341 ; CHECK-O0-NEXT:    retl
342 entry:
343   store i32 %i, i32 addrspace(272)* %s, align 8
344   ret void