• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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  $136, %rsp
8;NOCOLOR: subq  $264, %rsp
9
10
11define i32 @myCall_w2(i32 %in) {
12entry:
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
28  ret i32 %t7
29}
30
31
32;YESCOLOR: subq  $272, %rsp
33;NOCOLOR: subq  $272, %rsp
34
35define i32 @myCall2_no_merge(i32 %in, i1 %d) {
36entry:
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
45bb2:
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)
54  ret i32 %t7
55bb3:
56  call void @llvm.lifetime.end(i64 -1, i8* %b)
57  ret i32 0
58}
59
60;YESCOLOR: subq  $144, %rsp
61;NOCOLOR: subq  $272, %rsp
62
63define i32 @myCall2_w2(i32 %in, i1 %d) {
64entry:
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
74bb2:
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
82  ret i32 %t7
83bb3:
84  ret i32 0
85}
86;YESCOLOR: subq  $208, %rsp
87;NOCOLOR: subq  $400, %rsp
88
89
90
91
92define i32 @myCall_w4(i32 %in) {
93entry:
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
120  ret i32 %t7
121}
122
123;YESCOLOR: subq  $112, %rsp
124;NOCOLOR: subq  $400, %rsp
125
126define i32 @myCall2_w4(i32 %in) {
127entry:
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
149bb2:
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
156  ret i32 %t7
157bb3:
158  ret i32 0
159}
160
161
162;YESCOLOR: subq  $144, %rsp
163;NOCOLOR: subq  $272, %rsp
164
165
166define i32 @myCall2_noend(i32 %in, i1 %d) {
167entry:
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
177bb2:
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
184  ret i32 %t7
185bb3:
186  ret i32 0
187}
188
189;YESCOLOR: subq  $144, %rsp
190;NOCOLOR: subq  $272, %rsp
191define i32 @myCall2_noend2(i32 %in, i1 %d) {
192entry:
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
201bb2:
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
209  ret i32 %t7
210bb3:
211  ret i32 0
212}
213
214
215;YESCOLOR: subq  $144, %rsp
216;NOCOLOR: subq  $272, %rsp
217define i32 @myCall2_nostart(i32 %in, i1 %d) {
218entry:
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
227bb2:
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
234  ret i32 %t7
235bb3:
236  ret i32 0
237}
238
239; Adopt the test from Transforms/Inline/array_merge.ll'
240;YESCOLOR: subq  $816, %rsp
241;NOCOLOR: subq  $1616, %rsp
242define void @array_merge() nounwind ssp {
243entry:
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
262  ret void
263}
264
265;YESCOLOR: subq  $272, %rsp
266;NOCOLOR: subq  $272, %rsp
267define i32 @func_phi_lifetime(i32 %in, i1 %d) {
268entry:
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
277
278bb0:
279  %I1 = bitcast [17 x i8*]* %a to i8*
280  br label %bb2
281
282bb1:
283  %I2 = bitcast [16 x i8*]* %a2 to i8*
284  br label %bb2
285
286bb2:
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)
295  ret i32 %t7
296bb3:
297  ret i32 0
298}
299
300
301;YESCOLOR: multi_region_bb
302;NOCOLOR: multi_region_bb
303define void @multi_region_bb() nounwind ssp {
304entry:
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
325  ret void
326}
327
328
329;YESCOLOR: subq  $272, %rsp
330;NOCOLOR: subq  $272, %rsp
331
332define i32 @myCall_end_before_begin(i32 %in, i1 %d) {
333entry:
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
343bb2:
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
350  ret i32 %t7
351bb3:
352  ret i32 0
353}
354
355declare void @bar([100 x i32]* , [100 x i32]*) nounwind
356
357declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
358
359declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
360
361 declare i32 @foo(i32, i8*)
362
363