diff options
Diffstat (limited to 'test/CodeGen/ARM/fold-stack-adjust.ll')
-rw-r--r-- | test/CodeGen/ARM/fold-stack-adjust.ll | 76 |
1 files changed, 65 insertions, 11 deletions
diff --git a/test/CodeGen/ARM/fold-stack-adjust.ll b/test/CodeGen/ARM/fold-stack-adjust.ll index 67fd129..695a20b 100644 --- a/test/CodeGen/ARM/fold-stack-adjust.ll +++ b/test/CodeGen/ARM/fold-stack-adjust.ll @@ -1,6 +1,7 @@ -; RUN: llc -mtriple=thumbv7-apple-darwin-eabi < %s | FileCheck %s -; RUN: llc -mtriple=thumbv6m-apple-darwin-eabi -disable-fp-elim < %s | FileCheck %s --check-prefix=CHECK-T1 +; RUN: llc -mtriple=thumbv7-apple-none-macho < %s | FileCheck %s +; RUN: llc -mtriple=thumbv6m-apple-none-macho -disable-fp-elim < %s | FileCheck %s --check-prefix=CHECK-T1 ; RUN: llc -mtriple=thumbv7-apple-darwin-ios -disable-fp-elim < %s | FileCheck %s --check-prefix=CHECK-IOS +; RUN: llc -mtriple=thumbv7--linux-gnueabi -disable-fp-elim < %s | FileCheck %s --check-prefix=CHECK-LINUX declare void @bar(i8*) @@ -11,11 +12,11 @@ declare void @bar(i8*) define void @check_simple() minsize { ; CHECK-LABEL: check_simple: -; CHECK: push.w {r7, r8, r9, r10, r11, lr} +; CHECK: push {r3, r4, r5, r6, r7, lr} ; CHECK-NOT: sub sp, sp, ; ... ; CHECK-NOT: add sp, sp, -; CHECK: pop.w {r0, r1, r2, r3, r11, pc} +; CHECK: pop {r0, r1, r2, r3, r7, pc} ; CHECK-T1-LABEL: check_simple: ; CHECK-T1: push {r3, r4, r5, r6, r7, lr} @@ -43,11 +44,11 @@ define void @check_simple() minsize { define void @check_simple_too_big() minsize { ; CHECK-LABEL: check_simple_too_big: -; CHECK: push.w {r11, lr} +; CHECK: push {r7, lr} ; CHECK: sub sp, ; ... ; CHECK: add sp, -; CHECK: pop.w {r11, pc} +; CHECK: pop {r7, pc} %var = alloca i8, i32 64 call void @bar(i8* %var) ret void @@ -92,16 +93,16 @@ define void @check_vfp_fold() minsize { ; folded in except that doing so would clobber the value being returned. define i64 @check_no_return_clobber() minsize { ; CHECK-LABEL: check_no_return_clobber: -; CHECK: push.w {r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, lr} +; CHECK: push {r1, r2, r3, r4, r5, r6, r7, lr} ; CHECK-NOT: sub sp, ; ... -; CHECK: add sp, #40 -; CHECK: pop.w {r11, pc} +; CHECK: add sp, #24 +; CHECK: pop {r7, pc} ; Just to keep iOS FileCheck within previous function: ; CHECK-IOS-LABEL: check_no_return_clobber: - %var = alloca i8, i32 40 + %var = alloca i8, i32 20 call void @bar(i8* %var) ret i64 0 } @@ -161,4 +162,57 @@ end: ; We want the epilogue to be the only thing in a basic block so that we hit ; the correct edge-case (first inst in block is correct one to adjust). ret void -}
\ No newline at end of file +} + +define void @test_varsize(...) minsize { +; CHECK-T1-LABEL: test_varsize: +; CHECK-T1: sub sp, #16 +; CHECK-T1: push {r2, r3, r4, r5, r7, lr} +; ... +; CHECK-T1: pop {r2, r3, r4, r5, r7} +; CHECK-T1: pop {r3} +; CHECK-T1: add sp, #16 +; CHECK-T1: bx r3 + +; CHECK-LABEL: test_varsize: +; CHECK: sub sp, #16 +; CHECK: push {r5, r6, r7, lr} +; ... +; CHECK: pop.w {r2, r3, r7, lr} +; CHECK: add sp, #16 +; CHECK: bx lr + + %var = alloca i8, i32 8 + call void @bar(i8* %var) + ret void +} + +%"MyClass" = type { i8*, i32, i32, float, float, float, [2 x i8], i32, i32* } + +declare float @foo() + +declare void @bar3() + +declare %"MyClass"* @bar2(%"MyClass"* returned, i16*, i32, float, float, i32, i32, i1 zeroext, i1 zeroext, i32) + +define fastcc float @check_vfp_no_return_clobber2(i16* %r, i16* %chars, i32 %length, i1 zeroext %flag) minsize { +entry: +; CHECK-LINUX-LABEL: check_vfp_no_return_clobber2 +; CHECK-LINUX: vpush {d0, d1, d2, d3, d4, d5, d6, d7, d8} +; CHECK-NOT: sub sp, +; ... +; CHECK-LINUX: add sp +; CHECK-LINUX: vpop {d8} + %run = alloca %"MyClass", align 4 + %call = call %"MyClass"* @bar2(%"MyClass"* %run, i16* %chars, i32 %length, float 0.000000e+00, float 0.000000e+00, i32 1, i32 1, i1 zeroext false, i1 zeroext true, i32 3) + %call1 = call float @foo() + %cmp = icmp eq %"MyClass"* %run, null + br i1 %cmp, label %exit, label %if.then + +if.then: ; preds = %entry + call void @bar3() + br label %exit + +exit: ; preds = %if.then, %entry + ret float %call1 +} |