diff options
author | Stephen Hines <srhines@google.com> | 2014-04-23 16:57:46 -0700 |
---|---|---|
committer | Stephen Hines <srhines@google.com> | 2014-04-24 15:53:16 -0700 |
commit | 36b56886974eae4f9c5ebc96befd3e7bfe5de338 (patch) | |
tree | e6cfb69fbbd937f450eeb83bfb83b9da3b01275a /test/CodeGen/Thumb | |
parent | 69a8640022b04415ae9fac62f8ab090601d8f889 (diff) | |
download | external_llvm-36b56886974eae4f9c5ebc96befd3e7bfe5de338.zip external_llvm-36b56886974eae4f9c5ebc96befd3e7bfe5de338.tar.gz external_llvm-36b56886974eae4f9c5ebc96befd3e7bfe5de338.tar.bz2 |
Update to LLVM 3.5a.
Change-Id: Ifadecab779f128e62e430c2b4f6ddd84953ed617
Diffstat (limited to 'test/CodeGen/Thumb')
-rw-r--r-- | test/CodeGen/Thumb/cortex-m0-unaligned-access.ll | 13 | ||||
-rw-r--r-- | test/CodeGen/Thumb/inlineasm-imm-thumb.ll | 2 | ||||
-rw-r--r-- | test/CodeGen/Thumb/mature-mc-support.ll | 12 | ||||
-rw-r--r-- | test/CodeGen/Thumb/segmented-stacks-dynamic.ll | 63 | ||||
-rw-r--r-- | test/CodeGen/Thumb/segmented-stacks.ll | 247 | ||||
-rw-r--r-- | test/CodeGen/Thumb/sjljehprepare-lower-vector.ll | 23 | ||||
-rw-r--r-- | test/CodeGen/Thumb/triple.ll | 7 | ||||
-rw-r--r-- | test/CodeGen/Thumb/unord.ll | 11 |
8 files changed, 375 insertions, 3 deletions
diff --git a/test/CodeGen/Thumb/cortex-m0-unaligned-access.ll b/test/CodeGen/Thumb/cortex-m0-unaligned-access.ll new file mode 100644 index 0000000..c4403fe --- /dev/null +++ b/test/CodeGen/Thumb/cortex-m0-unaligned-access.ll @@ -0,0 +1,13 @@ +; RUN: llc -mtriple=thumbv6m-apple-unknown-macho < %s | FileCheck --check-prefix=V6M %s +; RUN: llc -mtriple=thumbv7m-apple-unknown-macho < %s | FileCheck --check-prefix=V7M %s + +define i32 @split_load(i32* %p) nounwind { +; V6M-LABEL: split_load +; V6M: ldrh +; V6M: ldrh +; V7M-LABEL: split_load +; V7M-NOT: ldrh +; V7M: bx lr + %val = load i32* %p, align 2 + ret i32 %val +} diff --git a/test/CodeGen/Thumb/inlineasm-imm-thumb.ll b/test/CodeGen/Thumb/inlineasm-imm-thumb.ll index 5c8a52a..d557b9d 100644 --- a/test/CodeGen/Thumb/inlineasm-imm-thumb.ll +++ b/test/CodeGen/Thumb/inlineasm-imm-thumb.ll @@ -1,4 +1,4 @@ -; RUN: llc < %s -march=thumb +; RUN: llc < %s -march=thumb -no-integrated-as ; Test Thumb-mode "I" constraint, for ADD immediate. define i32 @testI(i32 %x) { diff --git a/test/CodeGen/Thumb/mature-mc-support.ll b/test/CodeGen/Thumb/mature-mc-support.ll new file mode 100644 index 0000000..d7f8ae6 --- /dev/null +++ b/test/CodeGen/Thumb/mature-mc-support.ll @@ -0,0 +1,12 @@ +; Test that inline assembly is parsed by the MC layer when MC support is mature +; (even when the output is assembly). + +; RUN: not llc -mtriple=thumb-pc-linux < %s > /dev/null 2> %t1 +; RUN: FileCheck %s < %t1 + +; RUN: not llc -mtriple=thumb-pc-linux -filetype=obj < %s > /dev/null 2> %t2 +; RUN: FileCheck %s < %t2 + +module asm " .this_directive_is_very_unlikely_to_exist" + +; CHECK: LLVM ERROR: Error parsing inline asm diff --git a/test/CodeGen/Thumb/segmented-stacks-dynamic.ll b/test/CodeGen/Thumb/segmented-stacks-dynamic.ll new file mode 100644 index 0000000..067c07b --- /dev/null +++ b/test/CodeGen/Thumb/segmented-stacks-dynamic.ll @@ -0,0 +1,63 @@ +; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-linux +; RUN: llc < %s -mtriple=thumb-linux-androideabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android +; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -segmented-stacks -filetype=obj +; RUN: llc < %s -mtriple=thumb-linux-androideabi -segmented-stacks -filetype=obj + +; Just to prevent the alloca from being optimized away +declare void @dummy_use(i32*, i32) + +define i32 @test_basic(i32 %l) { + %mem = alloca i32, i32 %l + call void @dummy_use (i32* %mem, i32 %l) + %terminate = icmp eq i32 %l, 0 + br i1 %terminate, label %true, label %false + +true: + ret i32 0 + +false: + %newlen = sub i32 %l, 1 + %retvalue = call i32 @test_basic(i32 %newlen) + ret i32 %retvalue + +; Thumb-linux: test_basic: + +; Thumb-linux: push {r4, r5} +; Thumb-linux: mov r5, sp +; Thumb-linux-NEXT: ldr r4, .LCPI0_0 +; Thumb-linux-NEXT: ldr r4, [r4] +; Thumb-linux-NEXT: cmp r4, r5 +; Thumb-linux-NEXT: blo .LBB0_2 + +; Thumb-linux: mov r4, #16 +; Thumb-linux-NEXT: mov r5, #0 +; Thumb-linux-NEXT: push {lr} +; Thumb-linux-NEXT: bl __morestack +; Thumb-linux-NEXT: pop {r4} +; Thumb-linux-NEXT: mov lr, r4 +; Thumb-linux-NEXT: pop {r4, r5} +; Thumb-linux-NEXT: bx lr + +; Thumb-linux: pop {r4, r5} + +; Thumb-android: test_basic: + +; Thumb-android: push {r4, r5} +; Thumb-android: mov r5, sp +; Thumb-android-NEXT: ldr r4, .LCPI0_0 +; Thumb-android-NEXT: ldr r4, [r4] +; Thumb-android-NEXT: cmp r4, r5 +; Thumb-android-NEXT: blo .LBB0_2 + +; Thumb-android: mov r4, #16 +; Thumb-android-NEXT: mov r5, #0 +; Thumb-android-NEXT: push {lr} +; Thumb-android-NEXT: bl __morestack +; Thumb-android-NEXT: pop {r4} +; Thumb-android-NEXT: mov lr, r4 +; Thumb-android-NEXT: pop {r4, r5} +; Thumb-android-NEXT: bx lr + +; Thumb-android: pop {r4, r5} + +} diff --git a/test/CodeGen/Thumb/segmented-stacks.ll b/test/CodeGen/Thumb/segmented-stacks.ll new file mode 100644 index 0000000..5649b00 --- /dev/null +++ b/test/CodeGen/Thumb/segmented-stacks.ll @@ -0,0 +1,247 @@ +; RUN: llc < %s -mtriple=thumb-linux-androideabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-android +; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -segmented-stacks -verify-machineinstrs | FileCheck %s -check-prefix=Thumb-linux +; RUN: llc < %s -mtriple=thumb-linux-androideabi -segmented-stacks -filetype=obj +; RUN: llc < %s -mtriple=thumb-linux-unknown-gnueabi -segmented-stacks -filetype=obj + + +; Just to prevent the alloca from being optimized away +declare void @dummy_use(i32*, i32) + +define void @test_basic() { + %mem = alloca i32, i32 10 + call void @dummy_use (i32* %mem, i32 10) + ret void + +; Thumb-android: test_basic: + +; Thumb-android: push {r4, r5} +; Thumb-android-NEXT: mov r5, sp +; Thumb-android-NEXT: ldr r4, .LCPI0_0 +; Thumb-android-NEXT: ldr r4, [r4] +; Thumb-android-NEXT: cmp r4, r5 +; Thumb-android-NEXT: blo .LBB0_2 + +; Thumb-android: mov r4, #48 +; Thumb-android-NEXT: mov r5, #0 +; Thumb-android-NEXT: push {lr} +; Thumb-android-NEXT: bl __morestack +; Thumb-android-NEXT: pop {r4} +; Thumb-android-NEXT: mov lr, r4 +; Thumb-android-NEXT: pop {r4, r5} +; Thumb-android-NEXT: bx lr + +; Thumb-android: pop {r4, r5} + +; Thumb-linux: test_basic: + +; Thumb-linux: push {r4, r5} +; Thumb-linux-NEXT: mov r5, sp +; Thumb-linux-NEXT: ldr r4, .LCPI0_0 +; Thumb-linux-NEXT: ldr r4, [r4] +; Thumb-linux-NEXT: cmp r4, r5 +; Thumb-linux-NEXT: blo .LBB0_2 + +; Thumb-linux: mov r4, #48 +; Thumb-linux-NEXT: mov r5, #0 +; Thumb-linux-NEXT: push {lr} +; Thumb-linux-NEXT: bl __morestack +; Thumb-linux-NEXT: pop {r4} +; Thumb-linux-NEXT: mov lr, r4 +; Thumb-linux-NEXT: pop {r4, r5} +; Thumb-linux-NEXT: bx lr + +; Thumb-linux: pop {r4, r5} + +} + +define i32 @test_nested(i32 * nest %closure, i32 %other) { + %addend = load i32 * %closure + %result = add i32 %other, %addend + ret i32 %result + +; Thumb-android: test_nested: + +; Thumb-android: push {r4, r5} +; Thumb-android-NEXT: mov r5, sp +; Thumb-android-NEXT: ldr r4, .LCPI1_0 +; Thumb-android-NEXT: ldr r4, [r4] +; Thumb-android-NEXT: cmp r4, r5 +; Thumb-android-NEXT: blo .LBB1_2 + +; Thumb-android: mov r4, #0 +; Thumb-android-NEXT: mov r5, #0 +; Thumb-android-NEXT: push {lr} +; Thumb-android-NEXT: bl __morestack +; Thumb-android-NEXT: pop {r4} +; Thumb-android-NEXT: mov lr, r4 +; Thumb-android-NEXT: pop {r4, r5} +; Thumb-android-NEXT: bx lr + +; Thumb-android: pop {r4, r5} + +; Thumb-linux: test_nested: + +; Thumb-linux: push {r4, r5} +; Thumb-linux-NEXT: mov r5, sp +; Thumb-linux-NEXT: ldr r4, .LCPI1_0 +; Thumb-linux-NEXT: ldr r4, [r4] +; Thumb-linux-NEXT: cmp r4, r5 +; Thumb-linux-NEXT: blo .LBB1_2 + +; Thumb-linux: mov r4, #0 +; Thumb-linux-NEXT: mov r5, #0 +; Thumb-linux-NEXT: push {lr} +; Thumb-linux-NEXT: bl __morestack +; Thumb-linux-NEXT: pop {r4} +; Thumb-linux-NEXT: mov lr, r4 +; Thumb-linux-NEXT: pop {r4, r5} +; Thumb-linux-NEXT: bx lr + +; Thumb-linux: pop {r4, r5} + +} + +define void @test_large() { + %mem = alloca i32, i32 10000 + call void @dummy_use (i32* %mem, i32 0) + ret void + +; Thumb-android: test_large: + +; Thumb-android: push {r4, r5} +; Thumb-android-NEXT: mov r5, sp +; Thumb-android-NEXT: sub r5, #40192 +; Thumb-android-NEXT: ldr r4, .LCPI2_2 +; Thumb-android-NEXT: ldr r4, [r4] +; Thumb-android-NEXT: cmp r4, r5 +; Thumb-android-NEXT: blo .LBB2_2 + +; Thumb-android: mov r4, #40192 +; Thumb-android-NEXT: mov r5, #0 +; Thumb-android-NEXT: push {lr} +; Thumb-android-NEXT: bl __morestack +; Thumb-android-NEXT: pop {r4} +; Thumb-android-NEXT: mov lr, r4 +; Thumb-android-NEXT: pop {r4, r5} +; Thumb-android-NEXT: bx lr + +; Thumb-android: pop {r4, r5} + +; Thumb-linux: test_large: + +; Thumb-linux: push {r4, r5} +; Thumb-linux-NEXT: mov r5, sp +; Thumb-linux-NEXT: sub r5, #40192 +; Thumb-linux-NEXT: ldr r4, .LCPI2_2 +; Thumb-linux-NEXT: ldr r4, [r4] +; Thumb-linux-NEXT: cmp r4, r5 +; Thumb-linux-NEXT: blo .LBB2_2 + +; Thumb-linux: mov r4, #40192 +; Thumb-linux-NEXT: mov r5, #0 +; Thumb-linux-NEXT: push {lr} +; Thumb-linux-NEXT: bl __morestack +; Thumb-linux-NEXT: pop {r4} +; Thumb-linux-NEXT: mov lr, r4 +; Thumb-linux-NEXT: pop {r4, r5} +; Thumb-linux-NEXT: bx lr + +; Thumb-linux: pop {r4, r5} + +} + +define fastcc void @test_fastcc() { + %mem = alloca i32, i32 10 + call void @dummy_use (i32* %mem, i32 10) + ret void + +; Thumb-android: test_fastcc: + +; Thumb-android: push {r4, r5} +; Thumb-android-NEXT: mov r5, sp +; Thumb-android-NEXT: ldr r4, .LCPI3_0 +; Thumb-android-NEXT: ldr r4, [r4] +; Thumb-android-NEXT: cmp r4, r5 +; Thumb-android-NEXT: blo .LBB3_2 + +; Thumb-android: mov r4, #48 +; Thumb-android-NEXT: mov r5, #0 +; Thumb-android-NEXT: push {lr} +; Thumb-android-NEXT: bl __morestack +; Thumb-android-NEXT: pop {r4} +; Thumb-android-NEXT: mov lr, r4 +; Thumb-android-NEXT: pop {r4, r5} +; Thumb-android-NEXT: bx lr + +; Thumb-android: pop {r4, r5} + +; Thumb-linux: test_fastcc: + +; Thumb-linux: push {r4, r5} +; Thumb-linux-NEXT: mov r5, sp +; Thumb-linux-NEXT: ldr r4, .LCPI3_0 +; Thumb-linux-NEXT: ldr r4, [r4] +; Thumb-linux-NEXT: cmp r4, r5 +; Thumb-linux-NEXT: blo .LBB3_2 + +; Thumb-linux: mov r4, #48 +; Thumb-linux-NEXT: mov r5, #0 +; Thumb-linux-NEXT: push {lr} +; Thumb-linux-NEXT: bl __morestack +; Thumb-linux-NEXT: pop {r4} +; Thumb-linux-NEXT: mov lr, r4 +; Thumb-linux-NEXT: pop {r4, r5} +; Thumb-linux-NEXT: bx lr + +; Thumb-linux: pop {r4, r5} + +} + +define fastcc void @test_fastcc_large() { + %mem = alloca i32, i32 10000 + call void @dummy_use (i32* %mem, i32 0) + ret void + +; Thumb-android: test_fastcc_large: + +; Thumb-android: push {r4, r5} +; Thumb-android-NEXT: mov r5, sp +; Thumb-android-NEXT: sub r5, #40192 +; Thumb-android-NEXT: ldr r4, .LCPI4_2 +; Thumb-android-NEXT: ldr r4, [r4] +; Thumb-android-NEXT: cmp r4, r5 +; Thumb-android-NEXT: blo .LBB4_2 + +; Thumb-android: mov r4, #40192 +; Thumb-android-NEXT: mov r5, #0 +; Thumb-android-NEXT: push {lr} +; Thumb-android-NEXT: bl __morestack +; Thumb-android-NEXT: pop {r4} +; Thumb-android-NEXT: mov lr, r4 +; Thumb-android-NEXT: pop {r4, r5} +; Thumb-android-NEXT: bx lr + +; Thumb-android: pop {r4, r5} + +; Thumb-linux: test_fastcc_large: + +; Thumb-linux: push {r4, r5} +; Thumb-linux-NEXT: mov r5, sp +; Thumb-linux-NEXT: sub r5, #40192 +; Thumb-linux-NEXT: ldr r4, .LCPI4_2 +; Thumb-linux-NEXT: ldr r4, [r4] +; Thumb-linux-NEXT: cmp r4, r5 +; Thumb-linux-NEXT: blo .LBB4_2 + +; Thumb-linux: mov r4, #40192 +; Thumb-linux-NEXT: mov r5, #0 +; Thumb-linux-NEXT: push {lr} +; Thumb-linux-NEXT: bl __morestack +; Thumb-linux-NEXT: pop {r4} +; Thumb-linux-NEXT: mov lr, r4 +; Thumb-linux-NEXT: pop {r4, r5} +; Thumb-linux-NEXT: bx lr + +; Thumb-linux: pop {r4, r5} + +} diff --git a/test/CodeGen/Thumb/sjljehprepare-lower-vector.ll b/test/CodeGen/Thumb/sjljehprepare-lower-vector.ll new file mode 100644 index 0000000..ab082c7 --- /dev/null +++ b/test/CodeGen/Thumb/sjljehprepare-lower-vector.ll @@ -0,0 +1,23 @@ +; RUN: llc -mtriple=thumbv7-apple-ios < %s +; SjLjEHPrepare shouldn't crash when lowering vectors. + +target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:32:64-v128:32:128-a0:0:32-n32-S32" +target triple = "thumbv7-apple-ios" + +define i8* @foo(<4 x i32> %c) { +entry: + invoke void @bar () + to label %unreachable unwind label %handler + +unreachable: + unreachable + +handler: + %tmp = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @baz to i8*) + cleanup + resume { i8*, i32 } undef +} + +declare void @bar() +declare i32 @baz(...) + diff --git a/test/CodeGen/Thumb/triple.ll b/test/CodeGen/Thumb/triple.ll new file mode 100644 index 0000000..0a1759f --- /dev/null +++ b/test/CodeGen/Thumb/triple.ll @@ -0,0 +1,7 @@ +; RUN: llc < %s -mtriple=thumb | FileCheck %s + +; CHECK: .code 16 + +define void @f() { + ret void +} diff --git a/test/CodeGen/Thumb/unord.ll b/test/CodeGen/Thumb/unord.ll index 39458ae..3cf9ebf 100644 --- a/test/CodeGen/Thumb/unord.ll +++ b/test/CodeGen/Thumb/unord.ll @@ -1,13 +1,20 @@ -; RUN: llc < %s -march=thumb | grep bne | count 1 -; RUN: llc < %s -march=thumb | grep beq | count 1 +; RUN: llc < %s -mtriple=thumb-apple-darwin | FileCheck %s define i32 @f1(float %X, float %Y) { +; CHECK-LABEL: _f1: +; CHECK: bne +; CHECK: .data_region +; CHECK: .long ___unordsf2 %tmp = fcmp uno float %X, %Y %retval = select i1 %tmp, i32 1, i32 -1 ret i32 %retval } define i32 @f2(float %X, float %Y) { +; CHECK-LABEL: _f2: +; CHECK: beq +; CHECK: .data_region +; CHECK: .long ___unordsf2 %tmp = fcmp ord float %X, %Y %retval = select i1 %tmp, i32 1, i32 -1 ret i32 %retval |