1; RUN: llc -mcpu=corei7 -no-stack-coloring=false -stackcoloring-lifetime-start-on-first-use=true < %s | FileCheck %s --check-prefix=FIRSTUSE --check-prefix=CHECK
2; RUN: llc -mcpu=corei7 -no-stack-coloring=false < %s | FileCheck %s --check-prefix=YESCOLOR --check-prefix=CHECK
3; RUN: llc -mcpu=corei7 -no-stack-coloring=true  < %s | FileCheck %s --check-prefix=NOCOLOR --check-prefix=CHECK
4
5target 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"
6target triple = "x86_64-apple-macosx10.8.0"
7
8;CHECK-LABEL: myCall_w2:
9;YESCOLOR: subq  $144, %rsp
10;NOCOLOR: subq  $272, %rsp
11
12define i32 @myCall_w2(i32 %in) {
13entry:
14  %a = alloca [17 x i8*], align 8
15  %a2 = alloca [16 x i8*], align 8
16  %b = bitcast [17 x i8*]* %a to i8*
17  %b2 = bitcast [16 x i8*]* %a2 to i8*
18  call void @llvm.lifetime.start(i64 -1, i8* %b)
19  %t1 = call i32 @foo(i32 %in, i8* %b)
20  %t2 = call i32 @foo(i32 %in, i8* %b)
21  call void @llvm.lifetime.end(i64 -1, i8* %b)
22  call void @llvm.lifetime.start(i64 -1, i8* %b2)
23  %t3 = call i32 @foo(i32 %in, i8* %b2)
24  %t4 = call i32 @foo(i32 %in, i8* %b2)
25  call void @llvm.lifetime.end(i64 -1, i8* %b2)
26  %t5 = add i32 %t1, %t2
27  %t6 = add i32 %t3, %t4
28  %t7 = add i32 %t5, %t6
29  ret i32 %t7
30}
31
32
33;CHECK-LABEL: myCall2_no_merge
34;YESCOLOR: subq  $272, %rsp
35;NOCOLOR: subq  $272, %rsp
36
37define i32 @myCall2_no_merge(i32 %in, i1 %d) {
38entry:
39  %a = alloca [17 x i8*], align 8
40  %a2 = alloca [16 x i8*], align 8
41  %b = bitcast [17 x i8*]* %a to i8*
42  %b2 = bitcast [16 x i8*]* %a2 to i8*
43  call void @llvm.lifetime.start(i64 -1, i8* %b)
44  %t1 = call i32 @foo(i32 %in, i8* %b)
45  %t2 = call i32 @foo(i32 %in, i8* %b)
46  br i1 %d, label %bb2, label %bb3
47bb2:
48  call void @llvm.lifetime.start(i64 -1, i8* %b2)
49  %t3 = call i32 @foo(i32 %in, i8* %b2)
50  %t4 = call i32 @foo(i32 %in, i8* %b2)
51  call void @llvm.lifetime.end(i64 -1, i8* %b2)
52  %t5 = add i32 %t1, %t2
53  %t6 = add i32 %t3, %t4
54  %t7 = add i32 %t5, %t6
55  call void @llvm.lifetime.end(i64 -1, i8* %b)
56  ret i32 %t7
57bb3:
58  call void @llvm.lifetime.end(i64 -1, i8* %b)
59  ret i32 0
60}
61
62;CHECK-LABEL: myCall2_w2
63;YESCOLOR: subq  $144, %rsp
64;NOCOLOR: subq  $272, %rsp
65
66define i32 @myCall2_w2(i32 %in, i1 %d) {
67entry:
68  %a = alloca [17 x i8*], align 8
69  %a2 = alloca [16 x i8*], align 8
70  %b = bitcast [17 x i8*]* %a to i8*
71  %b2 = bitcast [16 x i8*]* %a2 to i8*
72  call void @llvm.lifetime.start(i64 -1, i8* %b)
73  %t1 = call i32 @foo(i32 %in, i8* %b)
74  %t2 = call i32 @foo(i32 %in, i8* %b)
75  call void @llvm.lifetime.end(i64 -1, i8* %b)
76  br i1 %d, label %bb2, label %bb3
77bb2:
78  call void @llvm.lifetime.start(i64 -1, i8* %b2)
79  %t3 = call i32 @foo(i32 %in, i8* %b2)
80  %t4 = call i32 @foo(i32 %in, i8* %b2)
81  call void @llvm.lifetime.end(i64 -1, i8* %b2)
82  %t5 = add i32 %t1, %t2
83  %t6 = add i32 %t3, %t4
84  %t7 = add i32 %t5, %t6
85  ret i32 %t7
86bb3:
87  ret i32 0
88}
89
90;CHECK-LABEL: myCall_w4:
91;FIRSTUSE: subq  $120, %rsp
92;YESCOLOR: subq  $200, %rsp
93;NOCOLOR: subq  $408, %rsp
94
95define i32 @myCall_w4(i32 %in) {
96entry:
97  %a1 = alloca [14 x i8*], align 8
98  %a2 = alloca [13 x i8*], align 8
99  %a3 = alloca [12 x i8*], align 8
100  %a4 = alloca [11 x i8*], align 8
101  %b1 = bitcast [14 x i8*]* %a1 to i8*
102  %b2 = bitcast [13 x i8*]* %a2 to i8*
103  %b3 = bitcast [12 x i8*]* %a3 to i8*
104  %b4 = bitcast [11 x i8*]* %a4 to i8*
105  call void @llvm.lifetime.start(i64 -1, i8* %b4)
106  call void @llvm.lifetime.start(i64 -1, i8* %b1)
107  %t1 = call i32 @foo(i32 %in, i8* %b1)
108  %t2 = call i32 @foo(i32 %in, i8* %b1)
109  call void @llvm.lifetime.end(i64 -1, i8* %b1)
110  call void @llvm.lifetime.start(i64 -1, i8* %b2)
111  %t9 = call i32 @foo(i32 %in, i8* %b2)
112  %t8 = call i32 @foo(i32 %in, i8* %b2)
113  call void @llvm.lifetime.end(i64 -1, i8* %b2)
114  call void @llvm.lifetime.start(i64 -1, i8* %b3)
115  %t3 = call i32 @foo(i32 %in, i8* %b3)
116  %t4 = call i32 @foo(i32 %in, i8* %b3)
117  call void @llvm.lifetime.end(i64 -1, i8* %b3)
118  %t11 = call i32 @foo(i32 %in, i8* %b4)
119  call void @llvm.lifetime.end(i64 -1, i8* %b4)
120  %t5 = add i32 %t1, %t2
121  %t6 = add i32 %t3, %t4
122  %t7 = add i32 %t5, %t6
123  ret i32 %t7
124}
125
126;CHECK-LABEL: myCall2_w4:
127;YESCOLOR: subq  $112, %rsp
128;NOCOLOR: subq  $400, %rsp
129
130define i32 @myCall2_w4(i32 %in) {
131entry:
132  %a1 = alloca [14 x i8*], align 8
133  %a2 = alloca [13 x i8*], align 8
134  %a3 = alloca [12 x i8*], align 8
135  %a4 = alloca [11 x i8*], align 8
136  %b1 = bitcast [14 x i8*]* %a1 to i8*
137  %b2 = bitcast [13 x i8*]* %a2 to i8*
138  %b3 = bitcast [12 x i8*]* %a3 to i8*
139  %b4 = bitcast [11 x i8*]* %a4 to i8*
140  call void @llvm.lifetime.start(i64 -1, i8* %b1)
141  %t1 = call i32 @foo(i32 %in, i8* %b1)
142  %t2 = call i32 @foo(i32 %in, i8* %b1)
143  call void @llvm.lifetime.end(i64 -1, i8* %b1)
144  call void @llvm.lifetime.start(i64 -1, i8* %b2)
145  %t9 = call i32 @foo(i32 %in, i8* %b2)
146  %t8 = call i32 @foo(i32 %in, i8* %b2)
147  call void @llvm.lifetime.end(i64 -1, i8* %b2)
148  call void @llvm.lifetime.start(i64 -1, i8* %b3)
149  %t3 = call i32 @foo(i32 %in, i8* %b3)
150  %t4 = call i32 @foo(i32 %in, i8* %b3)
151  call void @llvm.lifetime.end(i64 -1, i8* %b3)
152  br i1 undef, label %bb2, label %bb3
153bb2:
154  call void @llvm.lifetime.start(i64 -1, i8* %b4)
155  %t11 = call i32 @foo(i32 %in, i8* %b4)
156  call void @llvm.lifetime.end(i64 -1, i8* %b4)
157  %t5 = add i32 %t1, %t2
158  %t6 = add i32 %t3, %t4
159  %t7 = add i32 %t5, %t6
160  ret i32 %t7
161bb3:
162  ret i32 0
163}
164
165
166;CHECK-LABEL: myCall2_noend:
167;YESCOLOR: subq  $144, %rsp
168;NOCOLOR: subq  $272, %rsp
169
170
171define i32 @myCall2_noend(i32 %in, i1 %d) {
172entry:
173  %a = alloca [17 x i8*], align 8
174  %a2 = alloca [16 x i8*], align 8
175  %b = bitcast [17 x i8*]* %a to i8*
176  %b2 = bitcast [16 x i8*]* %a2 to i8*
177  call void @llvm.lifetime.start(i64 -1, i8* %b)
178  %t1 = call i32 @foo(i32 %in, i8* %b)
179  %t2 = call i32 @foo(i32 %in, i8* %b)
180  call void @llvm.lifetime.end(i64 -1, i8* %b)
181  br i1 %d, label %bb2, label %bb3
182bb2:
183  call void @llvm.lifetime.start(i64 -1, i8* %b2)
184  %t3 = call i32 @foo(i32 %in, i8* %b2)
185  %t4 = call i32 @foo(i32 %in, i8* %b2)
186  %t5 = add i32 %t1, %t2
187  %t6 = add i32 %t3, %t4
188  %t7 = add i32 %t5, %t6
189  ret i32 %t7
190bb3:
191  ret i32 0
192}
193
194;CHECK-LABEL: myCall2_noend2:
195;YESCOLOR: subq  $144, %rsp
196;NOCOLOR: subq  $272, %rsp
197define i32 @myCall2_noend2(i32 %in, i1 %d) {
198entry:
199  %a = alloca [17 x i8*], align 8
200  %a2 = alloca [16 x i8*], align 8
201  %b = bitcast [17 x i8*]* %a to i8*
202  %b2 = bitcast [16 x i8*]* %a2 to i8*
203  call void @llvm.lifetime.start(i64 -1, i8* %b)
204  %t1 = call i32 @foo(i32 %in, i8* %b)
205  %t2 = call i32 @foo(i32 %in, i8* %b)
206  br i1 %d, label %bb2, label %bb3
207bb2:
208  call void @llvm.lifetime.end(i64 -1, i8* %b)
209  call void @llvm.lifetime.start(i64 -1, i8* %b2)
210  %t3 = call i32 @foo(i32 %in, i8* %b2)
211  %t4 = call i32 @foo(i32 %in, i8* %b2)
212  %t5 = add i32 %t1, %t2
213  %t6 = add i32 %t3, %t4
214  %t7 = add i32 %t5, %t6
215  ret i32 %t7
216bb3:
217  ret i32 0
218}
219
220
221;CHECK-LABEL: myCall2_nostart:
222;YESCOLOR: subq  $272, %rsp
223;NOCOLOR: subq  $272, %rsp
224define i32 @myCall2_nostart(i32 %in, i1 %d) {
225entry:
226  %a = alloca [17 x i8*], align 8
227  %a2 = alloca [16 x i8*], align 8
228  %b = bitcast [17 x i8*]* %a to i8*
229  %b2 = bitcast [16 x i8*]* %a2 to i8*
230  %t1 = call i32 @foo(i32 %in, i8* %b)
231  %t2 = call i32 @foo(i32 %in, i8* %b)
232  call void @llvm.lifetime.end(i64 -1, i8* %b)
233  br i1 %d, label %bb2, label %bb3
234bb2:
235  call void @llvm.lifetime.start(i64 -1, i8* %b2)
236  %t3 = call i32 @foo(i32 %in, i8* %b2)
237  %t4 = call i32 @foo(i32 %in, i8* %b2)
238  %t5 = add i32 %t1, %t2
239  %t6 = add i32 %t3, %t4
240  %t7 = add i32 %t5, %t6
241  ret i32 %t7
242bb3:
243  ret i32 0
244}
245
246; Adopt the test from Transforms/Inline/array_merge.ll'
247;CHECK-LABEL: array_merge:
248;YESCOLOR: subq  $808, %rsp
249;NOCOLOR: subq  $1608, %rsp
250define void @array_merge() nounwind ssp {
251entry:
252  %A.i1 = alloca [100 x i32], align 4
253  %B.i2 = alloca [100 x i32], align 4
254  %A.i = alloca [100 x i32], align 4
255  %B.i = alloca [100 x i32], align 4
256  %0 = bitcast [100 x i32]* %A.i to i8*
257  call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind
258  %1 = bitcast [100 x i32]* %B.i to i8*
259  call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
260  call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
261  call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
262  call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
263  %2 = bitcast [100 x i32]* %A.i1 to i8*
264  call void @llvm.lifetime.start(i64 -1, i8* %2) nounwind
265  %3 = bitcast [100 x i32]* %B.i2 to i8*
266  call void @llvm.lifetime.start(i64 -1, i8* %3) nounwind
267  call void @bar([100 x i32]* %A.i1, [100 x i32]* %B.i2) nounwind
268  call void @llvm.lifetime.end(i64 -1, i8* %2) nounwind
269  call void @llvm.lifetime.end(i64 -1, i8* %3) nounwind
270  ret void
271}
272
273;CHECK-LABEL: func_phi_lifetime:
274;YESCOLOR: subq  $272, %rsp
275;NOCOLOR: subq  $272, %rsp
276define i32 @func_phi_lifetime(i32 %in, i1 %d) {
277entry:
278  %a = alloca [17 x i8*], align 8
279  %a2 = alloca [16 x i8*], align 8
280  %b = bitcast [17 x i8*]* %a to i8*
281  %b2 = bitcast [16 x i8*]* %a2 to i8*
282  %t1 = call i32 @foo(i32 %in, i8* %b)
283  %t2 = call i32 @foo(i32 %in, i8* %b)
284  call void @llvm.lifetime.end(i64 -1, i8* %b)
285  br i1 %d, label %bb0, label %bb1
286
287bb0:
288  %I1 = bitcast [17 x i8*]* %a to i8*
289  br label %bb2
290
291bb1:
292  %I2 = bitcast [16 x i8*]* %a2 to i8*
293  br label %bb2
294
295bb2:
296  %split = phi i8* [ %I1, %bb0 ], [ %I2, %bb1 ]
297  call void @llvm.lifetime.start(i64 -1, i8* %split)
298  %t3 = call i32 @foo(i32 %in, i8* %b2)
299  %t4 = call i32 @foo(i32 %in, i8* %b2)
300  %t5 = add i32 %t1, %t2
301  %t6 = add i32 %t3, %t4
302  %t7 = add i32 %t5, %t6
303  call void @llvm.lifetime.end(i64 -1, i8* %split)
304  ret i32 %t7
305bb3:
306  ret i32 0
307}
308
309
310;CHECK-LABEL: multi_region_bb:
311define void @multi_region_bb() nounwind ssp {
312entry:
313  %A.i1 = alloca [100 x i32], align 4
314  %B.i2 = alloca [100 x i32], align 4
315  %A.i = alloca [100 x i32], align 4
316  %B.i = alloca [100 x i32], align 4
317  %0 = bitcast [100 x i32]* %A.i to i8*
318  call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind ; <---- start #1
319  %1 = bitcast [100 x i32]* %B.i to i8*
320  call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
321  call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
322  call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
323  call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
324  %2 = bitcast [100 x i32]* %A.i1 to i8*
325  call void @llvm.lifetime.start(i64 -1, i8* %2) nounwind
326  %3 = bitcast [100 x i32]* %B.i2 to i8*
327  call void @llvm.lifetime.start(i64 -1, i8* %3) nounwind
328  call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind  ; <---- start #2
329  call void @bar([100 x i32]* %A.i1, [100 x i32]* %B.i2) nounwind
330  call void @llvm.lifetime.end(i64 -1, i8* %2) nounwind
331  call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
332  call void @llvm.lifetime.end(i64 -1, i8* %3) nounwind
333  ret void
334}
335;YESCOLOR: subq  $272, %rsp
336;NOCOLOR: subq  $272, %rsp
337
338define i32 @myCall_end_before_begin(i32 %in, i1 %d) {
339entry:
340  %a = alloca [17 x i8*], align 8
341  %a2 = alloca [16 x i8*], align 8
342  %b = bitcast [17 x i8*]* %a to i8*
343  %b2 = bitcast [16 x i8*]* %a2 to i8*
344  %t1 = call i32 @foo(i32 %in, i8* %b)
345  %t2 = call i32 @foo(i32 %in, i8* %b)
346  call void @llvm.lifetime.end(i64 -1, i8* %b)
347  call void @llvm.lifetime.start(i64 -1, i8* %b)
348  br i1 %d, label %bb2, label %bb3
349bb2:
350  call void @llvm.lifetime.start(i64 -1, i8* %b2)
351  %t3 = call i32 @foo(i32 %in, i8* %b2)
352  %t4 = call i32 @foo(i32 %in, i8* %b2)
353  %t5 = add i32 %t1, %t2
354  %t6 = add i32 %t3, %t4
355  %t7 = add i32 %t5, %t6
356  ret i32 %t7
357bb3:
358  ret i32 0
359}
360
361
362; Regression test for PR15707.  %buf1 and %buf2 should not be merged
363; in this test case.
364;CHECK-LABEL: myCall_pr15707:
365;YESCOLOR: subq $200008, %rsp
366;NOCOLOR: subq $200008, %rsp
367define void @myCall_pr15707() {
368  %buf1 = alloca i8, i32 100000, align 16
369  %buf2 = alloca i8, i32 100000, align 16
370
371  call void @llvm.lifetime.start(i64 -1, i8* %buf1)
372  call void @llvm.lifetime.end(i64 -1, i8* %buf1)
373
374  call void @llvm.lifetime.start(i64 -1, i8* %buf1)
375  call void @llvm.lifetime.start(i64 -1, i8* %buf2)
376  %result1 = call i32 @foo(i32 0, i8* %buf1)
377  %result2 = call i32 @foo(i32 0, i8* %buf2)
378  ret void
379}
380
381
382; Check that we don't assert and crash even when there are allocas
383; outside the declared lifetime regions.
384;CHECK-LABEL: bad_range:
385define void @bad_range() nounwind ssp {
386entry:
387  %A.i1 = alloca [100 x i32], align 4
388  %B.i2 = alloca [100 x i32], align 4
389  %A.i = alloca [100 x i32], align 4
390  %B.i = alloca [100 x i32], align 4
391  %0 = bitcast [100 x i32]* %A.i to i8*
392  call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind
393  %1 = bitcast [100 x i32]* %B.i to i8*
394  call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
395  call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
396  call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
397  call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
398  br label %block2
399
400block2:
401  ; I am used outside the marked lifetime.
402  call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
403  ret void
404}
405
406
407; Check that we don't assert and crash even when there are usages
408; of allocas which do not read or write outside the declared lifetime regions.
409;CHECK-LABEL: shady_range:
410
411%struct.Klass = type { i32, i32 }
412
413define i32 @shady_range(i32 %argc, i8** nocapture %argv) uwtable {
414  %a.i = alloca [4 x %struct.Klass], align 16
415  %b.i = alloca [4 x %struct.Klass], align 16
416  %a8 = bitcast [4 x %struct.Klass]* %a.i to i8*
417  %b8 = bitcast [4 x %struct.Klass]* %b.i to i8*
418  ; I am used outside the lifetime zone below:
419  %z2 = getelementptr inbounds [4 x %struct.Klass], [4 x %struct.Klass]* %a.i, i64 0, i64 0, i32 0
420  call void @llvm.lifetime.start(i64 -1, i8* %a8)
421  call void @llvm.lifetime.start(i64 -1, i8* %b8)
422  %z3 = load i32, i32* %z2, align 16
423  %r = call i32 @foo(i32 %z3, i8* %a8)
424  %r2 = call i32 @foo(i32 %z3, i8* %b8)
425  call void @llvm.lifetime.end(i64 -1, i8* %a8)
426  call void @llvm.lifetime.end(i64 -1, i8* %b8)
427  ret i32 9
428}
429
430; In this case 'itar1' and 'itar2' can't be overlapped if we treat
431; lifetime.start as the beginning of the lifetime, but we can
432; overlap if we consider first use of the slot as lifetime
433; start. See llvm bug 25776.
434
435;CHECK-LABEL: ifthen_twoslots:
436;FIRSTUSE: subq  $536, %rsp
437;YESCOLOR: subq $1048, %rsp
438;NOCOLOR: subq  $1048, %rsp
439
440define i32 @ifthen_twoslots(i32 %x) #0 {
441entry:
442  %retval = alloca i32, align 4
443  %x.addr = alloca i32, align 4
444  %itar1 = alloca [128 x i32], align 16
445  %itar2 = alloca [128 x i32], align 16
446  %cleanup.dest.slot = alloca i32
447  store i32 %x, i32* %x.addr, align 4
448  %itar1_start_8 = bitcast [128 x i32]* %itar1 to i8*
449  call void @llvm.lifetime.start(i64 512, i8* %itar1_start_8) #3
450  %itar2_start_8 = bitcast [128 x i32]* %itar2 to i8*
451  call void @llvm.lifetime.start(i64 512, i8* %itar2_start_8) #3
452  %xval = load i32, i32* %x.addr, align 4
453  %and = and i32 %xval, 1
454  %tobool = icmp ne i32 %and, 0
455  br i1 %tobool, label %if.then, label %if.else
456
457if.then:                                          ; preds = %entry
458  %arraydecay = getelementptr inbounds [128 x i32], [128 x i32]* %itar1, i32 0, i32 0
459  call void @inita(i32* %arraydecay)
460  store i32 1, i32* %retval, align 4
461  store i32 1, i32* %cleanup.dest.slot, align 4
462  %itar2_end_8 = bitcast [128 x i32]* %itar2 to i8*
463  call void @llvm.lifetime.end(i64 512, i8* %itar2_end_8) #3
464  %itar1_end_8 = bitcast [128 x i32]* %itar1 to i8*
465  call void @llvm.lifetime.end(i64 512, i8* %itar1_end_8) #3
466  br label %cleanup
467
468if.else:                                          ; preds = %entry
469  %arraydecay1 = getelementptr inbounds [128 x i32], [128 x i32]* %itar2, i32 0, i32 0
470  call void @inita(i32* %arraydecay1)
471  store i32 0, i32* %retval, align 4
472  store i32 1, i32* %cleanup.dest.slot, align 4
473  %itar2_end2_8 = bitcast [128 x i32]* %itar2 to i8*
474  call void @llvm.lifetime.end(i64 512, i8* %itar2_end2_8) #3
475  %itar1_end2_8 = bitcast [128 x i32]* %itar1 to i8*
476  call void @llvm.lifetime.end(i64 512, i8* %itar1_end2_8) #3
477  br label %cleanup
478
479cleanup:                                          ; preds = %if.else, %if.then
480  %final_retval = load i32,
481 i32* %retval, align 4
482  ret i32 %final_retval
483}
484
485; This function is intended to test the case where you
486; have a reference to a stack slot that lies outside of
487; the START/END lifetime markers-- the flow analysis
488; should catch this and build the lifetime based on the
489; markers only.
490
491;CHECK-LABEL: while_loop:
492;FIRSTUSE: subq  $1032, %rsp
493;YESCOLOR: subq  $1544, %rsp
494;NOCOLOR: subq  $1544, %rsp
495
496define i32 @while_loop(i32 %x) #0 {
497entry:
498  %b1 = alloca [128 x i32], align 16
499  %b2 = alloca [128 x i32], align 16
500  %b3 = alloca [128 x i32], align 16
501  %tmp = bitcast [128 x i32]* %b1 to i8*
502  call void @llvm.lifetime.start(i64 512, i8* %tmp) #3
503  %tmp1 = bitcast [128 x i32]* %b2 to i8*
504  call void @llvm.lifetime.start(i64 512, i8* %tmp1) #3
505  %and = and i32 %x, 1
506  %tobool = icmp eq i32 %and, 0
507  br i1 %tobool, label %if.else, label %if.then
508
509if.then:                                          ; preds = %entry
510  %arraydecay = getelementptr inbounds [128 x i32], [128 x i32]* %b2, i64 0, i64 0
511  call void @inita(i32* %arraydecay) #3
512  br label %if.end
513
514if.else:                                          ; preds = %entry
515  %arraydecay1 = getelementptr inbounds [128 x i32], [128 x i32]* %b1, i64 0, i64 0
516  call void @inita(i32* %arraydecay1) #3
517  %arraydecay3 = getelementptr inbounds [128 x i32], [128 x i32]* %b3, i64 0, i64 0
518  call void @inita(i32* %arraydecay3) #3
519  %tobool25 = icmp eq i32 %x, 0
520  br i1 %tobool25, label %if.end, label %while.body.lr.ph
521
522while.body.lr.ph:                                 ; preds = %if.else
523  %tmp2 = bitcast [128 x i32]* %b3 to i8*
524  br label %while.body
525
526while.body:                                       ; preds = %while.body.lr.ph, %while.body
527  %x.addr.06 = phi i32 [ %x, %while.body.lr.ph ], [ %dec, %while.body ]
528  %dec = add nsw i32 %x.addr.06, -1
529  call void @llvm.lifetime.start(i64 512, i8* %tmp2) #3
530  call void @inita(i32* %arraydecay3) #3
531  call void @llvm.lifetime.end(i64 512, i8* %tmp2) #3
532  %tobool2 = icmp eq i32 %dec, 0
533  br i1 %tobool2, label %if.end.loopexit, label %while.body
534
535if.end.loopexit:                                  ; preds = %while.body
536  br label %if.end
537
538if.end:                                           ; preds = %if.end.loopexit, %if.else, %if.then
539  call void @llvm.lifetime.end(i64 512, i8* %tmp1) #3
540  call void @llvm.lifetime.end(i64 512, i8* %tmp) #3
541  ret i32 0
542}
543
544; Test case motivated by PR27903. Same routine inlined multiple times
545; into a caller results in a multi-segment lifetime, but the second
546; lifetime has no explicit references to the stack slot.
547;
548; FIXME: the "FIRSTUSE" stack size (56) below represents buggy/incorrect
549; behavior not currently exposed on trunk, due to the fact that
550; the "stackcoloring-lifetime-start-on-first-use" now defaults to
551; false. When a better fix for PR27903 is checked in, this result
552; will change to 96.
553
554;CHECK-LABEL: twobod_b27903:
555;FIRSTUSE: subq  $56, %rsp
556;YESCOLOR: subq  $96, %rsp
557;NOCOLOR: subq  $96, %rsp
558
559define i32 @twobod_b27903(i32 %y, i32 %x) {
560entry:
561  %buffer.i = alloca [12 x i32], align 16
562  %abc = alloca [12 x i32], align 16
563  %tmp = bitcast [12 x i32]* %buffer.i to i8*
564  call void @llvm.lifetime.start(i64 48, i8* %tmp)
565  %idxprom.i = sext i32 %y to i64
566  %arrayidx.i = getelementptr inbounds [12 x i32], [12 x i32]* %buffer.i, i64 0, i64 %idxprom.i
567  call void @inita(i32* %arrayidx.i)
568  %add.i = add nsw i32 %x, %y
569  call void @llvm.lifetime.end(i64 48, i8* %tmp)
570  %tobool = icmp eq i32 %y, 0
571  br i1 %tobool, label %if.end, label %if.then
572
573if.then:                                          ; preds = %entry
574  %tmp1 = bitcast [12 x i32]* %abc to i8*
575  call void @llvm.lifetime.start(i64 48, i8* %tmp1)
576  %arrayidx = getelementptr inbounds [12 x i32], [12 x i32]* %abc, i64 0, i64 %idxprom.i
577  call void @inita(i32* %arrayidx)
578  call void @llvm.lifetime.start(i64 48, i8* %tmp)
579  call void @inita(i32* %arrayidx.i)
580  %add.i9 = add nsw i32 %add.i, %y
581  call void @llvm.lifetime.end(i64 48, i8* %tmp)
582  call void @llvm.lifetime.end(i64 48, i8* %tmp1)
583  br label %if.end
584
585if.end:                                           ; preds = %if.then, %entry
586  %x.addr.0 = phi i32 [ %add.i9, %if.then ], [ %add.i, %entry ]
587  ret i32 %x.addr.0
588}
589
590declare void @inita(i32*) #2
591
592declare void @bar([100 x i32]* , [100 x i32]*) nounwind
593
594declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
595
596declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
597
598declare i32 @foo(i32, i8*)
599