122 lines · plain
1; RUN: llc < %s -mtriple=thumb-apple-ios | FileCheck %s --check-prefix=CHECK2; RUN: llc < %s -mtriple=thumb-none-eabi | FileCheck %s --check-prefix=CHECK3; RUN: llc < %s -o %t -filetype=obj -mtriple=thumbv6-apple-ios4; RUN: llvm-objdump --no-print-imm-hex --triple=thumbv6-apple-ios -d %t | FileCheck %s --check-prefix=CHECK5; RUN: llc < %s -o %t -filetype=obj -mtriple=thumbv6-none-eabi6; RUN: llvm-objdump --no-print-imm-hex --triple=thumbv6-none-eabi -d %t | FileCheck %s --check-prefix=CHECK7 8; Largest stack for which a single tADDspi/tSUBspi is enough9define void @test1() {10; CHECK-LABEL: test1{{>?}}:11; CHECK: sub sp, #50812; CHECK: add sp, #50813 %tmp = alloca [ 508 x i8 ] , align 414 ret void15}16 17; Largest stack for which three tADDspi/tSUBspis are enough18define void @test100() {19; CHECK-LABEL: test100{{>?}}:20; CHECK: sub sp, #50821; CHECK: sub sp, #50822; CHECK: sub sp, #50823; CHECK: add sp, #50824; CHECK: add sp, #50825; CHECK: add sp, #50826 %tmp = alloca [ 1524 x i8 ] , align 427 ret void28}29 30; Largest stack for which three tADDspi/tSUBspis are enough31define void @test100_nofpelim() "frame-pointer"="all" {32; CHECK-LABEL: test100_nofpelim{{>?}}:33; CHECK: sub sp, #50834; CHECK: sub sp, #50835; CHECK: sub sp, #50836; CHECK: subs [[SCRATCH:r[0-7]]], r7, #737; CHECK: subs [[SCRATCH]], #138; CHECK: mov sp, [[SCRATCH]]39; CHECK: pop40; CHECK-SAME: [[SCRATCH]]41 %tmp = alloca [ 1524 x i8 ] , align 442 ret void43}44 45; Smallest stack for which we use a constant pool46define void @test2() {47; CHECK-LABEL: test2{{>?}}:48; CHECK: ldr [[TEMP:r[0-7]]],49; CHECK: add sp, [[TEMP]]50; CHECK: ldr [[TEMP:r[0-7]]],51; CHECK: add sp, [[TEMP]]52 %tmp = alloca [ 1528 x i8 ] , align 453 ret void54}55 56; Smallest stack for which we use a constant pool57define void @test2_nofpelim() "frame-pointer"="all" {58; CHECK-LABEL: test2_nofpelim{{>?}}:59; CHECK: ldr [[TEMP:r[0-7]]],60; CHECK: add sp, [[TEMP]]61; CHECK: subs [[SCRATCH:r[0-7]]], r7, #762; CHECK: subs [[SCRATCH]], #163; CHECK: mov sp, [[SCRATCH]]64; CHECK: pop65; CHECK-SAME: [[SCRATCH]]66 %tmp = alloca [ 1528 x i8 ] , align 467 ret void68}69 70define i32 @test3() {71; CHECK-LABEL: test3{{>?}}:72; CHECK: ldr [[TEMP:r[0-7]]],73; CHECK: add sp, [[TEMP]]74; CHECK: ldr [[TEMP2:r[0-7]]],75; CHECK: add [[TEMP2]], sp76; CHECK: ldr [[TEMP3:r[0-7]]],77; CHECK: add sp, [[TEMP3]]78 %retval = alloca i32, align 479 %tmp = alloca i32, align 480 %a = alloca [805306369 x i8], align 481 store i32 0, ptr %tmp82 %tmp1 = load i32, ptr %tmp83 ret i32 %tmp184}85 86define i32 @test3_nofpelim() "frame-pointer"="all" {87; CHECK-LABEL: test3_nofpelim{{>?}}:88; CHECK: ldr [[TEMP:r[0-7]]],89; CHECK: add sp, [[TEMP]]90; CHECK: ldr [[TEMP2:r[0-7]]],91; CHECK: add [[TEMP2]], sp92; CHECK: subs [[SCRATCH:r[0-7]]], r7,93; CHECK: mov sp, [[SCRATCH]]94; CHECK: pop95; CHECK-SAME: [[SCRATCH]]96 %retval = alloca i32, align 497 %tmp = alloca i32, align 498 %a = alloca [805306369 x i8], align 899 store i32 0, ptr %tmp100 %tmp1 = load i32, ptr %tmp101 ret i32 %tmp1102}103 104; Here, the adds get optimized out because they are dead, but the calculation105; of the address of stack_a is dead but not optimized out. When the address106; calculation gets expanded to two instructions, we need to avoid reading a107; dead register.108; No CHECK lines (just test for crashes), as we hope this will be optimised109; better in future.110define i32 @test4() {111entry:112 %stack_a = alloca i8, align 1113 %stack_b = alloca [256 x ptr], align 4114 %int = ptrtoint ptr %stack_a to i32115 %add = add i32 %int, 1116 br label %block2117 118block2:119 %add2 = add i32 %add, 1120 ret i32 0121}122