blob: b08b72baa61ef78f0a5a07bdfbf1e4fdc8c4d320 [file] [log] [blame]
Jim Grosbach06733792013-08-16 23:37:23 +00001; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=ARM
2; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-linux-gnueabi -verify-machineinstrs | FileCheck %s --check-prefix=ARM
Jim Grosbach785bd592013-08-16 23:37:36 +00003; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios -verify-machineinstrs | FileCheck %s --check-prefix=THUMB
Jim Grosbach06733792013-08-16 23:37:23 +00004; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios -arm-long-calls -verify-machineinstrs | FileCheck %s --check-prefix=ARM-LONG
5; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-linux-gnueabi -arm-long-calls -verify-machineinstrs | FileCheck %s --check-prefix=ARM-LONG
Jim Grosbach785bd592013-08-16 23:37:36 +00006; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios -arm-long-calls -verify-machineinstrs | FileCheck %s --check-prefix=THUMB-LONG
Chad Rosier11add262011-11-11 23:31:03 +00007
NAKAMURA Takumi874081c2013-11-18 13:50:19 +00008; XFAIL: vg_leak
9
Derek Schuffed788b62013-05-14 16:26:38 +000010; Note that some of these tests assume that relocations are either
11; movw/movt or constant pool loads. Different platforms will select
12; different approaches.
13
Chad Rosier11add262011-11-11 23:31:03 +000014@message1 = global [60 x i8] c"The LLVM Compiler Infrastructure\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", align 1
15@temp = common global [60 x i8] zeroinitializer, align 1
16
17define void @t1() nounwind ssp {
18; ARM: t1
Derek Schuffed788b62013-05-14 16:26:38 +000019; ARM: {{(movw r0, :lower16:_?message1)|(ldr r0, .LCPI)}}
20; ARM: {{(movt r0, :upper16:_?message1)|(ldr r0, \[r0\])}}
Chad Rosier11add262011-11-11 23:31:03 +000021; ARM: add r0, r0, #5
22; ARM: movw r1, #64
23; ARM: movw r2, #10
JF Bastien8fc760c2013-06-07 20:10:37 +000024; ARM: and r1, r1, #255
Derek Schuffed788b62013-05-14 16:26:38 +000025; ARM: bl {{_?}}memset
Chad Rosier49d6fc02012-06-12 19:25:13 +000026; ARM-LONG: t1
JF Bastienfe532ad2013-06-14 02:49:43 +000027; ARM-LONG: {{(movw r3, :lower16:L_memset\$non_lazy_ptr)|(ldr r3, .LCPI)}}
28; ARM-LONG: {{(movt r3, :upper16:L_memset\$non_lazy_ptr)?}}
Chad Rosier49d6fc02012-06-12 19:25:13 +000029; ARM-LONG: ldr r3, [r3]
30; ARM-LONG: blx r3
Chad Rosier11add262011-11-11 23:31:03 +000031; THUMB: t1
Derek Schuffed788b62013-05-14 16:26:38 +000032; THUMB: {{(movw r0, :lower16:_?message1)|(ldr.n r0, .LCPI)}}
33; THUMB: {{(movt r0, :upper16:_?message1)|(ldr r0, \[r0\])}}
Chad Rosier11add262011-11-11 23:31:03 +000034; THUMB: adds r0, #5
35; THUMB: movs r1, #64
36; THUMB: movt r1, #0
37; THUMB: movs r2, #10
38; THUMB: movt r2, #0
JF Bastien8fc760c2013-06-07 20:10:37 +000039; THUMB: and r1, r1, #255
Derek Schuffed788b62013-05-14 16:26:38 +000040; THUMB: bl {{_?}}memset
Chad Rosier49d6fc02012-06-12 19:25:13 +000041; THUMB-LONG: t1
42; THUMB-LONG: movw r3, :lower16:L_memset$non_lazy_ptr
43; THUMB-LONG: movt r3, :upper16:L_memset$non_lazy_ptr
44; THUMB-LONG: ldr r3, [r3]
45; THUMB-LONG: blx r3
Chad Rosierc9758b12012-12-06 01:34:31 +000046 call void @llvm.memset.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @message1, i32 0, i32 5), i8 64, i32 10, i32 4, i1 false)
Chad Rosier11add262011-11-11 23:31:03 +000047 ret void
48}
49
50declare void @llvm.memset.p0i8.i32(i8* nocapture, i8, i32, i32, i1) nounwind
51
52define void @t2() nounwind ssp {
53; ARM: t2
Derek Schuffed788b62013-05-14 16:26:38 +000054; ARM: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr r0, .LCPI)}}
55; ARM: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosier11add262011-11-11 23:31:03 +000056; ARM: ldr r0, [r0]
57; ARM: add r1, r0, #4
58; ARM: add r0, r0, #16
Chad Rosier909cb4f2011-11-14 22:46:17 +000059; ARM: movw r2, #17
Derek Schuffed788b62013-05-14 16:26:38 +000060; ARM: str r0, [sp[[SLOT:[, #0-9]*]]] @ 4-byte Spill
Chad Rosier11add262011-11-11 23:31:03 +000061; ARM: mov r0, r1
Derek Schuffed788b62013-05-14 16:26:38 +000062; ARM: ldr r1, [sp[[SLOT]]] @ 4-byte Reload
63; ARM: bl {{_?}}memcpy
Chad Rosier49d6fc02012-06-12 19:25:13 +000064; ARM-LONG: t2
JF Bastienfe532ad2013-06-14 02:49:43 +000065; ARM-LONG: {{(movw r3, :lower16:L_memcpy\$non_lazy_ptr)|(ldr r3, .LCPI)}}
66; ARM-LONG: {{(movt r3, :upper16:L_memcpy\$non_lazy_ptr)?}}
Chad Rosier49d6fc02012-06-12 19:25:13 +000067; ARM-LONG: ldr r3, [r3]
68; ARM-LONG: blx r3
Chad Rosier11add262011-11-11 23:31:03 +000069; THUMB: t2
Derek Schuffed788b62013-05-14 16:26:38 +000070; THUMB: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr.n r0, .LCPI)}}
71; THUMB: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosier11add262011-11-11 23:31:03 +000072; THUMB: ldr r0, [r0]
73; THUMB: adds r1, r0, #4
74; THUMB: adds r0, #16
Chad Rosier909cb4f2011-11-14 22:46:17 +000075; THUMB: movs r2, #17
Chad Rosier11add262011-11-11 23:31:03 +000076; THUMB: movt r2, #0
Derek Schuffed788b62013-05-14 16:26:38 +000077; THUMB: str r0, [sp[[SLOT:[, #0-9]*]]] @ 4-byte Spill
Chad Rosier11add262011-11-11 23:31:03 +000078; THUMB: mov r0, r1
Derek Schuffed788b62013-05-14 16:26:38 +000079; THUMB: ldr r1, [sp[[SLOT]]] @ 4-byte Reload
80; THUMB: bl {{_?}}memcpy
Chad Rosier49d6fc02012-06-12 19:25:13 +000081; THUMB-LONG: t2
82; THUMB-LONG: movw r3, :lower16:L_memcpy$non_lazy_ptr
83; THUMB-LONG: movt r3, :upper16:L_memcpy$non_lazy_ptr
84; THUMB-LONG: ldr r3, [r3]
85; THUMB-LONG: blx r3
Chad Rosierc9758b12012-12-06 01:34:31 +000086 call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 17, i32 4, i1 false)
Chad Rosier11add262011-11-11 23:31:03 +000087 ret void
88}
89
90declare void @llvm.memcpy.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
91
92define void @t3() nounwind ssp {
93; ARM: t3
Derek Schuffed788b62013-05-14 16:26:38 +000094; ARM: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr r0, .LCPI)}}
95; ARM: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosier11add262011-11-11 23:31:03 +000096; ARM: ldr r0, [r0]
97; ARM: add r1, r0, #4
98; ARM: add r0, r0, #16
99; ARM: movw r2, #10
100; ARM: mov r0, r1
Derek Schuffed788b62013-05-14 16:26:38 +0000101; ARM: bl {{_?}}memmove
Chad Rosier49d6fc02012-06-12 19:25:13 +0000102; ARM-LONG: t3
JF Bastienfe532ad2013-06-14 02:49:43 +0000103; ARM-LONG: {{(movw r3, :lower16:L_memmove\$non_lazy_ptr)|(ldr r3, .LCPI)}}
104; ARM-LONG: {{(movt r3, :upper16:L_memmove\$non_lazy_ptr)?}}
Chad Rosier49d6fc02012-06-12 19:25:13 +0000105; ARM-LONG: ldr r3, [r3]
106; ARM-LONG: blx r3
Chad Rosier11add262011-11-11 23:31:03 +0000107; THUMB: t3
Derek Schuffed788b62013-05-14 16:26:38 +0000108; THUMB: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr.n r0, .LCPI)}}
109; THUMB: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosier11add262011-11-11 23:31:03 +0000110; THUMB: ldr r0, [r0]
111; THUMB: adds r1, r0, #4
112; THUMB: adds r0, #16
113; THUMB: movs r2, #10
114; THUMB: movt r2, #0
Derek Schuffed788b62013-05-14 16:26:38 +0000115; THUMB: str r0, [sp[[SLOT:[, #0-9]*]]] @ 4-byte Spill
Chad Rosier11add262011-11-11 23:31:03 +0000116; THUMB: mov r0, r1
Derek Schuffed788b62013-05-14 16:26:38 +0000117; THUMB: ldr r1, [sp[[SLOT]]] @ 4-byte Reload
118; THUMB: bl {{_?}}memmove
Chad Rosier49d6fc02012-06-12 19:25:13 +0000119; THUMB-LONG: t3
120; THUMB-LONG: movw r3, :lower16:L_memmove$non_lazy_ptr
121; THUMB-LONG: movt r3, :upper16:L_memmove$non_lazy_ptr
122; THUMB-LONG: ldr r3, [r3]
123; THUMB-LONG: blx r3
Chad Rosier11add262011-11-11 23:31:03 +0000124 call void @llvm.memmove.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 1, i1 false)
125 ret void
126}
127
Chad Rosier909cb4f2011-11-14 22:46:17 +0000128define void @t4() nounwind ssp {
129; ARM: t4
Derek Schuffed788b62013-05-14 16:26:38 +0000130; ARM: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr r0, .LCPI)}}
131; ARM: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosier909cb4f2011-11-14 22:46:17 +0000132; ARM: ldr r0, [r0]
Jakob Stoklund Olesen4964ba02012-01-07 04:07:22 +0000133; ARM: ldr r1, [r0, #16]
134; ARM: str r1, [r0, #4]
135; ARM: ldr r1, [r0, #20]
136; ARM: str r1, [r0, #8]
137; ARM: ldrh r1, [r0, #24]
Chad Rosier909cb4f2011-11-14 22:46:17 +0000138; ARM: strh r1, [r0, #12]
139; ARM: bx lr
Chad Rosierc9758b12012-12-06 01:34:31 +0000140; THUMB: t4
Derek Schuffed788b62013-05-14 16:26:38 +0000141; THUMB: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr.n r0, .LCPI)}}
142; THUMB: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosier909cb4f2011-11-14 22:46:17 +0000143; THUMB: ldr r0, [r0]
Jakob Stoklund Olesen4964ba02012-01-07 04:07:22 +0000144; THUMB: ldr r1, [r0, #16]
145; THUMB: str r1, [r0, #4]
146; THUMB: ldr r1, [r0, #20]
147; THUMB: str r1, [r0, #8]
148; THUMB: ldrh r1, [r0, #24]
Chad Rosier909cb4f2011-11-14 22:46:17 +0000149; THUMB: strh r1, [r0, #12]
150; THUMB: bx lr
Chad Rosierc9758b12012-12-06 01:34:31 +0000151 call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 4, i1 false)
Chad Rosier909cb4f2011-11-14 22:46:17 +0000152 ret void
153}
154
Chad Rosier11add262011-11-11 23:31:03 +0000155declare void @llvm.memmove.p0i8.p0i8.i32(i8* nocapture, i8* nocapture, i32, i32, i1) nounwind
Chad Rosierc9758b12012-12-06 01:34:31 +0000156
157define void @t5() nounwind ssp {
158; ARM: t5
Derek Schuffed788b62013-05-14 16:26:38 +0000159; ARM: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr r0, .LCPI)}}
160; ARM: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosierc9758b12012-12-06 01:34:31 +0000161; ARM: ldr r0, [r0]
162; ARM: ldrh r1, [r0, #16]
163; ARM: strh r1, [r0, #4]
164; ARM: ldrh r1, [r0, #18]
165; ARM: strh r1, [r0, #6]
166; ARM: ldrh r1, [r0, #20]
167; ARM: strh r1, [r0, #8]
168; ARM: ldrh r1, [r0, #22]
169; ARM: strh r1, [r0, #10]
170; ARM: ldrh r1, [r0, #24]
171; ARM: strh r1, [r0, #12]
172; ARM: bx lr
173; THUMB: t5
Derek Schuffed788b62013-05-14 16:26:38 +0000174; THUMB: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr.n r0, .LCPI)}}
175; THUMB: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosierc9758b12012-12-06 01:34:31 +0000176; THUMB: ldr r0, [r0]
177; THUMB: ldrh r1, [r0, #16]
178; THUMB: strh r1, [r0, #4]
179; THUMB: ldrh r1, [r0, #18]
180; THUMB: strh r1, [r0, #6]
181; THUMB: ldrh r1, [r0, #20]
182; THUMB: strh r1, [r0, #8]
183; THUMB: ldrh r1, [r0, #22]
184; THUMB: strh r1, [r0, #10]
185; THUMB: ldrh r1, [r0, #24]
186; THUMB: strh r1, [r0, #12]
187; THUMB: bx lr
188 call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 2, i1 false)
189 ret void
190}
191
192define void @t6() nounwind ssp {
193; ARM: t6
Derek Schuffed788b62013-05-14 16:26:38 +0000194; ARM: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr r0, .LCPI)}}
195; ARM: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosierc9758b12012-12-06 01:34:31 +0000196; ARM: ldr r0, [r0]
197; ARM: ldrb r1, [r0, #16]
198; ARM: strb r1, [r0, #4]
199; ARM: ldrb r1, [r0, #17]
200; ARM: strb r1, [r0, #5]
201; ARM: ldrb r1, [r0, #18]
202; ARM: strb r1, [r0, #6]
203; ARM: ldrb r1, [r0, #19]
204; ARM: strb r1, [r0, #7]
205; ARM: ldrb r1, [r0, #20]
206; ARM: strb r1, [r0, #8]
207; ARM: ldrb r1, [r0, #21]
208; ARM: strb r1, [r0, #9]
209; ARM: ldrb r1, [r0, #22]
210; ARM: strb r1, [r0, #10]
211; ARM: ldrb r1, [r0, #23]
212; ARM: strb r1, [r0, #11]
213; ARM: ldrb r1, [r0, #24]
214; ARM: strb r1, [r0, #12]
215; ARM: ldrb r1, [r0, #25]
216; ARM: strb r1, [r0, #13]
217; ARM: bx lr
218; THUMB: t6
Derek Schuffed788b62013-05-14 16:26:38 +0000219; THUMB: {{(movw r0, :lower16:L_temp\$non_lazy_ptr)|(ldr.n r0, .LCPI)}}
220; THUMB: {{(movt r0, :upper16:L_temp\$non_lazy_ptr)?}}
Chad Rosierc9758b12012-12-06 01:34:31 +0000221; THUMB: ldr r0, [r0]
222; THUMB: ldrb r1, [r0, #16]
223; THUMB: strb r1, [r0, #4]
224; THUMB: ldrb r1, [r0, #17]
225; THUMB: strb r1, [r0, #5]
226; THUMB: ldrb r1, [r0, #18]
227; THUMB: strb r1, [r0, #6]
228; THUMB: ldrb r1, [r0, #19]
229; THUMB: strb r1, [r0, #7]
230; THUMB: ldrb r1, [r0, #20]
231; THUMB: strb r1, [r0, #8]
232; THUMB: ldrb r1, [r0, #21]
233; THUMB: strb r1, [r0, #9]
234; THUMB: ldrb r1, [r0, #22]
235; THUMB: strb r1, [r0, #10]
236; THUMB: ldrb r1, [r0, #23]
237; THUMB: strb r1, [r0, #11]
238; THUMB: ldrb r1, [r0, #24]
239; THUMB: strb r1, [r0, #12]
240; THUMB: ldrb r1, [r0, #25]
241; THUMB: strb r1, [r0, #13]
242; THUMB: bx lr
243 call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 10, i32 1, i1 false)
244 ret void
245}
Chad Rosier848c25d2013-02-18 21:46:28 +0000246
Chad Rosier69c65b02013-02-18 21:59:15 +0000247; rdar://13202135
Chad Rosier848c25d2013-02-18 21:46:28 +0000248define void @t7() nounwind ssp {
249; Just make sure this doesn't assert when we have an odd length and an alignment of 2.
250 call void @llvm.memcpy.p0i8.p0i8.i32(i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 4), i8* getelementptr inbounds ([60 x i8]* @temp, i32 0, i32 16), i32 3, i32 2, i1 false)
251 ret void
252}
Chad Rosier33947b42013-03-07 20:42:17 +0000253
254define i32 @t8(i32 %x) nounwind {
255entry:
256; ARM: t8
257; ARM-NOT: FastISel missed call: %expval = call i32 @llvm.expect.i32(i32 %x, i32 1)
258; THUMB: t8
259; THUMB-NOT: FastISel missed call: %expval = call i32 @llvm.expect.i32(i32 %x, i32 1)
260 %expval = call i32 @llvm.expect.i32(i32 %x, i32 1)
261 ret i32 %expval
262}
263
264declare i32 @llvm.expect.i32(i32, i32) nounwind readnone