diff options
Diffstat (limited to 'llvm/test/CodeGen/ARM/thumb1-varalloc.ll')
-rw-r--r-- | llvm/test/CodeGen/ARM/thumb1-varalloc.ll | 76 |
1 files changed, 74 insertions, 2 deletions
diff --git a/llvm/test/CodeGen/ARM/thumb1-varalloc.ll b/llvm/test/CodeGen/ARM/thumb1-varalloc.ll index e07e8aab77a..19c5dbeceab 100644 --- a/llvm/test/CodeGen/ARM/thumb1-varalloc.ll +++ b/llvm/test/CodeGen/ARM/thumb1-varalloc.ll @@ -1,13 +1,13 @@ ; RUN: llc < %s -mtriple=thumbv6-apple-darwin | FileCheck %s ; RUN: llc < %s -mtriple=thumbv6-apple-darwin -regalloc=basic | FileCheck %s -; rdar://8819685 @__bar = external hidden global i8* @__baz = external hidden global i8* +; rdar://8819685 define i8* @_foo() { entry: -; CHECK: foo: +; CHECK-LABEL: foo: %size = alloca i32, align 4 %0 = load i8** @__bar, align 4 @@ -40,3 +40,75 @@ bb3: declare noalias i8* @strdup(i8* nocapture) nounwind declare i32 @_called_func(i8*, i32*) nounwind + +; Variable ending up at unaligned offset from sp (i.e. not a multiple of 4) +define void @test_local_var_addr() { +; CHECK-LABEL: test_local_var_addr: + + %addr1 = alloca i8 + %addr2 = alloca i8 + +; CHECK: mov r0, sp +; CHECK: adds r0, r0, #{{[0-9]+}} +; CHECK: blx _take_ptr + call void @take_ptr(i8* %addr1) + +; CHECK: mov r0, sp +; CHECK: adds r0, r0, #{{[0-9]+}} +; CHECK: blx _take_ptr + call void @take_ptr(i8* %addr2) + + ret void +} + +; Simple variable ending up *at* sp. +define void @test_simple_var() { +; CHECK-LABEL: test_simple_var: + + %addr32 = alloca i32 + %addr8 = bitcast i32* %addr32 to i8* + +; CHECK: mov r0, sp +; CHECK-NOT: adds r0 +; CHECK: blx _take_ptr + call void @take_ptr(i8* %addr8) + ret void +} + +; Simple variable ending up at aligned offset from sp. +define void @test_local_var_addr_aligned() { +; CHECK-LABEL: test_local_var_addr_aligned: + + %addr1.32 = alloca i32 + %addr1 = bitcast i32* %addr1.32 to i8* + %addr2.32 = alloca i32 + %addr2 = bitcast i32* %addr2.32 to i8* + +; CHECK: add r0, sp, #{{[0-9]+}} +; CHECK: blx _take_ptr + call void @take_ptr(i8* %addr1) + +; CHECK: mov r0, sp +; CHECK-NOT: add r0 +; CHECK: blx _take_ptr + call void @take_ptr(i8* %addr2) + + ret void +} + +; Simple variable ending up at aligned offset from sp. +define void @test_local_var_big_offset() { +; CHECK-LABEL: test_local_var_big_offset: + %addr1.32 = alloca i32, i32 257 + %addr1 = bitcast i32* %addr1.32 to i8* + %addr2.32 = alloca i32, i32 257 + +; CHECK: add [[RTMP:r[0-9]+]], sp, #1020 +; CHECL: add r0, [[RTMP]], #8 +; CHECK: blx _take_ptr + call void @take_ptr(i8* %addr1) + + ret void +} + +declare void @take_ptr(i8*) |