xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/2014-02-21-byval-reg-split-alignment.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=arm-linux-gnueabihf < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker%struct4bytes = type { i32 }
4*9880d681SAndroid Build Coastguard Worker%struct8bytes8align = type { i64 }
5*9880d681SAndroid Build Coastguard Worker%struct12bytes = type { i32, i32, i32 }
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdeclare void @useIntPtr(%struct4bytes*)
8*9880d681SAndroid Build Coastguard Workerdeclare void @useLong(i64)
9*9880d681SAndroid Build Coastguard Workerdeclare void @usePtr(%struct8bytes8align*)
10*9880d681SAndroid Build Coastguard Worker
11*9880d681SAndroid Build Coastguard Worker; a -> r0
12*9880d681SAndroid Build Coastguard Worker; b -> r1..r3
13*9880d681SAndroid Build Coastguard Worker; c -> sp+0..sp+7
14*9880d681SAndroid Build Coastguard Workerdefine void @foo1(i32 %a, %struct12bytes* byval %b, i64 %c) {
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo1
16*9880d681SAndroid Build Coastguard Worker; CHECK: sub  sp, sp, #12
17*9880d681SAndroid Build Coastguard Worker; CHECK: push  {r11, lr}
18*9880d681SAndroid Build Coastguard Worker; CHECK: sub sp, sp, #4
19*9880d681SAndroid Build Coastguard Worker; CHECK: add  [[SCRATCH:r[0-9]+]], sp, #12
20*9880d681SAndroid Build Coastguard Worker; CHECK: stm  [[SCRATCH]], {r1, r2, r3}
21*9880d681SAndroid Build Coastguard Worker; CHECK: ldr  r0, [sp, #24]
22*9880d681SAndroid Build Coastguard Worker; CHECK: ldr  r1, [sp, #28]
23*9880d681SAndroid Build Coastguard Worker; CHECK: bl  useLong
24*9880d681SAndroid Build Coastguard Worker; CHECK: pop  {r11, lr}
25*9880d681SAndroid Build Coastguard Worker; CHECK: add  sp, sp, #12
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker  call void @useLong(i64 %c)
28*9880d681SAndroid Build Coastguard Worker  ret void
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker; a -> r0
32*9880d681SAndroid Build Coastguard Worker; b -> r2..r3
33*9880d681SAndroid Build Coastguard Workerdefine void @foo2(i32 %a, %struct8bytes8align* byval %b) {
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo2
35*9880d681SAndroid Build Coastguard Worker; CHECK: sub  sp, sp, #8
36*9880d681SAndroid Build Coastguard Worker; CHECK: push  {r11, lr}
37*9880d681SAndroid Build Coastguard Worker; CHECK: add  r0, sp, #8
38*9880d681SAndroid Build Coastguard Worker; CHECK: str  r3, [sp, #12]
39*9880d681SAndroid Build Coastguard Worker; CHECK: str  r2, [sp, #8]
40*9880d681SAndroid Build Coastguard Worker; CHECK: bl   usePtr
41*9880d681SAndroid Build Coastguard Worker; CHECK: pop  {r11, lr}
42*9880d681SAndroid Build Coastguard Worker; CHECK: add  sp, sp, #8
43*9880d681SAndroid Build Coastguard Worker
44*9880d681SAndroid Build Coastguard Worker  call void @usePtr(%struct8bytes8align* %b)
45*9880d681SAndroid Build Coastguard Worker  ret void
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker; a -> r0..r1
49*9880d681SAndroid Build Coastguard Worker; b -> r2
50*9880d681SAndroid Build Coastguard Workerdefine void @foo3(%struct8bytes8align* byval %a, %struct4bytes* byval %b) {
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo3
52*9880d681SAndroid Build Coastguard Worker; CHECK: sub  sp, sp, #16
53*9880d681SAndroid Build Coastguard Worker; CHECK: push  {r11, lr}
54*9880d681SAndroid Build Coastguard Worker; CHECK: add  [[SCRATCH:r[0-9]+]], sp, #8
55*9880d681SAndroid Build Coastguard Worker; CHECK: stm  [[SCRATCH]], {r0, r1, r2}
56*9880d681SAndroid Build Coastguard Worker; CHECK: add  r0, sp, #8
57*9880d681SAndroid Build Coastguard Worker; CHECK: bl   usePtr
58*9880d681SAndroid Build Coastguard Worker; CHECK: pop  {r11, lr}
59*9880d681SAndroid Build Coastguard Worker; CHECK: add  sp, sp, #16
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker  call void @usePtr(%struct8bytes8align* %a)
62*9880d681SAndroid Build Coastguard Worker  ret void
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Worker; a -> r0
66*9880d681SAndroid Build Coastguard Worker; b -> r2..r3
67*9880d681SAndroid Build Coastguard Workerdefine void @foo4(%struct4bytes* byval %a, %struct8bytes8align* byval %b) {
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo4
69*9880d681SAndroid Build Coastguard Worker; CHECK: sub     sp, sp, #16
70*9880d681SAndroid Build Coastguard Worker; CHECK: push    {r11, lr}
71*9880d681SAndroid Build Coastguard Worker; CHECK: str     r0, [sp, #8]
72*9880d681SAndroid Build Coastguard Worker; CHECK: add     r0, sp, #16
73*9880d681SAndroid Build Coastguard Worker; CHECK: str     r3, [sp, #20]
74*9880d681SAndroid Build Coastguard Worker; CHECK: str     r2, [sp, #16]
75*9880d681SAndroid Build Coastguard Worker; CHECK: bl      usePtr
76*9880d681SAndroid Build Coastguard Worker; CHECK: pop     {r11, lr}
77*9880d681SAndroid Build Coastguard Worker; CHECK: add     sp, sp, #16
78*9880d681SAndroid Build Coastguard Worker; CHECK: mov     pc, lr
79*9880d681SAndroid Build Coastguard Worker
80*9880d681SAndroid Build Coastguard Worker  call void @usePtr(%struct8bytes8align* %b)
81*9880d681SAndroid Build Coastguard Worker  ret void
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; a -> r0..r1
85*9880d681SAndroid Build Coastguard Worker; b -> r2
86*9880d681SAndroid Build Coastguard Worker; c -> r3
87*9880d681SAndroid Build Coastguard Workerdefine void @foo5(%struct8bytes8align* byval %a, %struct4bytes* byval %b, %struct4bytes* byval %c) {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo5
89*9880d681SAndroid Build Coastguard Worker; CHECK: sub     sp, sp, #16
90*9880d681SAndroid Build Coastguard Worker; CHECK: push    {r11, lr}
91*9880d681SAndroid Build Coastguard Worker; CHECK: add     [[SCRATCH:r[0-9]+]], sp, #8
92*9880d681SAndroid Build Coastguard Worker; CHECK: stm     [[SCRATCH]], {r0, r1, r2, r3}
93*9880d681SAndroid Build Coastguard Worker; CHECK: add     r0, sp, #8
94*9880d681SAndroid Build Coastguard Worker; CHECK: bl      usePtr
95*9880d681SAndroid Build Coastguard Worker; CHECK: pop     {r11, lr}
96*9880d681SAndroid Build Coastguard Worker; CHECK: add     sp, sp, #16
97*9880d681SAndroid Build Coastguard Worker; CHECK: mov     pc, lr
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker  call void @usePtr(%struct8bytes8align* %a)
100*9880d681SAndroid Build Coastguard Worker  ret void
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Worker; a..c -> r0..r2
104*9880d681SAndroid Build Coastguard Worker; d -> sp+0..sp+7
105*9880d681SAndroid Build Coastguard Workerdefine void @foo6(i32 %a, i32 %b, i32 %c, %struct8bytes8align* byval %d) {
106*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: foo6
107*9880d681SAndroid Build Coastguard Worker; CHECK: push {r11, lr}
108*9880d681SAndroid Build Coastguard Worker; CHECK: add  r0, sp, #8
109*9880d681SAndroid Build Coastguard Worker; CHECK: bl   usePtr
110*9880d681SAndroid Build Coastguard Worker; CHECK: pop  {r11, lr}
111*9880d681SAndroid Build Coastguard Worker; CHECK: mov  pc, lr
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker  call void @usePtr(%struct8bytes8align* %d)
114*9880d681SAndroid Build Coastguard Worker  ret void
115*9880d681SAndroid Build Coastguard Worker}
116