1; RUN: llc < %s -mtriple=thumb-apple-ios | FileCheck %s --check-prefix=CHECK 2; RUN: llc < %s -mtriple=thumb-none-eabi | FileCheck %s --check-prefix=CHECK 3; RUN: llc < %s -o %t -filetype=obj -mtriple=thumbv6-apple-ios 4; RUN: llvm-objdump --triple=thumbv6-apple-ios -d %t | FileCheck %s --check-prefix=CHECK 5; RUN: llc < %s -o %t -filetype=obj -mtriple=thumbv6-none-eabi 6; RUN: llvm-objdump --triple=thumbv6-none-eabi -d %t | FileCheck %s --check-prefix=CHECK 7 8; Largest stack for which a single tADDspi/tSUBspi is enough 9define void @test1() { 10; CHECK-LABEL: test1{{>?}}: 11; CHECK: sub sp, #508 12; CHECK: add sp, #508 13 %tmp = alloca [ 508 x i8 ] , align 4 14 ret void 15} 16 17; 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 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 31define void @test100_nofpelim() "frame-pointer"="all" { 32; CHECK-LABEL: test100_nofpelim{{>?}}: 33; CHECK: sub sp, #508 34; CHECK: sub sp, #508 35; CHECK: sub sp, #508 36; CHECK: subs r4, r7, #7 37; CHECK: subs r4, #1 38; CHECK: mov sp, r4 39 %tmp = alloca [ 1524 x i8 ] , align 4 40 ret void 41} 42 43; Smallest stack for which we use a constant pool 44define void @test2() { 45; CHECK-LABEL: test2{{>?}}: 46; CHECK: ldr [[TEMP:r[0-7]]], 47; CHECK: add sp, [[TEMP]] 48; CHECK: ldr [[TEMP:r[0-7]]], 49; CHECK: add sp, [[TEMP]] 50 %tmp = alloca [ 1528 x i8 ] , align 4 51 ret void 52} 53 54; Smallest stack for which we use a constant pool 55define void @test2_nofpelim() "frame-pointer"="all" { 56; CHECK-LABEL: test2_nofpelim{{>?}}: 57; CHECK: ldr [[TEMP:r[0-7]]], 58; CHECK: add sp, [[TEMP]] 59; CHECK: subs r4, r7, #7 60; CHECK: subs r4, #1 61; CHECK: mov sp, r4 62 %tmp = alloca [ 1528 x i8 ] , align 4 63 ret void 64} 65 66define i32 @test3() { 67; CHECK-LABEL: test3{{>?}}: 68; CHECK: ldr [[TEMP:r[0-7]]], 69; CHECK: add sp, [[TEMP]] 70; CHECK: ldr [[TEMP2:r[0-7]]], 71; CHECK: add [[TEMP2]], sp 72; CHECK: ldr [[TEMP3:r[0-7]]], 73; CHECK: add sp, [[TEMP3]] 74 %retval = alloca i32, align 4 75 %tmp = alloca i32, align 4 76 %a = alloca [805306369 x i8], align 4 77 store i32 0, i32* %tmp 78 %tmp1 = load i32, i32* %tmp 79 ret i32 %tmp1 80} 81 82define i32 @test3_nofpelim() "frame-pointer"="all" { 83; CHECK-LABEL: test3_nofpelim{{>?}}: 84; CHECK: ldr [[TEMP:r[0-7]]], 85; CHECK: add sp, [[TEMP]] 86; CHECK: ldr [[TEMP2:r[0-7]]], 87; CHECK: add [[TEMP2]], sp 88; CHECK: subs r4, r7, 89; CHECK: mov sp, r4 90 %retval = alloca i32, align 4 91 %tmp = alloca i32, align 4 92 %a = alloca [805306369 x i8], align 8 93 store i32 0, i32* %tmp 94 %tmp1 = load i32, i32* %tmp 95 ret i32 %tmp1 96} 97 98; Here, the adds get optimized out because they are dead, but the calculation 99; of the address of stack_a is dead but not optimized out. When the address 100; calculation gets expanded to two instructions, we need to avoid reading a 101; dead register. 102; No CHECK lines (just test for crashes), as we hope this will be optimised 103; better in future. 104define i32 @test4() { 105entry: 106 %stack_a = alloca i8, align 1 107 %stack_b = alloca [256 x i32*], align 4 108 %int = ptrtoint i8* %stack_a to i32 109 %add = add i32 %int, 1 110 br label %block2 111 112block2: 113 %add2 = add i32 %add, 1 114 ret i32 0 115} 116