summaryrefslogtreecommitdiff
path: root/test/CodeGen
diff options
context:
space:
mode:
Diffstat (limited to 'test/CodeGen')
-rw-r--r--test/CodeGen/ARM/2013-04-05-Small-ByVal-Structs-PR15293.ll4
-rw-r--r--test/CodeGen/ARM/2013-05-02-AAPCS-ByVal-Structs-C4-C5-VFP.ll6
-rw-r--r--test/CodeGen/ARM/2014-02-21-byval-reg-split-alignment.ll114
3 files changed, 119 insertions, 5 deletions
diff --git a/test/CodeGen/ARM/2013-04-05-Small-ByVal-Structs-PR15293.ll b/test/CodeGen/ARM/2013-04-05-Small-ByVal-Structs-PR15293.ll
index 127429bc31..c5eba7d477 100644
--- a/test/CodeGen/ARM/2013-04-05-Small-ByVal-Structs-PR15293.ll
+++ b/test/CodeGen/ARM/2013-04-05-Small-ByVal-Structs-PR15293.ll
@@ -4,8 +4,8 @@
;CHECK-LABEL: foo:
;CHECK: sub sp, sp, #8
;CHECK: push {r11, lr}
-;CHECK: str r0, [sp, #8]
-;CHECK: add r0, sp, #8
+;CHECK: str r0, [sp, #12]
+;CHECK: add r0, sp, #12
;CHECK: bl fooUseParam
;CHECK: pop {r11, lr}
;CHECK: add sp, sp, #8
diff --git a/test/CodeGen/ARM/2013-05-02-AAPCS-ByVal-Structs-C4-C5-VFP.ll b/test/CodeGen/ARM/2013-05-02-AAPCS-ByVal-Structs-C4-C5-VFP.ll
index 6db71fed95..e79a3ba741 100644
--- a/test/CodeGen/ARM/2013-05-02-AAPCS-ByVal-Structs-C4-C5-VFP.ll
+++ b/test/CodeGen/ARM/2013-05-02-AAPCS-ByVal-Structs-C4-C5-VFP.ll
@@ -23,9 +23,9 @@ define void @foo(double %vfp0, ; --> D0, NSAA=SP
entry:
;CHECK: sub sp, #8
;CHECK: push.w {r11, lr}
- ;CHECK: add r0, sp, #16
- ;CHECK: str r2, [sp, #20]
- ;CHECK: str r1, [sp, #16]
+ ;CHECK: add r0, sp, #8
+ ;CHECK: str r2, [sp, #12]
+ ;CHECK: str r1, [sp, #8]
;CHECK: bl fooUseStruct
call void @fooUseStruct(%st_t* %p1)
ret void
diff --git a/test/CodeGen/ARM/2014-02-21-byval-reg-split-alignment.ll b/test/CodeGen/ARM/2014-02-21-byval-reg-split-alignment.ll
new file mode 100644
index 0000000000..054a45ced1
--- /dev/null
+++ b/test/CodeGen/ARM/2014-02-21-byval-reg-split-alignment.ll
@@ -0,0 +1,114 @@
+; RUN: llc -mtriple=arm-linux-gnueabihf < %s | FileCheck %s
+
+%struct4bytes = type { i32 }
+%struct8bytes8align = type { i64 }
+%struct12bytes = type { i32, i32, i32 }
+
+declare void @useIntPtr(%struct4bytes*)
+declare void @useLong(i64)
+declare void @usePtr(%struct8bytes8align*)
+
+; a -> r0
+; b -> r1..r3
+; c -> sp+0..sp+7
+define void @foo1(i32 %a, %struct12bytes* byval %b, i64 %c) {
+; CHECK-LABEL: foo1
+; CHECK: sub sp, sp, #16
+; CHECK: push {r11, lr}
+; CHECK: add [[SCRATCH:r[0-9]+]], sp, #12
+; CHECK: stm [[SCRATCH]], {r1, r2, r3}
+; CHECK: ldr r0, [sp, #24]
+; CHECK: ldr r1, [sp, #28]
+; CHECK: bl useLong
+; CHECK: pop {r11, lr}
+; CHECK: add sp, sp, #16
+
+ tail call void @useLong(i64 %c)
+ ret void
+}
+
+; a -> r0
+; b -> r2..r3
+define void @foo2(i32 %a, %struct8bytes8align* byval %b) {
+; CHECK-LABEL: foo2
+; CHECK: sub sp, sp, #8
+; CHECK: push {r11, lr}
+; CHECK: add r0, sp, #8
+; CHECK: str r3, [sp, #12]
+; CHECK: str r2, [sp, #8]
+; CHECK: bl usePtr
+; CHECK: pop {r11, lr}
+; CHECK: add sp, sp, #8
+
+ tail call void @usePtr(%struct8bytes8align* %b)
+ ret void
+}
+
+; a -> r0..r1
+; b -> r2
+define void @foo3(%struct8bytes8align* byval %a, %struct4bytes* byval %b) {
+; CHECK-LABEL: foo3
+; CHECK: sub sp, sp, #16
+; CHECK: push {r11, lr}
+; CHECK: add [[SCRATCH:r[0-9]+]], sp, #8
+; CHECK: stm [[SCRATCH]], {r0, r1, r2}
+; CHECK: add r0, sp, #8
+; CHECK: bl usePtr
+; CHECK: pop {r11, lr}
+; CHECK: add sp, sp, #16
+
+ tail call void @usePtr(%struct8bytes8align* %a)
+ ret void
+}
+
+; a -> r0
+; b -> r2..r3
+define void @foo4(%struct4bytes* byval %a, %struct8bytes8align* byval %b) {
+; CHECK-LABEL: foo4
+; CHECK: sub sp, sp, #16
+; CHECK: push {r11, lr}
+; CHECK: str r0, [sp, #8]
+; CHECK: add r0, sp, #16
+; CHECK: str r3, [sp, #20]
+; CHECK: str r2, [sp, #16]
+; CHECK: bl usePtr
+; CHECK: pop {r11, lr}
+; CHECK: add sp, sp, #16
+; CHECK: mov pc, lr
+
+ tail call void @usePtr(%struct8bytes8align* %b)
+ ret void
+}
+
+; a -> r0..r1
+; b -> r2
+; c -> r3
+define void @foo5(%struct8bytes8align* byval %a, %struct4bytes* byval %b, %struct4bytes* byval %c) {
+; CHECK-LABEL: foo5
+; CHECK: sub sp, sp, #16
+; CHECK: push {r11, lr}
+; CHECK: add [[SCRATCH:r[0-9]+]], sp, #8
+; CHECK: stm [[SCRATCH]], {r0, r1, r2, r3}
+; CHECK: add r0, sp, #8
+; CHECK: bl usePtr
+; CHECK: pop {r11, lr}
+; CHECK: add sp, sp, #16
+; CHECK: mov pc, lr
+
+ tail call void @usePtr(%struct8bytes8align* %a)
+ ret void
+}
+
+; a..c -> r0..r2
+; d -> sp+0..sp+7
+define void @foo6(i32 %a, i32 %b, i32 %c, %struct8bytes8align* byval %d) {
+; CHECK-LABEL: foo6
+; CHECK: push {r11, lr}
+; CHECK: add r0, sp, #8
+; CHECK: bl usePtr
+; CHECK: pop {r11, lr}
+; CHECK: mov pc, lr
+
+ tail call void @usePtr(%struct8bytes8align* %d)
+ ret void
+}