| Reid Kleckner | bdfc05f | 2016-10-11 21:14:03 +0000 | [diff] [blame] | 1 | ; 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 Stannard | 970b0d5 | 2014-11-17 11:18:10 +0000 | [diff] [blame] | 3 | ; RUN: llc < %s -o %t -filetype=obj -mtriple=thumbv6-apple-ios | 
| Reid Kleckner | bdfc05f | 2016-10-11 21:14:03 +0000 | [diff] [blame] | 4 | ; RUN: llvm-objdump -triple=thumbv6-apple-ios -d %t | FileCheck %s --check-prefix=CHECK --check-prefix=ALIGN4 | 
| Oliver Stannard | 970b0d5 | 2014-11-17 11:18:10 +0000 | [diff] [blame] | 5 | ; RUN: llc < %s -o %t -filetype=obj -mtriple=thumbv6-none-eabi | 
| Reid Kleckner | bdfc05f | 2016-10-11 21:14:03 +0000 | [diff] [blame] | 6 | ; RUN: llvm-objdump -triple=thumbv6-none-eabi -d %t | FileCheck %s --check-prefix=CHECK --check-prefix=ALIGN8 | 
| Evan Cheng | d76d0aa | 2009-06-24 06:36:07 +0000 | [diff] [blame] | 7 |  | 
| Oliver Stannard | 970b0d5 | 2014-11-17 11:18:10 +0000 | [diff] [blame] | 8 | ; Largest stack for which a single tADDspi/tSUBspi is enough | 
| Evan Cheng | d76d0aa | 2009-06-24 06:36:07 +0000 | [diff] [blame] | 9 | define void @test1() { | 
| Stephen Lin | f799e3f | 2013-07-13 20:38:47 +0000 | [diff] [blame] | 10 | ; CHECK-LABEL: test1: | 
| Oliver Stannard | 970b0d5 | 2014-11-17 11:18:10 +0000 | [diff] [blame] | 11 | ; CHECK: sub sp, #508 | 
|  | 12 | ; CHECK: add sp, #508 | 
|  | 13 | %tmp = alloca [ 508 x i8 ] , align 4 | 
| Evan Cheng | d76d0aa | 2009-06-24 06:36:07 +0000 | [diff] [blame] | 14 | ret void | 
|  | 15 | } | 
|  | 16 |  | 
| Oliver Stannard | 970b0d5 | 2014-11-17 11:18:10 +0000 | [diff] [blame] | 17 | ; Largest stack for which three tADDspi/tSUBspis are enough | 
|  | 18 | define void @test100() { | 
|  | 19 | ; CHECK-LABEL: test100: | 
|  | 20 | ; CHECK: sub sp, #508 | 
|  | 21 | ; CHECK: sub sp, #508 | 
|  | 22 | ; CHECK: sub sp, #508 | 
| Oliver Stannard | 9aa6f01 | 2016-08-23 09:19:22 +0000 | [diff] [blame] | 23 | ; 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 | 
|  | 31 | define 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 Kleckner | bdfc05f | 2016-10-11 21:14:03 +0000 | [diff] [blame] | 36 | ; ALIGN4: subs r4, r7, #4 | 
|  | 37 | ; ALIGN8: subs r4, r7, #7 | 
|  | 38 | ; ALIGN8: subs r4, #1 | 
| Oliver Stannard | 9aa6f01 | 2016-08-23 09:19:22 +0000 | [diff] [blame] | 39 | ; CHECK: mov sp, r4 | 
| Oliver Stannard | 970b0d5 | 2014-11-17 11:18:10 +0000 | [diff] [blame] | 40 | %tmp = alloca [ 1524 x i8 ] , align 4 | 
|  | 41 | ret void | 
|  | 42 | } | 
|  | 43 |  | 
|  | 44 | ; Smallest stack for which we use a constant pool | 
| Evan Cheng | d76d0aa | 2009-06-24 06:36:07 +0000 | [diff] [blame] | 45 | define void @test2() { | 
| Stephen Lin | f799e3f | 2013-07-13 20:38:47 +0000 | [diff] [blame] | 46 | ; CHECK-LABEL: test2: | 
| Artyom Skrobov | 0a37b80 | 2015-12-08 19:59:01 +0000 | [diff] [blame] | 47 | ; CHECK: ldr [[TEMP:r[0-7]]], | 
|  | 48 | ; CHECK: add sp, [[TEMP]] | 
| Oliver Stannard | 9aa6f01 | 2016-08-23 09:19:22 +0000 | [diff] [blame] | 49 | ; 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 | 
|  | 56 | define 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 Kleckner | bdfc05f | 2016-10-11 21:14:03 +0000 | [diff] [blame] | 60 | ; ALIGN4: subs r4, r7, #4 | 
|  | 61 | ; ALIGN8: subs r4, r7, #7 | 
|  | 62 | ; ALIGN8: subs r4, #1 | 
| Oliver Stannard | 9aa6f01 | 2016-08-23 09:19:22 +0000 | [diff] [blame] | 63 | ; CHECK: mov sp, r4 | 
| Oliver Stannard | 970b0d5 | 2014-11-17 11:18:10 +0000 | [diff] [blame] | 64 | %tmp = alloca [ 1528 x i8 ] , align 4 | 
| Evan Cheng | d76d0aa | 2009-06-24 06:36:07 +0000 | [diff] [blame] | 65 | ret void | 
|  | 66 | } | 
|  | 67 |  | 
|  | 68 | define i32 @test3() { | 
| Stephen Lin | f799e3f | 2013-07-13 20:38:47 +0000 | [diff] [blame] | 69 | ; CHECK-LABEL: test3: | 
| Artyom Skrobov | 0a37b80 | 2015-12-08 19:59:01 +0000 | [diff] [blame] | 70 | ; CHECK: ldr [[TEMP:r[0-7]]], | 
|  | 71 | ; CHECK: add sp, [[TEMP]] | 
| Matthias Braun | 537d039 | 2017-06-17 02:08:18 +0000 | [diff] [blame] | 72 | ; CHECK: ldr [[TEMP2:r[0-7]]], | 
|  | 73 | ; CHECK: add [[TEMP2]], sp | 
|  | 74 | ; CHECK: ldr [[TEMP3:r[0-7]]], | 
|  | 75 | ; CHECK: add sp, [[TEMP3]] | 
| Oliver Stannard | 9aa6f01 | 2016-08-23 09:19:22 +0000 | [diff] [blame] | 76 | %retval = alloca i32, align 4 | 
|  | 77 | %tmp = alloca i32, align 4 | 
| Momchil Velikov | d6a4ab3 | 2017-10-22 11:56:35 +0000 | [diff] [blame] | 78 | %a = alloca [805306369 x i8], align 4 | 
| Oliver Stannard | 9aa6f01 | 2016-08-23 09:19:22 +0000 | [diff] [blame] | 79 | store i32 0, i32* %tmp | 
|  | 80 | %tmp1 = load i32, i32* %tmp | 
|  | 81 | ret i32 %tmp1 | 
|  | 82 | } | 
|  | 83 |  | 
|  | 84 | define 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 Braun | 537d039 | 2017-06-17 02:08:18 +0000 | [diff] [blame] | 88 | ; CHECK: ldr [[TEMP2:r[0-7]]], | 
|  | 89 | ; CHECK: add [[TEMP2]], sp | 
| Oliver Stannard | 9aa6f01 | 2016-08-23 09:19:22 +0000 | [diff] [blame] | 90 | ; CHECK: subs r4, r7, | 
|  | 91 | ; CHECK: mov sp, r4 | 
| Evan Cheng | 3f251fb | 2010-08-10 19:30:19 +0000 | [diff] [blame] | 92 | %retval = alloca i32, align 4 | 
|  | 93 | %tmp = alloca i32, align 4 | 
| Momchil Velikov | d6a4ab3 | 2017-10-22 11:56:35 +0000 | [diff] [blame] | 94 | %a = alloca [805306369 x i8], align 8 | 
| Evan Cheng | 3f251fb | 2010-08-10 19:30:19 +0000 | [diff] [blame] | 95 | store i32 0, i32* %tmp | 
| David Blaikie | a79ac14 | 2015-02-27 21:17:42 +0000 | [diff] [blame] | 96 | %tmp1 = load i32, i32* %tmp | 
| Evan Cheng | 3f251fb | 2010-08-10 19:30:19 +0000 | [diff] [blame] | 97 | ret i32 %tmp1 | 
| Evan Cheng | d76d0aa | 2009-06-24 06:36:07 +0000 | [diff] [blame] | 98 | } | 
| Oliver Stannard | fce0392 | 2014-10-20 11:00:18 +0000 | [diff] [blame] | 99 |  | 
|  | 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. | 
|  | 106 | define i32 @test4() { | 
|  | 107 | entry: | 
|  | 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 |  | 
|  | 114 | block2: | 
|  | 115 | %add2 = add i32 %add, 1 | 
|  | 116 | ret i32 0 | 
|  | 117 | } |