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