1 ; RUN: llc -mcpu=corei7 -no-stack-coloring=false < %s | FileCheck %s --check-prefix=YESCOLOR
2 ; RUN: llc -mcpu=corei7 -no-stack-coloring=true < %s | FileCheck %s --check-prefix=NOCOLOR
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"
7 ;YESCOLOR: subq $136, %rsp
8 ;NOCOLOR: subq $264, %rsp
11 define i32 @myCall_w2(i32 %in) {
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
32 ;YESCOLOR: subq $272, %rsp
33 ;NOCOLOR: subq $272, %rsp
35 define i32 @myCall2_no_merge(i32 %in, i1 %d) {
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
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)
56 call void @llvm.lifetime.end(i64 -1, i8* %b)
60 ;YESCOLOR: subq $144, %rsp
61 ;NOCOLOR: subq $272, %rsp
63 define i32 @myCall2_w2(i32 %in, i1 %d) {
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
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
86 ;YESCOLOR: subq $208, %rsp
87 ;NOCOLOR: subq $400, %rsp
92 define i32 @myCall_w4(i32 %in) {
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
123 ;YESCOLOR: subq $112, %rsp
124 ;NOCOLOR: subq $400, %rsp
126 define i32 @myCall2_w4(i32 %in) {
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
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
162 ;YESCOLOR: subq $144, %rsp
163 ;NOCOLOR: subq $272, %rsp
166 define i32 @myCall2_noend(i32 %in, i1 %d) {
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
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
189 ;YESCOLOR: subq $144, %rsp
190 ;NOCOLOR: subq $272, %rsp
191 define i32 @myCall2_noend2(i32 %in, i1 %d) {
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
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
215 ;YESCOLOR: subq $144, %rsp
216 ;NOCOLOR: subq $272, %rsp
217 define i32 @myCall2_nostart(i32 %in, i1 %d) {
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
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
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 {
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
265 ;YESCOLOR: subq $272, %rsp
266 ;NOCOLOR: subq $272, %rsp
267 define i32 @func_phi_lifetime(i32 %in, i1 %d) {
269 %a = alloca [17 x i8*], align 8
270 %a2 = alloca [16 x i8*], align 8
271 %b = bitcast [17 x i8*]* %a to i8*
272 %b2 = bitcast [16 x i8*]* %a2 to i8*
273 %t1 = call i32 @foo(i32 %in, i8* %b)
274 %t2 = call i32 @foo(i32 %in, i8* %b)
275 call void @llvm.lifetime.end(i64 -1, i8* %b)
276 br i1 %d, label %bb0, label %bb1
279 %I1 = bitcast [17 x i8*]* %a to i8*
283 %I2 = bitcast [16 x i8*]* %a2 to i8*
287 %split = phi i8* [ %I1, %bb0 ], [ %I2, %bb1 ]
288 call void @llvm.lifetime.start(i64 -1, i8* %split)
289 %t3 = call i32 @foo(i32 %in, i8* %b2)
290 %t4 = call i32 @foo(i32 %in, i8* %b2)
291 %t5 = add i32 %t1, %t2
292 %t6 = add i32 %t3, %t4
293 %t7 = add i32 %t5, %t6
294 call void @llvm.lifetime.end(i64 -1, i8* %split)
301 ;YESCOLOR: multi_region_bb
302 ;NOCOLOR: multi_region_bb
303 define void @multi_region_bb() nounwind ssp {
305 %A.i1 = alloca [100 x i32], align 4
306 %B.i2 = alloca [100 x i32], align 4
307 %A.i = alloca [100 x i32], align 4
308 %B.i = alloca [100 x i32], align 4
309 %0 = bitcast [100 x i32]* %A.i to i8*
310 call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind ; <---- start #1
311 %1 = bitcast [100 x i32]* %B.i to i8*
312 call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
313 call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
314 call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
315 call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
316 %2 = bitcast [100 x i32]* %A.i1 to i8*
317 call void @llvm.lifetime.start(i64 -1, i8* %2) nounwind
318 %3 = bitcast [100 x i32]* %B.i2 to i8*
319 call void @llvm.lifetime.start(i64 -1, i8* %3) nounwind
320 call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind ; <---- start #2
321 call void @bar([100 x i32]* %A.i1, [100 x i32]* %B.i2) nounwind
322 call void @llvm.lifetime.end(i64 -1, i8* %2) nounwind
323 call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
324 call void @llvm.lifetime.end(i64 -1, i8* %3) nounwind
329 ;YESCOLOR: subq $272, %rsp
330 ;NOCOLOR: subq $272, %rsp
332 define i32 @myCall_end_before_begin(i32 %in, i1 %d) {
334 %a = alloca [17 x i8*], align 8
335 %a2 = alloca [16 x i8*], align 8
336 %b = bitcast [17 x i8*]* %a to i8*
337 %b2 = bitcast [16 x i8*]* %a2 to i8*
338 %t1 = call i32 @foo(i32 %in, i8* %b)
339 %t2 = call i32 @foo(i32 %in, i8* %b)
340 call void @llvm.lifetime.end(i64 -1, i8* %b)
341 call void @llvm.lifetime.start(i64 -1, i8* %b)
342 br i1 %d, label %bb2, label %bb3
344 call void @llvm.lifetime.start(i64 -1, i8* %b2)
345 %t3 = call i32 @foo(i32 %in, i8* %b2)
346 %t4 = call i32 @foo(i32 %in, i8* %b2)
347 %t5 = add i32 %t1, %t2
348 %t6 = add i32 %t3, %t4
349 %t7 = add i32 %t5, %t6
355 declare void @bar([100 x i32]* , [100 x i32]*) nounwind
357 declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
359 declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
361 declare i32 @foo(i32, i8*)