1 ; RUN: llc < %s -mtriple=thumb-apple-ios | FileCheck %s --check-prefix=CHECK --check-prefix=IOS 2 ; RUN: llc < %s -mtriple=thumb-none-eabi | FileCheck %s --check-prefix=CHECK --check-prefix=EABI 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 --check-prefix=IOS 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 --check-prefix=EABI 7 8 ; Largest stack for which a single tADDspi/tSUBspi is enough 9 define 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 18 define void @test100() { 19 ; CHECK-LABEL: test100: 20 ; CHECK: sub sp, #508 21 ; CHECK: sub sp, #508 22 ; CHECK: sub sp, #508 23 ; EABI: add sp, #508 24 ; EABI: add sp, #508 25 ; EABI: add sp, #508 26 ; IOS: subs r4, r7, #4 27 ; IOS: mov sp, r4 28 %tmp = alloca [ 1524 x i8 ] , align 4 29 ret void 30 } 31 32 ; Smallest stack for which we use a constant pool 33 define void @test2() { 34 ; CHECK-LABEL: test2: 35 ; CHECK: ldr [[TEMP:r[0-7]]], 36 ; CHECK: add sp, [[TEMP]] 37 ; EABI: ldr [[TEMP:r[0-7]]], 38 ; EABI: add sp, [[TEMP]] 39 ; IOS: subs r4, r7, #4 40 ; IOS: mov sp, r4 41 %tmp = alloca [ 1528 x i8 ] , align 4 42 ret void 43 } 44 45 define i32 @test3() { 46 ; CHECK-LABEL: test3: 47 ; CHECK: ldr [[TEMP:r[0-7]]], 48 ; CHECK: add sp, [[TEMP]] 49 ; CHECK: ldr [[TEMP]], 50 ; CHECK: add [[TEMP]], sp 51 ; EABI: ldr [[TEMP:r[0-7]]], 52 ; EABI: add sp, [[TEMP]] 53 ; IOS: subs r4, r7, #4 54 ; IOS: mov sp, r4 55 %retval = alloca i32, align 4 56 %tmp = alloca i32, align 4 57 %a = alloca [805306369 x i8], align 16 58 store i32 0, i32* %tmp 59 %tmp1 = load i32, i32* %tmp 60 ret i32 %tmp1 61 } 62 63 ; Here, the adds get optimized out because they are dead, but the calculation 64 ; of the address of stack_a is dead but not optimized out. When the address 65 ; calculation gets expanded to two instructions, we need to avoid reading a 66 ; dead register. 67 ; No CHECK lines (just test for crashes), as we hope this will be optimised 68 ; better in future. 69 define i32 @test4() { 70 entry: 71 %stack_a = alloca i8, align 1 72 %stack_b = alloca [256 x i32*], align 4 73 %int = ptrtoint i8* %stack_a to i32 74 %add = add i32 %int, 1 75 br label %block2 76 77 block2: 78 %add2 = add i32 %add, 1 79 ret i32 0 80 } 81