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