Allocate local registers in order for optimal coloring.
[oota-llvm.git] / test / CodeGen / X86 / StackColoring.ll
1 ; RUN: true
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
5
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"
8
9 ;YESCOLOR: subq  $136, %rsp
10 ;NOCOLOR: subq  $264, %rsp
11
12 define i32 @myCall_w2(i32 %in) {
13 entry:
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 ;YESCOLOR: subq  $272, %rsp
34 ;NOCOLOR: subq  $272, %rsp
35
36 define i32 @myCall2_no_merge(i32 %in, i1 %d) {
37 entry:
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
46 bb2:
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)
55   ret i32 %t7
56 bb3:
57   call void @llvm.lifetime.end(i64 -1, i8* %b)
58   ret i32 0
59 }
60
61 ;YESCOLOR: subq  $144, %rsp
62 ;NOCOLOR: subq  $272, %rsp
63
64 define i32 @myCall2_w2(i32 %in, i1 %d) {
65 entry:
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
75 bb2:
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
83   ret i32 %t7
84 bb3:
85   ret i32 0
86 }
87 ;YESCOLOR: subq  $200, %rsp
88 ;NOCOLOR: subq  $408, %rsp
89
90
91
92
93 define i32 @myCall_w4(i32 %in) {
94 entry:
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
121   ret i32 %t7
122 }
123
124 ;YESCOLOR: subq  $112, %rsp
125 ;NOCOLOR: subq  $400, %rsp
126
127 define i32 @myCall2_w4(i32 %in) {
128 entry:
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
150 bb2:
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
157   ret i32 %t7
158 bb3:
159   ret i32 0
160 }
161
162
163 ;YESCOLOR: subq  $144, %rsp
164 ;NOCOLOR: subq  $272, %rsp
165
166
167 define i32 @myCall2_noend(i32 %in, i1 %d) {
168 entry:
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
178 bb2:
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
185   ret i32 %t7
186 bb3:
187   ret i32 0
188 }
189
190 ;YESCOLOR: subq  $144, %rsp
191 ;NOCOLOR: subq  $272, %rsp
192 define i32 @myCall2_noend2(i32 %in, i1 %d) {
193 entry:
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
202 bb2:
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
210   ret i32 %t7
211 bb3:
212   ret i32 0
213 }
214
215
216 ;YESCOLOR: subq  $144, %rsp
217 ;NOCOLOR: subq  $272, %rsp
218 define i32 @myCall2_nostart(i32 %in, i1 %d) {
219 entry:
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
228 bb2:
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
235   ret i32 %t7
236 bb3:
237   ret i32 0
238 }
239
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 {
244 entry:
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
263   ret void
264 }
265
266 ;YESCOLOR: subq  $272, %rsp
267 ;NOCOLOR: subq  $272, %rsp
268 define i32 @func_phi_lifetime(i32 %in, i1 %d) {
269 entry:
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
278
279 bb0:
280   %I1 = bitcast [17 x i8*]* %a to i8*
281   br label %bb2
282
283 bb1:
284   %I2 = bitcast [16 x i8*]* %a2 to i8*
285   br label %bb2
286
287 bb2:
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)
296   ret i32 %t7
297 bb3:
298   ret i32 0
299 }
300
301
302 ;YESCOLOR-LABEL: multi_region_bb:
303 ;NOCOLOR-LABEL: multi_region_bb:
304 define void @multi_region_bb() nounwind ssp {
305 entry:
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
326   ret void
327 }
328
329
330 ;YESCOLOR: subq  $272, %rsp
331 ;NOCOLOR: subq  $272, %rsp
332 define i32 @myCall_end_before_begin(i32 %in, i1 %d) {
333 entry:
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
343 bb2:
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
351 bb3:
352   ret i32 0
353 }
354
355
356 ; Regression test for PR15707.  %buf1 and %buf2 should not be merged
357 ; in this test case.
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
365
366   call void @llvm.lifetime.start(i64 -1, i8* %buf1)
367   call void @llvm.lifetime.end(i64 -1, i8* %buf1)
368
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)
373   ret void
374 }
375
376
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 {
382 entry:
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
394   br label %block2
395
396 block2:
397   ; I am used outside the marked lifetime.
398   call void @bar([100 x i32]* %A.i, [100 x i32]* %B.i) nounwind
399   ret void
400 }
401
402
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:
407
408 %struct.Klass = type { i32, i32 }
409
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)
424   ret i32 9
425 }
426
427 declare void @bar([100 x i32]* , [100 x i32]*) nounwind
428
429 declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
430
431 declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
432
433 declare i32 @foo(i32, i8*)