blob: f35bffba5ca7d934f67a4b88aa6ee24789b68b1d [file] [log] [blame]
Reid Klecknerbdfc05f2016-10-11 21:14:03 +00001; RUN: llc < %s -mtriple=thumb-apple-ios | FileCheck %s --check-prefix=CHECK --check-prefix=ALIGN4
2; RUN: llc < %s -mtriple=thumb-none-eabi | FileCheck %s --check-prefix=CHECK --check-prefix=ALIGN8
Oliver Stannard970b0d52014-11-17 11:18:10 +00003; RUN: llc < %s -o %t -filetype=obj -mtriple=thumbv6-apple-ios
Reid Klecknerbdfc05f2016-10-11 21:14:03 +00004; RUN: llvm-objdump -triple=thumbv6-apple-ios -d %t | FileCheck %s --check-prefix=CHECK --check-prefix=ALIGN4
Oliver Stannard970b0d52014-11-17 11:18:10 +00005; RUN: llc < %s -o %t -filetype=obj -mtriple=thumbv6-none-eabi
Reid Klecknerbdfc05f2016-10-11 21:14:03 +00006; RUN: llvm-objdump -triple=thumbv6-none-eabi -d %t | FileCheck %s --check-prefix=CHECK --check-prefix=ALIGN8
Evan Chengd76d0aa2009-06-24 06:36:07 +00007
Oliver Stannard970b0d52014-11-17 11:18:10 +00008; Largest stack for which a single tADDspi/tSUBspi is enough
Evan Chengd76d0aa2009-06-24 06:36:07 +00009define void @test1() {
Stephen Linf799e3f2013-07-13 20:38:47 +000010; CHECK-LABEL: test1:
Oliver Stannard970b0d52014-11-17 11:18:10 +000011; CHECK: sub sp, #508
12; CHECK: add sp, #508
13 %tmp = alloca [ 508 x i8 ] , align 4
Evan Chengd76d0aa2009-06-24 06:36:07 +000014 ret void
15}
16
Oliver Stannard970b0d52014-11-17 11:18:10 +000017; Largest stack for which three tADDspi/tSUBspis are enough
18define void @test100() {
19; CHECK-LABEL: test100:
20; CHECK: sub sp, #508
21; CHECK: sub sp, #508
22; CHECK: sub sp, #508
Oliver Stannard9aa6f012016-08-23 09:19:22 +000023; CHECK: add sp, #508
24; CHECK: add sp, #508
25; CHECK: add sp, #508
26 %tmp = alloca [ 1524 x i8 ] , align 4
27 ret void
28}
29
30; Largest stack for which three tADDspi/tSUBspis are enough
31define void @test100_nofpelim() "no-frame-pointer-elim"="true" {
32; CHECK-LABEL: test100_nofpelim:
33; CHECK: sub sp, #508
34; CHECK: sub sp, #508
35; CHECK: sub sp, #508
Reid Klecknerbdfc05f2016-10-11 21:14:03 +000036; ALIGN4: subs r4, r7, #4
37; ALIGN8: subs r4, r7, #7
38; ALIGN8: subs r4, #1
Oliver Stannard9aa6f012016-08-23 09:19:22 +000039; CHECK: mov sp, r4
Oliver Stannard970b0d52014-11-17 11:18:10 +000040 %tmp = alloca [ 1524 x i8 ] , align 4
41 ret void
42}
43
44; Smallest stack for which we use a constant pool
Evan Chengd76d0aa2009-06-24 06:36:07 +000045define void @test2() {
Stephen Linf799e3f2013-07-13 20:38:47 +000046; CHECK-LABEL: test2:
Artyom Skrobov0a37b802015-12-08 19:59:01 +000047; CHECK: ldr [[TEMP:r[0-7]]],
48; CHECK: add sp, [[TEMP]]
Oliver Stannard9aa6f012016-08-23 09:19:22 +000049; CHECK: ldr [[TEMP:r[0-7]]],
50; CHECK: add sp, [[TEMP]]
51 %tmp = alloca [ 1528 x i8 ] , align 4
52 ret void
53}
54
55; Smallest stack for which we use a constant pool
56define void @test2_nofpelim() "no-frame-pointer-elim"="true" {
57; CHECK-LABEL: test2_nofpelim:
58; CHECK: ldr [[TEMP:r[0-7]]],
59; CHECK: add sp, [[TEMP]]
Reid Klecknerbdfc05f2016-10-11 21:14:03 +000060; ALIGN4: subs r4, r7, #4
61; ALIGN8: subs r4, r7, #7
62; ALIGN8: subs r4, #1
Oliver Stannard9aa6f012016-08-23 09:19:22 +000063; CHECK: mov sp, r4
Oliver Stannard970b0d52014-11-17 11:18:10 +000064 %tmp = alloca [ 1528 x i8 ] , align 4
Evan Chengd76d0aa2009-06-24 06:36:07 +000065 ret void
66}
67
68define i32 @test3() {
Stephen Linf799e3f2013-07-13 20:38:47 +000069; CHECK-LABEL: test3:
Artyom Skrobov0a37b802015-12-08 19:59:01 +000070; CHECK: ldr [[TEMP:r[0-7]]],
71; CHECK: add sp, [[TEMP]]
Matthias Braun537d0392017-06-17 02:08:18 +000072; CHECK: ldr [[TEMP2:r[0-7]]],
73; CHECK: add [[TEMP2]], sp
74; CHECK: ldr [[TEMP3:r[0-7]]],
75; CHECK: add sp, [[TEMP3]]
Oliver Stannard9aa6f012016-08-23 09:19:22 +000076 %retval = alloca i32, align 4
77 %tmp = alloca i32, align 4
Momchil Velikovd6a4ab32017-10-22 11:56:35 +000078 %a = alloca [805306369 x i8], align 4
Oliver Stannard9aa6f012016-08-23 09:19:22 +000079 store i32 0, i32* %tmp
80 %tmp1 = load i32, i32* %tmp
81 ret i32 %tmp1
82}
83
84define i32 @test3_nofpelim() "no-frame-pointer-elim"="true" {
85; CHECK-LABEL: test3_nofpelim:
86; CHECK: ldr [[TEMP:r[0-7]]],
87; CHECK: add sp, [[TEMP]]
Matthias Braun537d0392017-06-17 02:08:18 +000088; CHECK: ldr [[TEMP2:r[0-7]]],
89; CHECK: add [[TEMP2]], sp
Oliver Stannard9aa6f012016-08-23 09:19:22 +000090; CHECK: subs r4, r7,
91; CHECK: mov sp, r4
Evan Cheng3f251fb2010-08-10 19:30:19 +000092 %retval = alloca i32, align 4
93 %tmp = alloca i32, align 4
Momchil Velikovd6a4ab32017-10-22 11:56:35 +000094 %a = alloca [805306369 x i8], align 8
Evan Cheng3f251fb2010-08-10 19:30:19 +000095 store i32 0, i32* %tmp
David Blaikiea79ac142015-02-27 21:17:42 +000096 %tmp1 = load i32, i32* %tmp
Evan Cheng3f251fb2010-08-10 19:30:19 +000097 ret i32 %tmp1
Evan Chengd76d0aa2009-06-24 06:36:07 +000098}
Oliver Stannardfce03922014-10-20 11:00:18 +000099
100; Here, the adds get optimized out because they are dead, but the calculation
101; of the address of stack_a is dead but not optimized out. When the address
102; calculation gets expanded to two instructions, we need to avoid reading a
103; dead register.
104; No CHECK lines (just test for crashes), as we hope this will be optimised
105; better in future.
106define i32 @test4() {
107entry:
108 %stack_a = alloca i8, align 1
109 %stack_b = alloca [256 x i32*], align 4
110 %int = ptrtoint i8* %stack_a to i32
111 %add = add i32 %int, 1
112 br label %block2
113
114block2:
115 %add2 = add i32 %add, 1
116 ret i32 0
117}