blob: a59fceb5bdd0899e57c1a4ef55cd3623a5a00450 [file] [log] [blame]
Hal Finkela7c54e82013-07-17 00:45:52 +00001; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 < %s | FileCheck %s
2; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr7 -disable-fp-elim < %s | FileCheck -check-prefix=CHECK-FP %s
Hal Finkel3ee2af72014-07-18 23:29:49 +00003; RUN: llc -mtriple=powerpc-unknown-linux-gnu -disable-fp-elim < %s | FileCheck -check-prefix=CHECK-32 %s
4; RUN: llc -mtriple=powerpc-unknown-linux-gnu -disable-fp-elim -relocation-model=pic < %s | FileCheck -check-prefix=CHECK-32-PIC %s
Hal Finkela7c54e82013-07-17 00:45:52 +00005target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-f128:128:128-v128:128:128-n32:64"
6target triple = "powerpc64-unknown-linux-gnu"
7
8%struct.s = type { i32, i32 }
9
10declare void @bar(i32*)
11
Hal Finkel3ee2af72014-07-18 23:29:49 +000012@barbaz = external global i32
13
Hal Finkela7c54e82013-07-17 00:45:52 +000014define void @goo(%struct.s* byval nocapture readonly %a) {
15entry:
16 %x = alloca [2 x i32], align 32
17 %a1 = getelementptr inbounds %struct.s* %a, i64 0, i32 0
Manman Ren1047fe42013-09-30 18:17:35 +000018 %0 = load i32* %a1, align 4
Hal Finkela7c54e82013-07-17 00:45:52 +000019 %arrayidx = getelementptr inbounds [2 x i32]* %x, i64 0, i64 0
Manman Ren1047fe42013-09-30 18:17:35 +000020 store i32 %0, i32* %arrayidx, align 32
Hal Finkela7c54e82013-07-17 00:45:52 +000021 %b = getelementptr inbounds %struct.s* %a, i64 0, i32 1
Manman Ren1047fe42013-09-30 18:17:35 +000022 %1 = load i32* %b, align 4
Hal Finkel3ee2af72014-07-18 23:29:49 +000023 %2 = load i32* @barbaz, align 4
Hal Finkela7c54e82013-07-17 00:45:52 +000024 %arrayidx2 = getelementptr inbounds [2 x i32]* %x, i64 0, i64 1
Hal Finkel3ee2af72014-07-18 23:29:49 +000025 store i32 %2, i32* %arrayidx2, align 4
Hal Finkela7c54e82013-07-17 00:45:52 +000026 call void @bar(i32* %arrayidx)
27 ret void
28}
29
30; CHECK-LABEL: @goo
31
32; CHECK-DAG: mflr 0
33; CHECK-DAG: rldicl [[REG:[0-9]+]], 1, 0, 59
Hal Finkelf05d6c72013-07-17 23:50:51 +000034; CHECK-DAG: std 30, -16(1)
35; CHECK-DAG: mr 30, 1
Hal Finkela7c54e82013-07-17 00:45:52 +000036; CHECK-DAG: std 0, 16(1)
37; CHECK-DAG: subfic 0, [[REG]], -160
38; CHECK: stdux 1, 1, 0
39
Hal Finkelf05d6c72013-07-17 23:50:51 +000040; CHECK: .cfi_offset r30, -16
Hal Finkela7c54e82013-07-17 00:45:52 +000041; CHECK: .cfi_offset lr, 16
42
Hal Finkelf05d6c72013-07-17 23:50:51 +000043; CHECK: std 3, 48(30)
Hal Finkela7c54e82013-07-17 00:45:52 +000044
45; CHECK: ld 1, 0(1)
46; CHECK-DAG: ld 0, 16(1)
Hal Finkelf05d6c72013-07-17 23:50:51 +000047; CHECK-DAG: ld 30, -16(1)
Hal Finkela7c54e82013-07-17 00:45:52 +000048; CHECK-DAG: mtlr 0
49; CHECK: blr
50
51; CHECK-FP-LABEL: @goo
52
53; CHECK-FP-DAG: mflr 0
54; CHECK-FP-DAG: rldicl [[REG:[0-9]+]], 1, 0, 59
55; CHECK-FP-DAG: std 31, -8(1)
56; CHECK-FP-DAG: std 30, -16(1)
57; CHECK-FP-DAG: mr 30, 1
58; CHECK-FP-DAG: std 0, 16(1)
59; CHECK-FP-DAG: subfic 0, [[REG]], -160
60; CHECK-FP: stdux 1, 1, 0
61
62; CHECK-FP: .cfi_offset r31, -8
63; CHECK-FP: .cfi_offset r30, -16
64; CHECK-FP: .cfi_offset lr, 16
65
66; CHECK-FP: mr 31, 1
67
68; CHECK-FP: std 3, 48(30)
69
70; CHECK-FP: ld 1, 0(1)
71; CHECK-FP-DAG: ld 0, 16(1)
72; CHECK-FP-DAG: ld 31, -8(1)
73; CHECK-FP-DAG: ld 30, -16(1)
74; CHECK-FP-DAG: mtlr 0
75; CHECK-FP: blr
76
Hal Finkel3ee2af72014-07-18 23:29:49 +000077; CHECK-32-LABEL: @goo
78; CHECK-32-DAG: mflr 0
79; CHECK-32-DAG: rlwinm [[REG:[0-9]+]], 1, 0, 27, 31
80; CHECK-32-DAG: stw 30, -8(1)
81; CHECK-32-DAG: mr 30, 1
82; CHECK-32-DAG: stw 0, 4(1)
83; CHECK-32-DAG: subfic 0, [[REG]], -64
84; CHECK-32: stwux 1, 1, 0
85
86; CHECK-32-PIC-LABEL: @goo
87; CHECK-32-PIC-DAG: mflr 0
88; CHECK-32-PIC-DAG: rlwinm [[REG:[0-9]+]], 1, 0, 27, 31
89; CHECK-32-PIC-DAG: stw 29, -12(1)
90; CHECK-32-PIC-DAG: mr 29, 1
91; CHECK-32-PIC-DAG: stw 0, 4(1)
92; CHECK-32-PIC-DAG: subfic 0, [[REG]], -64
93; CHECK-32-PIC: stwux 1, 1, 0
94
Hal Finkela7c54e82013-07-17 00:45:52 +000095; The large-frame-size case.
96define void @hoo(%struct.s* byval nocapture readonly %a) {
97entry:
98 %x = alloca [200000 x i32], align 32
99 %a1 = getelementptr inbounds %struct.s* %a, i64 0, i32 0
Manman Ren1047fe42013-09-30 18:17:35 +0000100 %0 = load i32* %a1, align 4
Hal Finkela7c54e82013-07-17 00:45:52 +0000101 %arrayidx = getelementptr inbounds [200000 x i32]* %x, i64 0, i64 0
Manman Ren1047fe42013-09-30 18:17:35 +0000102 store i32 %0, i32* %arrayidx, align 32
Hal Finkela7c54e82013-07-17 00:45:52 +0000103 %b = getelementptr inbounds %struct.s* %a, i64 0, i32 1
Manman Ren1047fe42013-09-30 18:17:35 +0000104 %1 = load i32* %b, align 4
Hal Finkela7c54e82013-07-17 00:45:52 +0000105 %arrayidx2 = getelementptr inbounds [200000 x i32]* %x, i64 0, i64 1
Manman Ren1047fe42013-09-30 18:17:35 +0000106 store i32 %1, i32* %arrayidx2, align 4
Hal Finkela7c54e82013-07-17 00:45:52 +0000107 call void @bar(i32* %arrayidx)
108 ret void
109}
110
111; CHECK-LABEL: @hoo
112
113; CHECK-DAG: lis [[REG1:[0-9]+]], -13
114; CHECK-DAG: rldicl [[REG3:[0-9]+]], 1, 0, 59
115; CHECK-DAG: mflr 0
116; CHECK-DAG: ori [[REG2:[0-9]+]], [[REG1]], 51808
Hal Finkelf05d6c72013-07-17 23:50:51 +0000117; CHECK-DAG: std 30, -16(1)
118; CHECK-DAG: mr 30, 1
Hal Finkela7c54e82013-07-17 00:45:52 +0000119; CHECK-DAG: std 0, 16(1)
120; CHECK-DAG: subfc 0, [[REG3]], [[REG2]]
121; CHECK: stdux 1, 1, 0
122
123; CHECK: blr
124
Hal Finkel3ee2af72014-07-18 23:29:49 +0000125; CHECK-32-LABEL: @hoo
126
127; CHECK-32-DAG: lis [[REG1:[0-9]+]], -13
128; CHECK-32-DAG: rlwinm [[REG3:[0-9]+]], 1, 0, 27, 31
129; CHECK-32-DAG: mflr 0
130; CHECK-32-DAG: ori [[REG2:[0-9]+]], [[REG1]], 51904
131; CHECK-32-DAG: stw 30, -8(1)
132; CHECK-32-DAG: mr 30, 1
133; CHECK-32-DAG: stw 0, 4(1)
134; CHECK-32-DAG: subfc 0, [[REG3]], [[REG2]]
135; CHECK-32: stwux 1, 1, 0
136
137; CHECK-32: blr
138
139; CHECK-32-PIC-LABEL: @hoo
140
141; CHECK-32-PIC-DAG: lis [[REG1:[0-9]+]], -13
142; CHECK-32-PIC-DAG: rlwinm [[REG3:[0-9]+]], 1, 0, 27, 31
143; CHECK-32-PIC-DAG: mflr 0
144; CHECK-32-PIC-DAG: ori [[REG2:[0-9]+]], [[REG1]], 51904
145; CHECK-32-PIC-DAG: stw 29, -12(1)
146; CHECK-32-PIC-DAG: mr 29, 1
147; CHECK-32-PIC-DAG: stw 0, 4(1)
148; CHECK-32-PIC-DAG: subfc 0, [[REG3]], [[REG2]]
149; CHECK-32: stwux 1, 1, 0
150
151; CHECK-32: blr
152
Hal Finkela7c54e82013-07-17 00:45:52 +0000153; Make sure that the FP save area is still allocated correctly relative to
154; where r30 is saved.
155define void @loo(%struct.s* byval nocapture readonly %a) {
156entry:
157 %x = alloca [2 x i32], align 32
158 %a1 = getelementptr inbounds %struct.s* %a, i64 0, i32 0
Manman Ren1047fe42013-09-30 18:17:35 +0000159 %0 = load i32* %a1, align 4
Hal Finkela7c54e82013-07-17 00:45:52 +0000160 %arrayidx = getelementptr inbounds [2 x i32]* %x, i64 0, i64 0
Manman Ren1047fe42013-09-30 18:17:35 +0000161 store i32 %0, i32* %arrayidx, align 32
Hal Finkela7c54e82013-07-17 00:45:52 +0000162 %b = getelementptr inbounds %struct.s* %a, i64 0, i32 1
Manman Ren1047fe42013-09-30 18:17:35 +0000163 %1 = load i32* %b, align 4
Hal Finkela7c54e82013-07-17 00:45:52 +0000164 %arrayidx2 = getelementptr inbounds [2 x i32]* %x, i64 0, i64 1
Manman Ren1047fe42013-09-30 18:17:35 +0000165 store i32 %1, i32* %arrayidx2, align 4
Hal Finkela7c54e82013-07-17 00:45:52 +0000166 call void @bar(i32* %arrayidx)
167 call void asm sideeffect "", "~{f30}"() nounwind
168 ret void
169}
170
171; CHECK-LABEL: @loo
172
173; CHECK-DAG: mflr 0
174; CHECK-DAG: rldicl [[REG:[0-9]+]], 1, 0, 59
Hal Finkelf05d6c72013-07-17 23:50:51 +0000175; CHECK-DAG: std 30, -32(1)
176; CHECK-DAG: mr 30, 1
Hal Finkela7c54e82013-07-17 00:45:52 +0000177; CHECK-DAG: std 0, 16(1)
Hal Finkelf05d6c72013-07-17 23:50:51 +0000178; CHECK-DAG: subfic 0, [[REG]], -192
Hal Finkela7c54e82013-07-17 00:45:52 +0000179; CHECK: stdux 1, 1, 0
180
Hal Finkelf05d6c72013-07-17 23:50:51 +0000181; CHECK: stfd 30, -16(30)
Hal Finkela7c54e82013-07-17 00:45:52 +0000182
183; CHECK: blr
184
185; CHECK-FP-LABEL: @loo
186
187; CHECK-FP-DAG: mflr 0
188; CHECK-FP-DAG: rldicl [[REG:[0-9]+]], 1, 0, 59
189; CHECK-FP-DAG: std 31, -24(1)
190; CHECK-FP-DAG: std 30, -32(1)
191; CHECK-FP-DAG: mr 30, 1
192; CHECK-FP-DAG: std 0, 16(1)
193; CHECK-FP-DAG: subfic 0, [[REG]], -192
194; CHECK-FP: stdux 1, 1, 0
195
196; CHECK-FP: stfd 30, -16(30)
197
198; CHECK-FP: blr