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 $144, %rsp
8 ;NOCOLOR: subq $272, %rsp
10 define i32 @myCall_w2(i32 %in) {
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
31 ;YESCOLOR: subq $272, %rsp
32 ;NOCOLOR: subq $272, %rsp
34 define i32 @myCall2_no_merge(i32 %in, i1 %d) {
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
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)
55 call void @llvm.lifetime.end(i64 -1, i8* %b)
59 ;YESCOLOR: subq $144, %rsp
60 ;NOCOLOR: subq $272, %rsp
62 define i32 @myCall2_w2(i32 %in, i1 %d) {
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
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
85 ;YESCOLOR: subq $200, %rsp
86 ;NOCOLOR: subq $408, %rsp
91 define i32 @myCall_w4(i32 %in) {
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
122 ;YESCOLOR: subq $112, %rsp
123 ;NOCOLOR: subq $400, %rsp
125 define i32 @myCall2_w4(i32 %in) {
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
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
161 ;YESCOLOR: subq $144, %rsp
162 ;NOCOLOR: subq $272, %rsp
165 define i32 @myCall2_noend(i32 %in, i1 %d) {
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
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
188 ;YESCOLOR: subq $144, %rsp
189 ;NOCOLOR: subq $272, %rsp
190 define i32 @myCall2_noend2(i32 %in, i1 %d) {
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
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
214 ;YESCOLOR: subq $144, %rsp
215 ;NOCOLOR: subq $272, %rsp
216 define i32 @myCall2_nostart(i32 %in, i1 %d) {
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
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
238 ; Adopt the test from Transforms/Inline/array_merge.ll'
239 ;YESCOLOR: subq $816, %rsp
240 ;NOCOLOR: subq $1616, %rsp
241 define void @array_merge() nounwind ssp {
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
264 ;YESCOLOR: subq $272, %rsp
265 ;NOCOLOR: subq $272, %rsp
266 define i32 @func_phi_lifetime(i32 %in, i1 %d) {
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
278 %I1 = bitcast [17 x i8*]* %a to i8*
282 %I2 = bitcast [16 x i8*]* %a2 to i8*
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)
300 ;YESCOLOR-LABEL: multi_region_bb:
301 ;NOCOLOR-LABEL: multi_region_bb:
302 define void @multi_region_bb() nounwind ssp {
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
328 ;YESCOLOR: subq $272, %rsp
329 ;NOCOLOR: subq $272, %rsp
330 define i32 @myCall_end_before_begin(i32 %in, i1 %d) {
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
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
354 ; Regression test for PR15707. %buf1 and %buf2 should not be merged
356 ;YESCOLOR-LABEL: myCall_pr15707:
357 ;YESCOLOR: subq $200008, %rsp
358 ;NOCOLOR-LABEL: myCall_pr15707:
359 ;NOCOLOR: subq $200008, %rsp
360 define void @myCall_pr15707() {
361 %buf1 = alloca i8, i32 100000, align 16
362 %buf2 = alloca i8, i32 100000, align 16
364 call void @llvm.lifetime.start(i64 -1, i8* %buf1)
365 call void @llvm.lifetime.end(i64 -1, i8* %buf1)
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)
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:
379 define void @bad_range() nounwind ssp {
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
395 ; I am used outside the marked lifetime.
396 call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
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:
406 %struct.Klass = type { i32, i32 }
408 define 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)
425 declare void @bar([100 x i32]* , [100 x i32]*) nounwind
427 declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
429 declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
431 declare i32 @foo(i32, i8*)