2 ; Disabled for a single commit only
3 ; disabled: llc -mcpu=corei7 -no-stack-coloring=false < %s | FileCheck %s --check-prefix=YESCOLOR
4 ; disabled: llc -mcpu=corei7 -no-stack-coloring=true < %s | FileCheck %s --check-prefix=NOCOLOR
6 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"
7 target triple = "x86_64-apple-macosx10.8.0"
9 ;YESCOLOR: subq $136, %rsp
10 ;NOCOLOR: subq $264, %rsp
12 define i32 @myCall_w2(i32 %in) {
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
33 ;YESCOLOR: subq $272, %rsp
34 ;NOCOLOR: subq $272, %rsp
36 define i32 @myCall2_no_merge(i32 %in, i1 %d) {
38 %a = alloca [17 x i8*], align 8
39 %a2 = alloca [16 x i8*], align 8
40 %b = bitcast [17 x i8*]* %a to i8*
41 %b2 = bitcast [16 x i8*]* %a2 to i8*
42 call void @llvm.lifetime.start(i64 -1, i8* %b)
43 %t1 = call i32 @foo(i32 %in, i8* %b)
44 %t2 = call i32 @foo(i32 %in, i8* %b)
45 br i1 %d, label %bb2, label %bb3
47 call void @llvm.lifetime.start(i64 -1, i8* %b2)
48 %t3 = call i32 @foo(i32 %in, i8* %b2)
49 %t4 = call i32 @foo(i32 %in, i8* %b2)
50 call void @llvm.lifetime.end(i64 -1, i8* %b2)
51 %t5 = add i32 %t1, %t2
52 %t6 = add i32 %t3, %t4
53 %t7 = add i32 %t5, %t6
54 call void @llvm.lifetime.end(i64 -1, i8* %b)
57 call void @llvm.lifetime.end(i64 -1, i8* %b)
61 ;YESCOLOR: subq $144, %rsp
62 ;NOCOLOR: subq $272, %rsp
64 define i32 @myCall2_w2(i32 %in, i1 %d) {
66 %a = alloca [17 x i8*], align 8
67 %a2 = alloca [16 x i8*], align 8
68 %b = bitcast [17 x i8*]* %a to i8*
69 %b2 = bitcast [16 x i8*]* %a2 to i8*
70 call void @llvm.lifetime.start(i64 -1, i8* %b)
71 %t1 = call i32 @foo(i32 %in, i8* %b)
72 %t2 = call i32 @foo(i32 %in, i8* %b)
73 call void @llvm.lifetime.end(i64 -1, i8* %b)
74 br i1 %d, label %bb2, label %bb3
76 call void @llvm.lifetime.start(i64 -1, i8* %b2)
77 %t3 = call i32 @foo(i32 %in, i8* %b2)
78 %t4 = call i32 @foo(i32 %in, i8* %b2)
79 call void @llvm.lifetime.end(i64 -1, i8* %b2)
80 %t5 = add i32 %t1, %t2
81 %t6 = add i32 %t3, %t4
82 %t7 = add i32 %t5, %t6
87 ;YESCOLOR: subq $200, %rsp
88 ;NOCOLOR: subq $408, %rsp
93 define i32 @myCall_w4(i32 %in) {
95 %a1 = alloca [14 x i8*], align 8
96 %a2 = alloca [13 x i8*], align 8
97 %a3 = alloca [12 x i8*], align 8
98 %a4 = alloca [11 x i8*], align 8
99 %b1 = bitcast [14 x i8*]* %a1 to i8*
100 %b2 = bitcast [13 x i8*]* %a2 to i8*
101 %b3 = bitcast [12 x i8*]* %a3 to i8*
102 %b4 = bitcast [11 x i8*]* %a4 to i8*
103 call void @llvm.lifetime.start(i64 -1, i8* %b4)
104 call void @llvm.lifetime.start(i64 -1, i8* %b1)
105 %t1 = call i32 @foo(i32 %in, i8* %b1)
106 %t2 = call i32 @foo(i32 %in, i8* %b1)
107 call void @llvm.lifetime.end(i64 -1, i8* %b1)
108 call void @llvm.lifetime.start(i64 -1, i8* %b2)
109 %t9 = call i32 @foo(i32 %in, i8* %b2)
110 %t8 = call i32 @foo(i32 %in, i8* %b2)
111 call void @llvm.lifetime.end(i64 -1, i8* %b2)
112 call void @llvm.lifetime.start(i64 -1, i8* %b3)
113 %t3 = call i32 @foo(i32 %in, i8* %b3)
114 %t4 = call i32 @foo(i32 %in, i8* %b3)
115 call void @llvm.lifetime.end(i64 -1, i8* %b3)
116 %t11 = call i32 @foo(i32 %in, i8* %b4)
117 call void @llvm.lifetime.end(i64 -1, i8* %b4)
118 %t5 = add i32 %t1, %t2
119 %t6 = add i32 %t3, %t4
120 %t7 = add i32 %t5, %t6
124 ;YESCOLOR: subq $112, %rsp
125 ;NOCOLOR: subq $400, %rsp
127 define i32 @myCall2_w4(i32 %in) {
129 %a1 = alloca [14 x i8*], align 8
130 %a2 = alloca [13 x i8*], align 8
131 %a3 = alloca [12 x i8*], align 8
132 %a4 = alloca [11 x i8*], align 8
133 %b1 = bitcast [14 x i8*]* %a1 to i8*
134 %b2 = bitcast [13 x i8*]* %a2 to i8*
135 %b3 = bitcast [12 x i8*]* %a3 to i8*
136 %b4 = bitcast [11 x i8*]* %a4 to i8*
137 call void @llvm.lifetime.start(i64 -1, i8* %b1)
138 %t1 = call i32 @foo(i32 %in, i8* %b1)
139 %t2 = call i32 @foo(i32 %in, i8* %b1)
140 call void @llvm.lifetime.end(i64 -1, i8* %b1)
141 call void @llvm.lifetime.start(i64 -1, i8* %b2)
142 %t9 = call i32 @foo(i32 %in, i8* %b2)
143 %t8 = call i32 @foo(i32 %in, i8* %b2)
144 call void @llvm.lifetime.end(i64 -1, i8* %b2)
145 call void @llvm.lifetime.start(i64 -1, i8* %b3)
146 %t3 = call i32 @foo(i32 %in, i8* %b3)
147 %t4 = call i32 @foo(i32 %in, i8* %b3)
148 call void @llvm.lifetime.end(i64 -1, i8* %b3)
149 br i1 undef, label %bb2, label %bb3
151 call void @llvm.lifetime.start(i64 -1, i8* %b4)
152 %t11 = call i32 @foo(i32 %in, i8* %b4)
153 call void @llvm.lifetime.end(i64 -1, i8* %b4)
154 %t5 = add i32 %t1, %t2
155 %t6 = add i32 %t3, %t4
156 %t7 = add i32 %t5, %t6
163 ;YESCOLOR: subq $144, %rsp
164 ;NOCOLOR: subq $272, %rsp
167 define i32 @myCall2_noend(i32 %in, i1 %d) {
169 %a = alloca [17 x i8*], align 8
170 %a2 = alloca [16 x i8*], align 8
171 %b = bitcast [17 x i8*]* %a to i8*
172 %b2 = bitcast [16 x i8*]* %a2 to i8*
173 call void @llvm.lifetime.start(i64 -1, i8* %b)
174 %t1 = call i32 @foo(i32 %in, i8* %b)
175 %t2 = call i32 @foo(i32 %in, i8* %b)
176 call void @llvm.lifetime.end(i64 -1, i8* %b)
177 br i1 %d, label %bb2, label %bb3
179 call void @llvm.lifetime.start(i64 -1, i8* %b2)
180 %t3 = call i32 @foo(i32 %in, i8* %b2)
181 %t4 = call i32 @foo(i32 %in, i8* %b2)
182 %t5 = add i32 %t1, %t2
183 %t6 = add i32 %t3, %t4
184 %t7 = add i32 %t5, %t6
190 ;YESCOLOR: subq $144, %rsp
191 ;NOCOLOR: subq $272, %rsp
192 define i32 @myCall2_noend2(i32 %in, i1 %d) {
194 %a = alloca [17 x i8*], align 8
195 %a2 = alloca [16 x i8*], align 8
196 %b = bitcast [17 x i8*]* %a to i8*
197 %b2 = bitcast [16 x i8*]* %a2 to i8*
198 call void @llvm.lifetime.start(i64 -1, i8* %b)
199 %t1 = call i32 @foo(i32 %in, i8* %b)
200 %t2 = call i32 @foo(i32 %in, i8* %b)
201 br i1 %d, label %bb2, label %bb3
203 call void @llvm.lifetime.end(i64 -1, i8* %b)
204 call void @llvm.lifetime.start(i64 -1, i8* %b2)
205 %t3 = call i32 @foo(i32 %in, i8* %b2)
206 %t4 = call i32 @foo(i32 %in, i8* %b2)
207 %t5 = add i32 %t1, %t2
208 %t6 = add i32 %t3, %t4
209 %t7 = add i32 %t5, %t6
216 ;YESCOLOR: subq $144, %rsp
217 ;NOCOLOR: subq $272, %rsp
218 define i32 @myCall2_nostart(i32 %in, i1 %d) {
220 %a = alloca [17 x i8*], align 8
221 %a2 = alloca [16 x i8*], align 8
222 %b = bitcast [17 x i8*]* %a to i8*
223 %b2 = bitcast [16 x i8*]* %a2 to i8*
224 %t1 = call i32 @foo(i32 %in, i8* %b)
225 %t2 = call i32 @foo(i32 %in, i8* %b)
226 call void @llvm.lifetime.end(i64 -1, i8* %b)
227 br i1 %d, label %bb2, label %bb3
229 call void @llvm.lifetime.start(i64 -1, i8* %b2)
230 %t3 = call i32 @foo(i32 %in, i8* %b2)
231 %t4 = call i32 @foo(i32 %in, i8* %b2)
232 %t5 = add i32 %t1, %t2
233 %t6 = add i32 %t3, %t4
234 %t7 = add i32 %t5, %t6
240 ; Adopt the test from Transforms/Inline/array_merge.ll'
241 ;YESCOLOR: subq $816, %rsp
242 ;NOCOLOR: subq $1616, %rsp
243 define void @array_merge() nounwind ssp {
245 %A.i1 = alloca [100 x i32], align 4
246 %B.i2 = alloca [100 x i32], align 4
247 %A.i = alloca [100 x i32], align 4
248 %B.i = alloca [100 x i32], align 4
249 %0 = bitcast [100 x i32]* %A.i to i8*
250 call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind
251 %1 = bitcast [100 x i32]* %B.i to i8*
252 call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
253 call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
254 call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
255 call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
256 %2 = bitcast [100 x i32]* %A.i1 to i8*
257 call void @llvm.lifetime.start(i64 -1, i8* %2) nounwind
258 %3 = bitcast [100 x i32]* %B.i2 to i8*
259 call void @llvm.lifetime.start(i64 -1, i8* %3) nounwind
260 call void @bar([100 x i32]* %A.i1, [100 x i32]* %B.i2) nounwind
261 call void @llvm.lifetime.end(i64 -1, i8* %2) nounwind
262 call void @llvm.lifetime.end(i64 -1, i8* %3) nounwind
266 ;YESCOLOR: subq $272, %rsp
267 ;NOCOLOR: subq $272, %rsp
268 define i32 @func_phi_lifetime(i32 %in, i1 %d) {
270 %a = alloca [17 x i8*], align 8
271 %a2 = alloca [16 x i8*], align 8
272 %b = bitcast [17 x i8*]* %a to i8*
273 %b2 = bitcast [16 x i8*]* %a2 to i8*
274 %t1 = call i32 @foo(i32 %in, i8* %b)
275 %t2 = call i32 @foo(i32 %in, i8* %b)
276 call void @llvm.lifetime.end(i64 -1, i8* %b)
277 br i1 %d, label %bb0, label %bb1
280 %I1 = bitcast [17 x i8*]* %a to i8*
284 %I2 = bitcast [16 x i8*]* %a2 to i8*
288 %split = phi i8* [ %I1, %bb0 ], [ %I2, %bb1 ]
289 call void @llvm.lifetime.start(i64 -1, i8* %split)
290 %t3 = call i32 @foo(i32 %in, i8* %b2)
291 %t4 = call i32 @foo(i32 %in, i8* %b2)
292 %t5 = add i32 %t1, %t2
293 %t6 = add i32 %t3, %t4
294 %t7 = add i32 %t5, %t6
295 call void @llvm.lifetime.end(i64 -1, i8* %split)
302 ;YESCOLOR-LABEL: multi_region_bb:
303 ;NOCOLOR-LABEL: multi_region_bb:
304 define void @multi_region_bb() nounwind ssp {
306 %A.i1 = alloca [100 x i32], align 4
307 %B.i2 = alloca [100 x i32], align 4
308 %A.i = alloca [100 x i32], align 4
309 %B.i = alloca [100 x i32], align 4
310 %0 = bitcast [100 x i32]* %A.i to i8*
311 call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind ; <---- start #1
312 %1 = bitcast [100 x i32]* %B.i to i8*
313 call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
314 call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
315 call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
316 call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
317 %2 = bitcast [100 x i32]* %A.i1 to i8*
318 call void @llvm.lifetime.start(i64 -1, i8* %2) nounwind
319 %3 = bitcast [100 x i32]* %B.i2 to i8*
320 call void @llvm.lifetime.start(i64 -1, i8* %3) nounwind
321 call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind ; <---- start #2
322 call void @bar([100 x i32]* %A.i1, [100 x i32]* %B.i2) nounwind
323 call void @llvm.lifetime.end(i64 -1, i8* %2) nounwind
324 call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
325 call void @llvm.lifetime.end(i64 -1, i8* %3) nounwind
330 ;YESCOLOR: subq $272, %rsp
331 ;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
356 ; Regression test for PR15707. %buf1 and %buf2 should not be merged
358 ;YESCOLOR-LABEL: myCall_pr15707:
359 ;YESCOLOR: subq $200008, %rsp
360 ;NOCOLOR-LABEL: myCall_pr15707:
361 ;NOCOLOR: subq $200008, %rsp
362 define void @myCall_pr15707() {
363 %buf1 = alloca i8, i32 100000, align 16
364 %buf2 = alloca i8, i32 100000, align 16
366 call void @llvm.lifetime.start(i64 -1, i8* %buf1)
367 call void @llvm.lifetime.end(i64 -1, i8* %buf1)
369 call void @llvm.lifetime.start(i64 -1, i8* %buf1)
370 call void @llvm.lifetime.start(i64 -1, i8* %buf2)
371 %result1 = call i32 @foo(i32 0, i8* %buf1)
372 %result2 = call i32 @foo(i32 0, i8* %buf2)
377 ; Check that we don't assert and crash even when there are allocas
378 ; outside the declared lifetime regions.
379 ;YESCOLOR-LABEL: bad_range:
380 ;NOCOLOR-LABEL: bad_range:
381 define void @bad_range() nounwind ssp {
383 %A.i1 = alloca [100 x i32], align 4
384 %B.i2 = alloca [100 x i32], align 4
385 %A.i = alloca [100 x i32], align 4
386 %B.i = alloca [100 x i32], align 4
387 %0 = bitcast [100 x i32]* %A.i to i8*
388 call void @llvm.lifetime.start(i64 -1, i8* %0) nounwind
389 %1 = bitcast [100 x i32]* %B.i to i8*
390 call void @llvm.lifetime.start(i64 -1, i8* %1) nounwind
391 call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
392 call void @llvm.lifetime.end(i64 -1, i8* %0) nounwind
393 call void @llvm.lifetime.end(i64 -1, i8* %1) nounwind
397 ; I am used outside the marked lifetime.
398 call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
403 ; Check that we don't assert and crash even when there are usages
404 ; of allocas which do not read or write outside the declared lifetime regions.
405 ;YESCOLOR-LABEL: shady_range:
406 ;NOCOLOR-LABEL: shady_range:
408 %struct.Klass = type { i32, i32 }
410 define i32 @shady_range(i32 %argc, i8** nocapture %argv) uwtable {
411 %a.i = alloca [4 x %struct.Klass], align 16
412 %b.i = alloca [4 x %struct.Klass], align 16
413 %a8 = bitcast [4 x %struct.Klass]* %a.i to i8*
414 %b8 = bitcast [4 x %struct.Klass]* %b.i to i8*
415 ; I am used outside the lifetime zone below:
416 %z2 = getelementptr inbounds [4 x %struct.Klass]* %a.i, i64 0, i64 0, i32 0
417 call void @llvm.lifetime.start(i64 -1, i8* %a8)
418 call void @llvm.lifetime.start(i64 -1, i8* %b8)
419 %z3 = load i32* %z2, align 16
420 %r = call i32 @foo(i32 %z3, i8* %a8)
421 %r2 = call i32 @foo(i32 %z3, i8* %b8)
422 call void @llvm.lifetime.end(i64 -1, i8* %a8)
423 call void @llvm.lifetime.end(i64 -1, i8* %b8)
427 declare void @bar([100 x i32]* , [100 x i32]*) nounwind
429 declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
431 declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
433 declare i32 @foo(i32, i8*)