Home | History | Annotate | Download | only in X86
      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 
      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"
      6 
      7 ;YESCOLOR: subq  $136, %rsp
      8 ;NOCOLOR: subq  $264, %rsp
      9 
     10 
     11 define i32 @myCall_w2(i32 %in) {
     12 entry:
     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 
     35 define i32 @myCall2_no_merge(i32 %in, i1 %d) {
     36 entry:
     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
     45 bb2:
     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
     55 bb3:
     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 
     63 define i32 @myCall2_w2(i32 %in, i1 %d) {
     64 entry:
     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
     74 bb2:
     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
     83 bb3:
     84   ret i32 0
     85 }
     86 ;YESCOLOR: subq  $208, %rsp
     87 ;NOCOLOR: subq  $400, %rsp
     88 
     89 
     90 
     91 
     92 define i32 @myCall_w4(i32 %in) {
     93 entry:
     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 
    126 define i32 @myCall2_w4(i32 %in) {
    127 entry:
    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
    149 bb2:
    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
    157 bb3:
    158   ret i32 0
    159 }
    160 
    161 
    162 ;YESCOLOR: subq  $144, %rsp
    163 ;NOCOLOR: subq  $272, %rsp
    164 
    165 
    166 define i32 @myCall2_noend(i32 %in, i1 %d) {
    167 entry:
    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
    177 bb2:
    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
    185 bb3:
    186   ret i32 0
    187 }
    188 
    189 ;YESCOLOR: subq  $144, %rsp
    190 ;NOCOLOR: subq  $272, %rsp
    191 define i32 @myCall2_noend2(i32 %in, i1 %d) {
    192 entry:
    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
    201 bb2:
    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
    210 bb3:
    211   ret i32 0
    212 }
    213 
    214 
    215 ;YESCOLOR: subq  $144, %rsp
    216 ;NOCOLOR: subq  $272, %rsp
    217 define i32 @myCall2_nostart(i32 %in, i1 %d) {
    218 entry:
    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
    227 bb2:
    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
    235 bb3:
    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
    242 define void @array_merge() nounwind ssp {
    243 entry:
    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
    267 define i32 @func_phi_lifetime(i32 %in, i1 %d) {
    268 entry:
    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 
    278 bb0:
    279   %I1 = bitcast [17 x i8*]* %a to i8*
    280   br label %bb2
    281 
    282 bb1:
    283   %I2 = bitcast [16 x i8*]* %a2 to i8*
    284   br label %bb2
    285 
    286 bb2:
    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
    296 bb3:
    297   ret i32 0
    298 }
    299 
    300 
    301 ;YESCOLOR: multi_region_bb
    302 ;NOCOLOR: multi_region_bb
    303 define void @multi_region_bb() nounwind ssp {
    304 entry:
    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 
    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 declare void @bar([100 x i32]* , [100 x i32]*) nounwind
    356 
    357 declare void @llvm.lifetime.start(i64, i8* nocapture) nounwind
    358 
    359 declare void @llvm.lifetime.end(i64, i8* nocapture) nounwind
    360 
    361  declare i32 @foo(i32, i8*)
    362 
    363