brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · 4529204 Raw
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