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
3
4target 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"
5target triple = "x86_64-apple-macosx10.8.0"
6
7;YESCOLOR: subq  $144, %rsp
8;NOCOLOR: subq  $272, %rsp
9
10define i32 @myCall_w2(i32 %in) {
11entry:
12  %a = alloca [17 x i8*], align 8
13  %a2 = alloca [16 x i8*], align 8
14  %b = bitcast [17 x i8*]* %a to i8*
15  %b2 = bitcast [16 x i8*]* %a2 to i8*
16  call void @llvm.lifetime.start(i64 -1, i8* %b)
17  %t1 = call i32 @foo(i32 %in, i8* %b)
18  %t2 = call i32 @foo(i32 %in, i8* %b)
19  call void @llvm.lifetime.end(i64 -1, i8* %b)
20  call void @llvm.lifetime.start(i64 -1, i8* %b2)
21  %t3 = call i32 @foo(i32 %in, i8* %b2)
22  %t4 = call i32 @foo(i32 %in, i8* %b2)
23  call void @llvm.lifetime.end(i64 -1, i8* %b2)
24  %t5 = add i32 %t1, %t2
25  %t6 = add i32 %t3, %t4
26  %t7 = add i32 %t5, %t6
27  ret i32 %t7
28}
29
30
31;YESCOLOR: subq  $272, %rsp
32;NOCOLOR: subq  $272, %rsp
33
34define i32 @myCall2_no_merge(i32 %in, i1 %d) {
35entry:
36  %a = alloca [17 x i8*], align 8
37  %a2 = alloca [16 x i8*], align 8
38  %b = bitcast [17 x i8*]* %a to i8*
39  %b2 = bitcast [16 x i8*]* %a2 to i8*
40  call void @llvm.lifetime.start(i64 -1, i8* %b)
41  %t1 = call i32 @foo(i32 %in, i8* %b)
42  %t2 = call i32 @foo(i32 %in, i8* %b)
43  br i1 %d, label %bb2, label %bb3
44bb2:
45  call void @llvm.lifetime.start(i64 -1, i8* %b2)
46  %t3 = call i32 @foo(i32 %in, i8* %b2)
47  %t4 = call i32 @foo(i32 %in, i8* %b2)
48  call void @llvm.lifetime.end(i64 -1, i8* %b2)
49  %t5 = add i32 %t1, %t2
50  %t6 = add i32 %t3, %t4
51  %t7 = add i32 %t5, %t6
52  call void @llvm.lifetime.end(i64 -1, i8* %b)
53  ret i32 %t7
54bb3:
55  call void @llvm.lifetime.end(i64 -1, i8* %b)
56  ret i32 0
57}
58
59;YESCOLOR: subq  $144, %rsp
60;NOCOLOR: subq  $272, %rsp
61
62define i32 @myCall2_w2(i32 %in, i1 %d) {
63entry:
64  %a = alloca [17 x i8*], align 8
65  %a2 = alloca [16 x i8*], align 8
66  %b = bitcast [17 x i8*]* %a to i8*
67  %b2 = bitcast [16 x i8*]* %a2 to i8*
68  call void @llvm.lifetime.start(i64 -1, i8* %b)
69  %t1 = call i32 @foo(i32 %in, i8* %b)
70  %t2 = call i32 @foo(i32 %in, i8* %b)
71  call void @llvm.lifetime.end(i64 -1, i8* %b)
72  br i1 %d, label %bb2, label %bb3
73bb2:
74  call void @llvm.lifetime.start(i64 -1, i8* %b2)
75  %t3 = call i32 @foo(i32 %in, i8* %b2)
76  %t4 = call i32 @foo(i32 %in, i8* %b2)
77  call void @llvm.lifetime.end(i64 -1, i8* %b2)
78  %t5 = add i32 %t1, %t2
79  %t6 = add i32 %t3, %t4
80  %t7 = add i32 %t5, %t6
81  ret i32 %t7
82bb3:
83  ret i32 0
84}
85;YESCOLOR: subq  $200, %rsp
86;NOCOLOR: subq  $408, %rsp
87
88
89
90
91define i32 @myCall_w4(i32 %in) {
92entry:
93  %a1 = alloca [14 x i8*], align 8
94  %a2 = alloca [13 x i8*], align 8
95  %a3 = alloca [12 x i8*], align 8
96  %a4 = alloca [11 x i8*], align 8
97  %b1 = bitcast [14 x i8*]* %a1 to i8*
98  %b2 = bitcast [13 x i8*]* %a2 to i8*
99  %b3 = bitcast [12 x i8*]* %a3 to i8*
100  %b4 = bitcast [11 x i8*]* %a4 to i8*
101  call void @llvm.lifetime.start(i64 -1, i8* %b4)
102  call void @llvm.lifetime.start(i64 -1, i8* %b1)
103  %t1 = call i32 @foo(i32 %in, i8* %b1)
104  %t2 = call i32 @foo(i32 %in, i8* %b1)
105  call void @llvm.lifetime.end(i64 -1, i8* %b1)
106  call void @llvm.lifetime.start(i64 -1, i8* %b2)
107  %t9 = call i32 @foo(i32 %in, i8* %b2)
108  %t8 = call i32 @foo(i32 %in, i8* %b2)
109  call void @llvm.lifetime.end(i64 -1, i8* %b2)
110  call void @llvm.lifetime.start(i64 -1, i8* %b3)
111  %t3 = call i32 @foo(i32 %in, i8* %b3)
112  %t4 = call i32 @foo(i32 %in, i8* %b3)
113  call void @llvm.lifetime.end(i64 -1, i8* %b3)
114  %t11 = call i32 @foo(i32 %in, i8* %b4)
115  call void @llvm.lifetime.end(i64 -1, i8* %b4)
116  %t5 = add i32 %t1, %t2
117  %t6 = add i32 %t3, %t4
118  %t7 = add i32 %t5, %t6
119  ret i32 %t7
120}
121
122;YESCOLOR: subq  $112, %rsp
123;NOCOLOR: subq  $400, %rsp
124
125define i32 @myCall2_w4(i32 %in) {
126entry:
127  %a1 = alloca [14 x i8*], align 8
128  %a2 = alloca [13 x i8*], align 8
129  %a3 = alloca [12 x i8*], align 8
130  %a4 = alloca [11 x i8*], align 8
131  %b1 = bitcast [14 x i8*]* %a1 to i8*
132  %b2 = bitcast [13 x i8*]* %a2 to i8*
133  %b3 = bitcast [12 x i8*]* %a3 to i8*
134  %b4 = bitcast [11 x i8*]* %a4 to i8*
135  call void @llvm.lifetime.start(i64 -1, i8* %b1)
136  %t1 = call i32 @foo(i32 %in, i8* %b1)
137  %t2 = call i32 @foo(i32 %in, i8* %b1)
138  call void @llvm.lifetime.end(i64 -1, i8* %b1)
139  call void @llvm.lifetime.start(i64 -1, i8* %b2)
140  %t9 = call i32 @foo(i32 %in, i8* %b2)
141  %t8 = call i32 @foo(i32 %in, i8* %b2)
142  call void @llvm.lifetime.end(i64 -1, i8* %b2)
143  call void @llvm.lifetime.start(i64 -1, i8* %b3)
144  %t3 = call i32 @foo(i32 %in, i8* %b3)
145  %t4 = call i32 @foo(i32 %in, i8* %b3)
146  call void @llvm.lifetime.end(i64 -1, i8* %b3)
147  br i1 undef, label %bb2, label %bb3
148bb2:
149  call void @llvm.lifetime.start(i64 -1, i8* %b4)
150  %t11 = call i32 @foo(i32 %in, i8* %b4)
151  call void @llvm.lifetime.end(i64 -1, i8* %b4)
152  %t5 = add i32 %t1, %t2
153  %t6 = add i32 %t3, %t4
154  %t7 = add i32 %t5, %t6
155  ret i32 %t7
156bb3:
157  ret i32 0
158}
159
160
161;YESCOLOR: subq  $144, %rsp
162;NOCOLOR: subq  $272, %rsp
163
164
165define i32 @myCall2_noend(i32 %in, i1 %d) {
166entry:
167  %a = alloca [17 x i8*], align 8
168  %a2 = alloca [16 x i8*], align 8
169  %b = bitcast [17 x i8*]* %a to i8*
170  %b2 = bitcast [16 x i8*]* %a2 to i8*
171  call void @llvm.lifetime.start(i64 -1, i8* %b)
172  %t1 = call i32 @foo(i32 %in, i8* %b)
173  %t2 = call i32 @foo(i32 %in, i8* %b)
174  call void @llvm.lifetime.end(i64 -1, i8* %b)
175  br i1 %d, label %bb2, label %bb3
176bb2:
177  call void @llvm.lifetime.start(i64 -1, i8* %b2)
178  %t3 = call i32 @foo(i32 %in, i8* %b2)
179  %t4 = call i32 @foo(i32 %in, i8* %b2)
180  %t5 = add i32 %t1, %t2
181  %t6 = add i32 %t3, %t4
182  %t7 = add i32 %t5, %t6
183  ret i32 %t7
184bb3:
185  ret i32 0
186}
187
188;YESCOLOR: subq  $144, %rsp
189;NOCOLOR: subq  $272, %rsp
190define i32 @myCall2_noend2(i32 %in, i1 %d) {
191entry:
192  %a = alloca [17 x i8*], align 8
193  %a2 = alloca [16 x i8*], align 8
194  %b = bitcast [17 x i8*]* %a to i8*
195  %b2 = bitcast [16 x i8*]* %a2 to i8*
196  call void @llvm.lifetime.start(i64 -1, i8* %b)
197  %t1 = call i32 @foo(i32 %in, i8* %b)
198  %t2 = call i32 @foo(i32 %in, i8* %b)
199  br i1 %d, label %bb2, label %bb3
200bb2:
201  call void @llvm.lifetime.end(i64 -1, i8* %b)
202  call void @llvm.lifetime.start(i64 -1, i8* %b2)
203  %t3 = call i32 @foo(i32 %in, i8* %b2)
204  %t4 = call i32 @foo(i32 %in, i8* %b2)
205  %t5 = add i32 %t1, %t2
206  %t6 = add i32 %t3, %t4
207  %t7 = add i32 %t5, %t6
208  ret i32 %t7
209bb3:
210  ret i32 0
211}
212
213
214;YESCOLOR: subq  $144, %rsp
215;NOCOLOR: subq  $272, %rsp
216define i32 @myCall2_nostart(i32 %in, i1 %d) {
217entry:
218  %a = alloca [17 x i8*], align 8
219  %a2 = alloca [16 x i8*], align 8
220  %b = bitcast [17 x i8*]* %a to i8*
221  %b2 = bitcast [16 x i8*]* %a2 to i8*
222  %t1 = call i32 @foo(i32 %in, i8* %b)
223  %t2 = call i32 @foo(i32 %in, i8* %b)
224  call void @llvm.lifetime.end(i64 -1, i8* %b)
225  br i1 %d, label %bb2, label %bb3
226bb2:
227  call void @llvm.lifetime.start(i64 -1, i8* %b2)
228  %t3 = call i32 @foo(i32 %in, i8* %b2)
229  %t4 = call i32 @foo(i32 %in, i8* %b2)
230  %t5 = add i32 %t1, %t2
231  %t6 = add i32 %t3, %t4
232  %t7 = add i32 %t5, %t6
233  ret i32 %t7
234bb3:
235  ret i32 0
236}
237
238; Adopt the test from Transforms/Inline/array_merge.ll'
239;YESCOLOR: subq  $816, %rsp
240;NOCOLOR: subq  $1616, %rsp
241define void @array_merge() nounwind ssp {
242entry:
243  %A.i1 = alloca [100 x i32], align 4
244  %B.i2 = alloca [100 x i32], align 4
245  %A.i = alloca [100 x i32], align 4
246  %B.i = alloca [100 x i32], align 4
247  %0 = bitcast [100 x i32]* %A.i to i8*
248  call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind
249  %1 = bitcast [100 x i32]* %B.i to i8*
250  call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
251  call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
252  call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
253  call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
254  %2 = bitcast [100 x i32]* %A.i1 to i8*
255  call void @llvm.lifetime.start(i64 -1, i8* %2) nounwind
256  %3 = bitcast [100 x i32]* %B.i2 to i8*
257  call void @llvm.lifetime.start(i64 -1, i8* %3) nounwind
258  call void @bar([100 x i32]* %A.i1, [100 x i32]* %B.i2) nounwind
259  call void @llvm.lifetime.end(i64 -1, i8* %2) nounwind
260  call void @llvm.lifetime.end(i64 -1, i8* %3) nounwind
261  ret void
262}
263
264;YESCOLOR: subq  $272, %rsp
265;NOCOLOR: subq  $272, %rsp
266define i32 @func_phi_lifetime(i32 %in, i1 %d) {
267entry:
268  %a = alloca [17 x i8*], align 8
269  %a2 = alloca [16 x i8*], align 8
270  %b = bitcast [17 x i8*]* %a to i8*
271  %b2 = bitcast [16 x i8*]* %a2 to i8*
272  %t1 = call i32 @foo(i32 %in, i8* %b)
273  %t2 = call i32 @foo(i32 %in, i8* %b)
274  call void @llvm.lifetime.end(i64 -1, i8* %b)
275  br i1 %d, label %bb0, label %bb1
276
277bb0:
278  %I1 = bitcast [17 x i8*]* %a to i8*
279  br label %bb2
280
281bb1:
282  %I2 = bitcast [16 x i8*]* %a2 to i8*
283  br label %bb2
284
285bb2:
286  %split = phi i8* [ %I1, %bb0 ], [ %I2, %bb1 ]
287  call void @llvm.lifetime.start(i64 -1, i8* %split)
288  %t3 = call i32 @foo(i32 %in, i8* %b2)
289  %t4 = call i32 @foo(i32 %in, i8* %b2)
290  %t5 = add i32 %t1, %t2
291  %t6 = add i32 %t3, %t4
292  %t7 = add i32 %t5, %t6
293  call void @llvm.lifetime.end(i64 -1, i8* %split)
294  ret i32 %t7
295bb3:
296  ret i32 0
297}
298
299
300;YESCOLOR-LABEL: multi_region_bb:
301;NOCOLOR-LABEL: multi_region_bb:
302define void @multi_region_bb() nounwind ssp {
303entry:
304  %A.i1 = alloca [100 x i32], align 4
305  %B.i2 = alloca [100 x i32], align 4
306  %A.i = alloca [100 x i32], align 4
307  %B.i = alloca [100 x i32], align 4
308  %0 = bitcast [100 x i32]* %A.i to i8*
309  call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind ; <---- start #1
310  %1 = bitcast [100 x i32]* %B.i to i8*
311  call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
312  call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
313  call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
314  call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
315  %2 = bitcast [100 x i32]* %A.i1 to i8*
316  call void @llvm.lifetime.start(i64 -1, i8* %2) nounwind
317  %3 = bitcast [100 x i32]* %B.i2 to i8*
318  call void @llvm.lifetime.start(i64 -1, i8* %3) nounwind
319  call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind  ; <---- start #2
320  call void @bar([100 x i32]* %A.i1, [100 x i32]* %B.i2) nounwind
321  call void @llvm.lifetime.end(i64 -1, i8* %2) nounwind
322  call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
323  call void @llvm.lifetime.end(i64 -1, i8* %3) nounwind
324  ret void
325}
326
327
328;YESCOLOR: subq  $272, %rsp
329;NOCOLOR: subq  $272, %rsp
330define i32 @myCall_end_before_begin(i32 %in, i1 %d) {
331entry:
332  %a = alloca [17 x i8*], align 8
333  %a2 = alloca [16 x i8*], align 8
334  %b = bitcast [17 x i8*]* %a to i8*
335  %b2 = bitcast [16 x i8*]* %a2 to i8*
336  %t1 = call i32 @foo(i32 %in, i8* %b)
337  %t2 = call i32 @foo(i32 %in, i8* %b)
338  call void @llvm.lifetime.end(i64 -1, i8* %b)
339  call void @llvm.lifetime.start(i64 -1, i8* %b)
340  br i1 %d, label %bb2, label %bb3
341bb2:
342  call void @llvm.lifetime.start(i64 -1, i8* %b2)
343  %t3 = call i32 @foo(i32 %in, i8* %b2)
344  %t4 = call i32 @foo(i32 %in, i8* %b2)
345  %t5 = add i32 %t1, %t2
346  %t6 = add i32 %t3, %t4
347  %t7 = add i32 %t5, %t6
348  ret i32 %t7
349bb3:
350  ret i32 0
351}
352
353
354; Regression test for PR15707.  %buf1 and %buf2 should not be merged
355; in this test case.
356;YESCOLOR-LABEL: myCall_pr15707:
357;YESCOLOR: subq $200008, %rsp
358;NOCOLOR-LABEL: myCall_pr15707:
359;NOCOLOR: subq $200008, %rsp
360define void @myCall_pr15707() {
361  %buf1 = alloca i8, i32 100000, align 16
362  %buf2 = alloca i8, i32 100000, align 16
363
364  call void @llvm.lifetime.start(i64 -1, i8* %buf1)
365  call void @llvm.lifetime.end(i64 -1, i8* %buf1)
366
367  call void @llvm.lifetime.start(i64 -1, i8* %buf1)
368  call void @llvm.lifetime.start(i64 -1, i8* %buf2)
369  %result1 = call i32 @foo(i32 0, i8* %buf1)
370  %result2 = call i32 @foo(i32 0, i8* %buf2)
371  ret void
372}
373
374
375; Check that we don't assert and crash even when there are allocas
376; outside the declared lifetime regions.
377;YESCOLOR-LABEL: bad_range:
378;NOCOLOR-LABEL:  bad_range:
379define void @bad_range() nounwind ssp {
380entry:
381  %A.i1 = alloca [100 x i32], align 4
382  %B.i2 = alloca [100 x i32], align 4
383  %A.i = alloca [100 x i32], align 4
384  %B.i = alloca [100 x i32], align 4
385  %0 = bitcast [100 x i32]* %A.i to i8*
386  call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind
387  %1 = bitcast [100 x i32]* %B.i to i8*
388  call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
389  call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
390  call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
391  call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
392  br label %block2
393
394block2:
395  ; I am used outside the marked lifetime.
396  call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
397  ret void
398}
399
400
401; Check that we don't assert and crash even when there are usages
402; of allocas which do not read or write outside the declared lifetime regions.
403;YESCOLOR-LABEL: shady_range:
404;NOCOLOR-LABEL:  shady_range:
405
406%struct.Klass = type { i32, i32 }
407
408define i32 @shady_range(i32 %argc, i8** nocapture %argv) uwtable {
409  %a.i = alloca [4 x %struct.Klass], align 16
410  %b.i = alloca [4 x %struct.Klass], align 16
411  %a8 = bitcast [4 x %struct.Klass]* %a.i to i8*
412  %b8 = bitcast [4 x %struct.Klass]* %b.i to i8*
413  ; I am used outside the lifetime zone below:
414  %z2 = getelementptr inbounds [4 x %struct.Klass]* %a.i, i64 0, i64 0, i32 0
415  call void @llvm.lifetime.start(i64 -1, i8* %a8)
416  call void @llvm.lifetime.start(i64 -1, i8* %b8)
417  %z3 = load i32* %z2, align 16
418  %r = call i32 @foo(i32 %z3, i8* %a8)
419  %r2 = call i32 @foo(i32 %z3, i8* %b8)
420  call void @llvm.lifetime.end(i64 -1, i8* %a8)
421  call void @llvm.lifetime.end(i64 -1, i8* %b8)
422  ret i32 9
423}
424
425declare void @bar([100 x i32]* , [100 x i32]*) nounwind
426
427declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
428
429declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
430
431declare i32 @foo(i32, i8*)
432