Fix the test by specifying an exact cpu model.
[oota-llvm.git] / test / CodeGen / X86 / StackColoring.ll
1 ; RUN: llc -mcpu=corei7 < %s                    | FileCheck %s --check-prefix=YESCOLOR
2 ; RUN: llc -mcpu=corei7 -no-stack-coloring < %s | FileCheck %s --check-prefix=NOCOLOR
3
4 target 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-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
5 target triple = "x86_64-apple-macosx10.8.0"
6
7 ;YESCOLOR: subq  $136, %rsp
8 ;NOCOLOR: subq  $264, %rsp
9
10
11 define i32 @myCall_w2(i32 %in) {
12 entry:
13   %a = alloca [17 x i8*], align 8
14   %a2 = alloca [16 x i8*], align 8
15   %b = bitcast [17 x i8*]* %a to i8*
16   %b2 = bitcast [16 x i8*]* %a2 to i8*
17   call void @llvm.lifetime.start(i64 -1, i8* %b)
18   %t1 = call i32 @foo(i32 %in, i8* %b)
19   %t2 = call i32 @foo(i32 %in, i8* %b)
20   call void @llvm.lifetime.end(i64 -1, i8* %b)
21   call void @llvm.lifetime.start(i64 -1, i8* %b2)
22   %t3 = call i32 @foo(i32 %in, i8* %b2)
23   %t4 = call i32 @foo(i32 %in, i8* %b2)
24   call void @llvm.lifetime.end(i64 -1, i8* %b2)
25   %t5 = add i32 %t1, %t2
26   %t6 = add i32 %t3, %t4
27   %t7 = add i32 %t5, %t6
28   ret i32 %t7
29 }
30
31
32 ;YESCOLOR: subq  $272, %rsp
33 ;NOCOLOR: subq  $272, %rsp
34
35 define i32 @myCall2_no_merge(i32 %in, i1 %d) {
36 entry:
37   %a = alloca [17 x i8*], align 8
38   %a2 = alloca [16 x i8*], align 8
39   %b = bitcast [17 x i8*]* %a to i8*
40   %b2 = bitcast [16 x i8*]* %a2 to i8*
41   call void @llvm.lifetime.start(i64 -1, i8* %b)
42   %t1 = call i32 @foo(i32 %in, i8* %b)
43   %t2 = call i32 @foo(i32 %in, i8* %b)
44   br i1 %d, label %bb2, label %bb3
45 bb2:
46   call void @llvm.lifetime.start(i64 -1, i8* %b2)
47   %t3 = call i32 @foo(i32 %in, i8* %b2)
48   %t4 = call i32 @foo(i32 %in, i8* %b2)
49   call void @llvm.lifetime.end(i64 -1, i8* %b2)
50   %t5 = add i32 %t1, %t2
51   %t6 = add i32 %t3, %t4
52   %t7 = add i32 %t5, %t6
53   call void @llvm.lifetime.end(i64 -1, i8* %b)
54   ret i32 %t7
55 bb3:
56   call void @llvm.lifetime.end(i64 -1, i8* %b)
57   ret i32 0
58 }
59
60 ;YESCOLOR: subq  $144, %rsp
61 ;NOCOLOR: subq  $272, %rsp
62
63 define i32 @myCall2_w2(i32 %in, i1 %d) {
64 entry:
65   %a = alloca [17 x i8*], align 8
66   %a2 = alloca [16 x i8*], align 8
67   %b = bitcast [17 x i8*]* %a to i8*
68   %b2 = bitcast [16 x i8*]* %a2 to i8*
69   call void @llvm.lifetime.start(i64 -1, i8* %b)
70   %t1 = call i32 @foo(i32 %in, i8* %b)
71   %t2 = call i32 @foo(i32 %in, i8* %b)
72   call void @llvm.lifetime.end(i64 -1, i8* %b)
73   br i1 %d, label %bb2, label %bb3
74 bb2:
75   call void @llvm.lifetime.start(i64 -1, i8* %b2)
76   %t3 = call i32 @foo(i32 %in, i8* %b2)
77   %t4 = call i32 @foo(i32 %in, i8* %b2)
78   call void @llvm.lifetime.end(i64 -1, i8* %b2)
79   %t5 = add i32 %t1, %t2
80   %t6 = add i32 %t3, %t4
81   %t7 = add i32 %t5, %t6
82   ret i32 %t7
83 bb3:
84   ret i32 0
85 }
86 ;YESCOLOR: subq  $208, %rsp
87 ;NOCOLOR: subq  $400, %rsp
88
89
90
91
92 define i32 @myCall_w4(i32 %in) {
93 entry:
94   %a1 = alloca [14 x i8*], align 8
95   %a2 = alloca [13 x i8*], align 8
96   %a3 = alloca [12 x i8*], align 8
97   %a4 = alloca [11 x i8*], align 8
98   %b1 = bitcast [14 x i8*]* %a1 to i8*
99   %b2 = bitcast [13 x i8*]* %a2 to i8*
100   %b3 = bitcast [12 x i8*]* %a3 to i8*
101   %b4 = bitcast [11 x i8*]* %a4 to i8*
102   call void @llvm.lifetime.start(i64 -1, i8* %b4)
103   call void @llvm.lifetime.start(i64 -1, i8* %b1)
104   %t1 = call i32 @foo(i32 %in, i8* %b1)
105   %t2 = call i32 @foo(i32 %in, i8* %b1)
106   call void @llvm.lifetime.end(i64 -1, i8* %b1)
107   call void @llvm.lifetime.start(i64 -1, i8* %b2)
108   %t9 = call i32 @foo(i32 %in, i8* %b2)
109   %t8 = call i32 @foo(i32 %in, i8* %b2)
110   call void @llvm.lifetime.end(i64 -1, i8* %b2)
111   call void @llvm.lifetime.start(i64 -1, i8* %b3)
112   %t3 = call i32 @foo(i32 %in, i8* %b3)
113   %t4 = call i32 @foo(i32 %in, i8* %b3)
114   call void @llvm.lifetime.end(i64 -1, i8* %b3)
115   %t11 = call i32 @foo(i32 %in, i8* %b4)
116   call void @llvm.lifetime.end(i64 -1, i8* %b4)
117   %t5 = add i32 %t1, %t2
118   %t6 = add i32 %t3, %t4
119   %t7 = add i32 %t5, %t6
120   ret i32 %t7
121 }
122
123 ;YESCOLOR: subq  $112, %rsp
124 ;NOCOLOR: subq  $400, %rsp
125
126 define i32 @myCall2_w4(i32 %in) {
127 entry:
128   %a1 = alloca [14 x i8*], align 8
129   %a2 = alloca [13 x i8*], align 8
130   %a3 = alloca [12 x i8*], align 8
131   %a4 = alloca [11 x i8*], align 8
132   %b1 = bitcast [14 x i8*]* %a1 to i8*
133   %b2 = bitcast [13 x i8*]* %a2 to i8*
134   %b3 = bitcast [12 x i8*]* %a3 to i8*
135   %b4 = bitcast [11 x i8*]* %a4 to i8*
136   call void @llvm.lifetime.start(i64 -1, i8* %b1)
137   %t1 = call i32 @foo(i32 %in, i8* %b1)
138   %t2 = call i32 @foo(i32 %in, i8* %b1)
139   call void @llvm.lifetime.end(i64 -1, i8* %b1)
140   call void @llvm.lifetime.start(i64 -1, i8* %b2)
141   %t9 = call i32 @foo(i32 %in, i8* %b2)
142   %t8 = call i32 @foo(i32 %in, i8* %b2)
143   call void @llvm.lifetime.end(i64 -1, i8* %b2)
144   call void @llvm.lifetime.start(i64 -1, i8* %b3)
145   %t3 = call i32 @foo(i32 %in, i8* %b3)
146   %t4 = call i32 @foo(i32 %in, i8* %b3)
147   call void @llvm.lifetime.end(i64 -1, i8* %b3)
148   br i1 undef, label %bb2, label %bb3
149 bb2:
150   call void @llvm.lifetime.start(i64 -1, i8* %b4)
151   %t11 = call i32 @foo(i32 %in, i8* %b4)
152   call void @llvm.lifetime.end(i64 -1, i8* %b4)
153   %t5 = add i32 %t1, %t2
154   %t6 = add i32 %t3, %t4
155   %t7 = add i32 %t5, %t6
156   ret i32 %t7
157 bb3:
158   ret i32 0
159 }
160
161
162 ;YESCOLOR: subq  $144, %rsp
163 ;NOCOLOR: subq  $272, %rsp
164
165
166 define i32 @myCall2_noend(i32 %in, i1 %d) {
167 entry:
168   %a = alloca [17 x i8*], align 8
169   %a2 = alloca [16 x i8*], align 8
170   %b = bitcast [17 x i8*]* %a to i8*
171   %b2 = bitcast [16 x i8*]* %a2 to i8*
172   call void @llvm.lifetime.start(i64 -1, i8* %b)
173   %t1 = call i32 @foo(i32 %in, i8* %b)
174   %t2 = call i32 @foo(i32 %in, i8* %b)
175   call void @llvm.lifetime.end(i64 -1, i8* %b)
176   br i1 %d, label %bb2, label %bb3
177 bb2:
178   call void @llvm.lifetime.start(i64 -1, i8* %b2)
179   %t3 = call i32 @foo(i32 %in, i8* %b2)
180   %t4 = call i32 @foo(i32 %in, i8* %b2)
181   %t5 = add i32 %t1, %t2
182   %t6 = add i32 %t3, %t4
183   %t7 = add i32 %t5, %t6
184   ret i32 %t7
185 bb3:
186   ret i32 0
187 }
188
189 ;YESCOLOR: subq  $144, %rsp
190 ;NOCOLOR: subq  $272, %rsp
191 define i32 @myCall2_noend2(i32 %in, i1 %d) {
192 entry:
193   %a = alloca [17 x i8*], align 8
194   %a2 = alloca [16 x i8*], align 8
195   %b = bitcast [17 x i8*]* %a to i8*
196   %b2 = bitcast [16 x i8*]* %a2 to i8*
197   call void @llvm.lifetime.start(i64 -1, i8* %b)
198   %t1 = call i32 @foo(i32 %in, i8* %b)
199   %t2 = call i32 @foo(i32 %in, i8* %b)
200   br i1 %d, label %bb2, label %bb3
201 bb2:
202   call void @llvm.lifetime.end(i64 -1, i8* %b)
203   call void @llvm.lifetime.start(i64 -1, i8* %b2)
204   %t3 = call i32 @foo(i32 %in, i8* %b2)
205   %t4 = call i32 @foo(i32 %in, i8* %b2)
206   %t5 = add i32 %t1, %t2
207   %t6 = add i32 %t3, %t4
208   %t7 = add i32 %t5, %t6
209   ret i32 %t7
210 bb3:
211   ret i32 0
212 }
213
214
215 ;YESCOLOR: subq  $144, %rsp
216 ;NOCOLOR: subq  $272, %rsp
217 define i32 @myCall2_nostart(i32 %in, i1 %d) {
218 entry:
219   %a = alloca [17 x i8*], align 8
220   %a2 = alloca [16 x i8*], align 8
221   %b = bitcast [17 x i8*]* %a to i8*
222   %b2 = bitcast [16 x i8*]* %a2 to i8*
223   %t1 = call i32 @foo(i32 %in, i8* %b)
224   %t2 = call i32 @foo(i32 %in, i8* %b)
225   call void @llvm.lifetime.end(i64 -1, i8* %b)
226   br i1 %d, label %bb2, label %bb3
227 bb2:
228   call void @llvm.lifetime.start(i64 -1, i8* %b2)
229   %t3 = call i32 @foo(i32 %in, i8* %b2)
230   %t4 = call i32 @foo(i32 %in, i8* %b2)
231   %t5 = add i32 %t1, %t2
232   %t6 = add i32 %t3, %t4
233   %t7 = add i32 %t5, %t6
234   ret i32 %t7
235 bb3:
236   ret i32 0
237 }
238
239 ; Adopt the test from Transforms/Inline/array_merge.ll'
240 ;YESCOLOR: subq  $816, %rsp
241 ;NOCOLOR: subq  $1616, %rsp
242 define void @array_merge() nounwind ssp {
243 entry:
244   %A.i1 = alloca [100 x i32], align 4
245   %B.i2 = alloca [100 x i32], align 4
246   %A.i = alloca [100 x i32], align 4
247   %B.i = alloca [100 x i32], align 4
248   %0 = bitcast [100 x i32]* %A.i to i8*
249   call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind
250   %1 = bitcast [100 x i32]* %B.i to i8*
251   call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
252   call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
253   call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
254   call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
255   %2 = bitcast [100 x i32]* %A.i1 to i8*
256   call void @llvm.lifetime.start(i64 -1, i8* %2) nounwind
257   %3 = bitcast [100 x i32]* %B.i2 to i8*
258   call void @llvm.lifetime.start(i64 -1, i8* %3) nounwind
259   call void @bar([100 x i32]* %A.i1, [100 x i32]* %B.i2) nounwind
260   call void @llvm.lifetime.end(i64 -1, i8* %2) nounwind
261   call void @llvm.lifetime.end(i64 -1, i8* %3) nounwind
262   ret void
263 }
264
265 declare void @bar([100 x i32]* , [100 x i32]*) nounwind
266
267 declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
268
269 declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
270
271  declare i32 @foo(i32, i8*)
272