1// RUN: mlir-opt %s -pass-pipeline="builtin.module(func.func(test-print-liveness))" -split-input-file 2>&1 | FileCheck %s 2 3// CHECK-LABEL: Testing : func_empty 4func.func @func_empty() { 5 // CHECK: Block: 0 6 // CHECK-NEXT: LiveIn:{{ *$}} 7 // CHECK-NEXT: LiveOut:{{ *$}} 8 // CHECK-NEXT: BeginLivenessIntervals 9 // CHECK-NEXT: EndLivenessIntervals 10 // CHECK-NEXT: BeginCurrentlyLive 11 // CHECK-NEXT: EndCurrentlyLive 12 return 13} 14 15// ----- 16 17// CHECK-LABEL: Testing : func_simpleBranch 18func.func @func_simpleBranch(%arg0: i32, %arg1 : i32) -> i32 { 19 // CHECK: Block: 0 20 // CHECK-NEXT: LiveIn:{{ *$}} 21 // CHECK-NEXT: LiveOut: arg0@0 arg1@0 22 // CHECK-NEXT: BeginLivenessIntervals 23 // CHECK-NEXT: EndLivenessIntervals 24 // CHECK-NEXT: BeginCurrentlyLive 25 // CHECK: cf.br 26 // CHECK-SAME: arg0@0 arg1@0 27 // CHECK-NEXT: EndCurrentlyLive 28 cf.br ^exit 29^exit: 30 // CHECK: Block: 1 31 // CHECK-NEXT: LiveIn: arg0@0 arg1@0 32 // CHECK-NEXT: LiveOut:{{ *$}} 33 // CHECK-NEXT: BeginLivenessIntervals 34 // CHECK: val_2 35 // CHECK-NEXT: %0 = arith.addi 36 // CHECK-NEXT: return 37 // CHECK-NEXT: EndLivenessIntervals 38 // CHECK-NEXT: BeginCurrentlyLive 39 // CHECK: arith.addi 40 // CHECK-SAME: arg0@0 arg1@0 val_2 41 // CHECK: return 42 // CHECK-SAME: val_2 43 // CHECK-NEXT:EndCurrentlyLive 44 %result = arith.addi %arg0, %arg1 : i32 45 return %result : i32 46} 47 48// ----- 49 50// CHECK-LABEL: Testing : func_condBranch 51func.func @func_condBranch(%cond : i1, %arg1: i32, %arg2 : i32) -> i32 { 52 // CHECK: Block: 0 53 // CHECK-NEXT: LiveIn:{{ *$}} 54 // CHECK-NEXT: LiveOut: arg1@0 arg2@0 55 // CHECK-NEXT: BeginLivenessIntervals 56 // CHECK-NEXT: EndLivenessIntervals 57 // CHECK-NEXT: BeginCurrentlyLive 58 // CHECK: cf.cond_br 59 // CHECK-SAME: arg0@0 arg1@0 arg2@0 60 // CHECK-NEXT: EndCurrentlyLive 61 cf.cond_br %cond, ^bb1, ^bb2 62^bb1: 63 // CHECK: Block: 1 64 // CHECK-NEXT: LiveIn: arg1@0 arg2@0 65 // CHECK-NEXT: LiveOut: arg1@0 arg2@0 66 // CHECK: BeginCurrentlyLive 67 // CHECK: cf.br 68 // COM: arg0@0 had its last user in the previous block. 69 // CHECK-SAME: arg1@0 arg2@0 70 // CHECK-NEXT: EndCurrentlyLive 71 cf.br ^exit 72^bb2: 73 // CHECK: Block: 2 74 // CHECK-NEXT: LiveIn: arg1@0 arg2@0 75 // CHECK-NEXT: LiveOut: arg1@0 arg2@0 76 // CHECK: BeginCurrentlyLive 77 // CHECK: cf.br 78 // CHECK-SAME: arg1@0 arg2@0 79 // CHECK-NEXT: EndCurrentlyLive 80 cf.br ^exit 81^exit: 82 // CHECK: Block: 3 83 // CHECK-NEXT: LiveIn: arg1@0 arg2@0 84 // CHECK-NEXT: LiveOut:{{ *$}} 85 // CHECK-NEXT: BeginLivenessIntervals 86 // CHECK: val_3 87 // CHECK-NEXT: %0 = arith.addi 88 // CHECK-NEXT: return 89 // CHECK-NEXT: EndLivenessIntervals 90 // CHECK-NEXT: BeginCurrentlyLive 91 // CHECK: arith.addi 92 // CHECK-SAME: arg1@0 arg2@0 val_3 93 // CHECK: return 94 // CHECK-SAME: val_3 95 // CHECK-NEXT: EndCurrentlyLive 96 %result = arith.addi %arg1, %arg2 : i32 97 return %result : i32 98} 99 100// ----- 101 102// CHECK-LABEL: Testing : func_loop 103func.func @func_loop(%arg0 : i32, %arg1 : i32) -> i32 { 104 // CHECK: Block: 0 105 // CHECK-NEXT: LiveIn:{{ *$}} 106 // CHECK-NEXT: LiveOut: arg1@0 107 // CHECK: BeginCurrentlyLive 108 // CHECK: arith.constant 109 // CHECK-SAME: arg0@0 arg1@0 val_2 110 // CHECK: cf.br 111 // CHECK-SAME: arg0@0 arg1@0 val_2 112 // CHECK-NEXT: EndCurrentlyLive 113 %const0 = arith.constant 0 : i32 114 cf.br ^loopHeader(%const0, %arg0 : i32, i32) 115^loopHeader(%counter : i32, %i : i32): 116 // CHECK: Block: 1 117 // CHECK-NEXT: LiveIn: arg1@0 118 // CHECK-NEXT: LiveOut: arg1@0 arg0@1 119 // CHECK-NEXT: BeginLivenessIntervals 120 // CHECK-NEXT: val_5 121 // CHECK-NEXT: %2 = arith.cmpi 122 // CHECK-NEXT: cf.cond_br 123 // CHECK-NEXT: EndLivenessIntervals 124 // CHECK-NEXT: BeginCurrentlyLive 125 // CHECK: arith.cmpi 126 // CHECK-SAME: arg1@0 arg0@1 arg1@1 val_5 127 // CHECK: cf.cond_br 128 // CHECK-SAME: arg1@0 arg0@1 arg1@1 val_5 129 // CHECK-NEXT: EndCurrentlyLive 130 %lessThan = arith.cmpi slt, %counter, %arg1 : i32 131 cf.cond_br %lessThan, ^loopBody(%i : i32), ^exit(%i : i32) 132^loopBody(%val : i32): 133 // CHECK: Block: 2 134 // CHECK-NEXT: LiveIn: arg1@0 arg0@1 135 // CHECK-NEXT: LiveOut: arg1@0 136 // CHECK-NEXT: BeginLivenessIntervals 137 // CHECK-NEXT: val_7 138 // CHECK-NEXT: %c 139 // CHECK-NEXT: %4 = arith.addi 140 // CHECK-NEXT: %5 = arith.addi 141 // CHECK-NEXT: val_8 142 // CHECK-NEXT: %4 = arith.addi 143 // CHECK-NEXT: %5 = arith.addi 144 // CHECK-NEXT: cf.br 145 // CHECK: EndLivenessIntervals 146 // CHECK-NEXT: BeginCurrentlyLive 147 // CHECK: arith.constant 148 // CHECK-SAME: arg1@0 arg0@1 arg0@2 val_7 149 // CHECK: arith.addi 150 // CHECK-SAME: arg1@0 arg0@1 arg0@2 val_7 val_8 151 // CHECK: arith.addi 152 // CHECK-SAME: arg1@0 arg0@1 val_7 val_8 val_9 153 // CHECK: cf.br 154 // CHECK-SAME: arg1@0 val_8 val_9 155 // CHECK-NEXT: EndCurrentlyLive 156 %const1 = arith.constant 1 : i32 157 %inc = arith.addi %val, %const1 : i32 158 %inc2 = arith.addi %counter, %const1 : i32 159 cf.br ^loopHeader(%inc, %inc2 : i32, i32) 160^exit(%sum : i32): 161 // CHECK: Block: 3 162 // CHECK-NEXT: LiveIn: arg1@0 163 // CHECK-NEXT: LiveOut:{{ *$}} 164 // CHECK: BeginCurrentlyLive 165 // CHECK: arith.addi 166 // CHECK-SAME: arg1@0 arg0@3 val_11 167 // CHECK: return 168 // CHECK-SAME: val_11 169 // CHECK-NEXT: EndCurrentlyLive 170 %result = arith.addi %sum, %arg1 : i32 171 return %result : i32 172} 173 174// ----- 175 176// CHECK-LABEL: Testing : func_ranges 177func.func @func_ranges(%cond : i1, %arg1 : i32, %arg2 : i32, %arg3 : i32) -> i32 { 178 // CHECK: Block: 0 179 // CHECK-NEXT: LiveIn:{{ *$}} 180 // CHECK-NEXT: LiveOut: arg2@0 val_9 val_10 181 // CHECK-NEXT: BeginLivenessIntervals 182 // CHECK-NEXT: val_4 183 // CHECK-NEXT: %0 = arith.addi 184 // CHECK-NEXT: %c 185 // CHECK-NEXT: %1 = arith.addi 186 // CHECK-NEXT: %2 = arith.addi 187 // CHECK-NEXT: %3 = arith.muli 188 // CHECK-NEXT: val_5 189 // CHECK-NEXT: %c 190 // CHECK-NEXT: %1 = arith.addi 191 // CHECK-NEXT: %2 = arith.addi 192 // CHECK-NEXT: %3 = arith.muli 193 // CHECK-NEXT: %4 = arith.muli 194 // CHECK-NEXT: %5 = arith.addi 195 // CHECK-NEXT: val_6 196 // CHECK-NEXT: %1 = arith.addi 197 // CHECK-NEXT: %2 = arith.addi 198 // CHECK-NEXT: %3 = arith.muli 199 // CHECK-NEXT: val_7 200 // CHECK-NEXT: %2 = arith.addi 201 // CHECK-NEXT: %3 = arith.muli 202 // CHECK-NEXT: %4 = arith.muli 203 // CHECK: val_8 204 // CHECK-NEXT: %3 = arith.muli 205 // CHECK-NEXT: %4 = arith.muli 206 // CHECK-NEXT: val_9 207 // CHECK-NEXT: %4 = arith.muli 208 // CHECK-NEXT: %5 = arith.addi 209 // CHECK-NEXT: cf.cond_br 210 // CHECK-NEXT: %c 211 // CHECK-NEXT: %6 = arith.muli 212 // CHECK-NEXT: %7 = arith.muli 213 // CHECK-NEXT: %8 = arith.addi 214 // CHECK-NEXT: val_10 215 // CHECK-NEXT: %5 = arith.addi 216 // CHECK-NEXT: cf.cond_br 217 // CHECK-NEXT: %7 218 // CHECK: EndLivenessIntervals 219 // CHECK-NEXT: BeginCurrentlyLive 220 // CHECK: arith.addi 221 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg3@0 val_4 222 // CHECK: arith.constant 223 // CHECK-SAME: arg0@0 arg2@0 arg3@0 val_4 val_5 224 // CHECK: arith.addi 225 // CHECK-SAME: arg0@0 arg2@0 arg3@0 val_4 val_5 val_6 226 // CHECK: arith.addi 227 // CHECK-SAME: arg0@0 arg2@0 arg3@0 val_4 val_5 val_6 val_7 228 // CHECK: arith.muli 229 // CHECK-SAME: arg0@0 arg2@0 val_4 val_5 val_6 val_7 val_8 230 // CHECK: arith.muli 231 // CHECK-SAME: arg0@0 arg2@0 val_5 val_7 val_8 val_9 232 // CHECK: arith.addi 233 // CHECK-SAME: arg0@0 arg2@0 val_5 val_9 val_10 234 // CHECK: cf.cond_br 235 // CHECK-SAME: arg0@0 arg2@0 val_9 val_10 236 // CHECK-NEXT: EndCurrentlyLive 237 %0 = arith.addi %arg1, %arg2 : i32 238 %const1 = arith.constant 1 : i32 239 %1 = arith.addi %const1, %arg2 : i32 240 %2 = arith.addi %const1, %arg3 : i32 241 %3 = arith.muli %0, %1 : i32 242 %4 = arith.muli %3, %2 : i32 243 %5 = arith.addi %4, %const1 : i32 244 cf.cond_br %cond, ^bb1, ^bb2 245 246^bb1: 247 // CHECK: Block: 1 248 // CHECK-NEXT: LiveIn: arg2@0 val_9 249 // CHECK-NEXT: LiveOut: arg2@0 250 // CHECK: BeginCurrentlyLive 251 // CHECK: arith.constant 252 // CHECK-SAME: arg2@0 val_9 253 // CHECK: arith.muli 254 // CHECK-SAME: arg2@0 val_9 255 // CHECK: cf.br 256 // CHECK-SAME: arg2@0 257 // CHECK-NEXT: EndCurrentlyLive 258 %const4 = arith.constant 4 : i32 259 %6 = arith.muli %4, %const4 : i32 260 cf.br ^exit(%6 : i32) 261 262^bb2: 263 // CHECK: Block: 2 264 // CHECK-NEXT: LiveIn: arg2@0 val_9 val_10 265 // CHECK-NEXT: LiveOut: arg2@0 266 // CHECK: BeginCurrentlyLive 267 // CHECK: arith.muli 268 // CHECK-SAME: arg2@0 val_9 val_10 269 // CHECK: arith.addi 270 // CHECK-SAME: arg2@0 271 // CHECK: cf.br 272 // CHECK-SAME: arg2@0 273 // CHECK: EndCurrentlyLive 274 %7 = arith.muli %4, %5 : i32 275 %8 = arith.addi %4, %arg2 : i32 276 cf.br ^exit(%8 : i32) 277 278^exit(%sum : i32): 279 // CHECK: Block: 3 280 // CHECK-NEXT: LiveIn: arg2@0 281 // CHECK-NEXT: LiveOut:{{ *$}} 282 // CHECK: BeginCurrentlyLive 283 // CHECK: arith.addi 284 // CHECK-SAME: arg2@0 285 // CHECK: return 286 // CHECK-NOT: arg2@0 287 // CHECK: EndCurrentlyLive 288 %result = arith.addi %sum, %arg2 : i32 289 return %result : i32 290} 291 292// ----- 293 294// CHECK-LABEL: Testing : nested_region 295 296func.func @nested_region( 297 %arg0 : index, %arg1 : index, %arg2 : index, 298 %arg3 : i32, %arg4 : i32, %arg5 : i32, 299 %buffer : memref<i32>) -> i32 { 300 // CHECK: Block: 0 301 // CHECK-NEXT: LiveIn:{{ *$}} 302 // CHECK-NEXT: LiveOut:{{ *$}} 303 // CHECK-NEXT: BeginLivenessIntervals 304 // CHECK-NEXT: val_7 305 // CHECK-NEXT: %0 = arith.addi 306 // CHECK-NEXT: %1 = arith.addi 307 // CHECK-NEXT: scf.for 308 // CHECK: // %2 = arith.addi 309 // CHECK-NEXT: %3 = arith.addi 310 // CHECK-NEXT: val_8 311 // CHECK-NEXT: %1 = arith.addi 312 // CHECK-NEXT: scf.for 313 // CHECK: // func.return %1 314 // CHECK: EndLivenessIntervals 315 // CHECK-NEXT: BeginCurrentlyLive 316 // CHECK: arith.addi 317 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg3@0 arg4@0 arg5@0 arg6@0 val_7 318 // CHECK: arith.addi 319 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg4@0 arg5@0 arg6@0 val_7 val_8 320 // CHECK: scf.for 321 // CHECK-NEXT: arith.addi 322 // CHECK-NEXT: arith.addi 323 // CHECK-NEXT: memref.store 324 // CHECK-NEXT: arg5@0 arg6@0 val_7 val_8 325 // CHECK: return 326 // CHECK-SAME: val_8 327 // CHECK-NEXT: EndCurrentlyLive 328 %0 = arith.addi %arg3, %arg4 : i32 329 %1 = arith.addi %arg4, %arg5 : i32 330 scf.for %arg6 = %arg0 to %arg1 step %arg2 { 331 // CHECK: Block: 1 332 // CHECK-NEXT: LiveIn: arg5@0 arg6@0 val_7 333 // CHECK-NEXT: LiveOut:{{ *$}} 334 // CHECK: BeginCurrentlyLive 335 // CHECK-NEXT: arith.addi 336 // CHECK-SAME: arg5@0 arg6@0 val_7 arg0@1 val_10 337 // CHECK-NEXT: arith.addi 338 // CHECK-SAME: arg6@0 val_7 val_10 val_11 339 // CHECK-NEXT: memref.store 340 // CHECK-SAME: arg6@0 val_11 341 // CHECK-NEXT: EndCurrentlyLive 342 %2 = arith.addi %0, %arg5 : i32 343 %3 = arith.addi %2, %0 : i32 344 memref.store %3, %buffer[] : memref<i32> 345 } 346 return %1 : i32 347} 348 349// ----- 350 351// CHECK-LABEL: Testing : nested_region2 352 353func.func @nested_region2( 354 // CHECK: Block: 0 355 // CHECK-NEXT: LiveIn:{{ *$}} 356 // CHECK-NEXT: LiveOut:{{ *$}} 357 // CHECK-NEXT: BeginLivenessIntervals 358 // CHECK-NEXT: val_7 359 // CHECK-NEXT: %0 = arith.addi 360 // CHECK-NEXT: %1 = arith.addi 361 // CHECK-NEXT: scf.for 362 // CHECK: // %2 = arith.addi 363 // CHECK-NEXT: scf.for 364 // CHECK: // %3 = arith.addi 365 // CHECK-NEXT: val_8 366 // CHECK-NEXT: %1 = arith.addi 367 // CHECK-NEXT: scf.for 368 // CHECK: // func.return %1 369 // CHECK: EndLivenessIntervals 370 // CHECK-NEXT: BeginCurrentlyLive 371 // CHECK-NEXT: arith.addi 372 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg3@0 arg4@0 arg5@0 arg6@0 val_7 373 // CHECK-NEXT: arith.addi 374 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg4@0 arg5@0 arg6@0 val_7 val_8 375 // CHECK-NEXT: scf.for {{.*}} 376 // CHECK-NEXT: arith.addi 377 // CHECK-NEXT: scf.for {{.*}} { 378 // CHECK-NEXT: arith.addi 379 // CHECK-NEXT: memref.store 380 // CHECK-NEXT: } 381 // CHECK-NEXT: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7 val_8 382 // CHECK-NEXT: return 383 // CHECK-SAME: val_8 384 %arg0 : index, %arg1 : index, %arg2 : index, 385 %arg3 : i32, %arg4 : i32, %arg5 : i32, 386 %buffer : memref<i32>) -> i32 { 387 %0 = arith.addi %arg3, %arg4 : i32 388 %1 = arith.addi %arg4, %arg5 : i32 389 scf.for %arg6 = %arg0 to %arg1 step %arg2 { 390 // CHECK: Block: 1 391 // CHECK-NEXT: LiveIn: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7 392 // CHECK-NEXT: LiveOut:{{ *$}} 393 // CHECK-NEXT: BeginLivenessIntervals 394 // CHECK-NEXT: val_10 395 // CHECK-NEXT: %2 = arith.addi 396 // CHECK-NEXT: scf.for 397 // CHECK: // %3 = arith.addi 398 // CHECK: EndLivenessIntervals 399 // CHECK-NEXT: BeginCurrentlyLive 400 // CHECK-NEXT: arith.addi 401 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7 arg0@1 val_10 402 // CHECK-NEXT: scf.for {{.*}} 403 // CHECK-NEXT: arith.addi 404 // CHECK-NEXT: memref.store 405 // CHECK-NEXT: arg0@0 arg1@0 arg2@0 arg6@0 val_7 406 %2 = arith.addi %0, %arg5 : i32 407 scf.for %arg7 = %arg0 to %arg1 step %arg2 { 408 // CHECK: Block: 2 409 // CHECK: BeginCurrentlyLive 410 // CHECK-NEXT: arith.addi 411 // CHECK-SAME: arg6@0 val_7 val_10 arg0@2 val_12 412 // CHECK-NEXT: memref.store 413 // CHECK-SAME: arg6@0 val_12 414 // CHECK: EndCurrentlyLive 415 %3 = arith.addi %2, %0 : i32 416 memref.store %3, %buffer[] : memref<i32> 417 } 418 } 419 return %1 : i32 420} 421 422// ----- 423 424// CHECK-LABEL: Testing : nested_region3 425 426func.func @nested_region3( 427 // CHECK: Block: 0 428 // CHECK-NEXT: LiveIn:{{ *$}} 429 // CHECK-NEXT: LiveOut: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8 430 // CHECK-NEXT: BeginLivenessIntervals 431 // CHECK-NEXT: val_7 432 // CHECK-NEXT: %0 = arith.addi 433 // CHECK-NEXT: %1 = arith.addi 434 // CHECK-NEXT: scf.for 435 // CHECK: // cf.br ^bb1 436 // CHECK-NEXT: %2 = arith.addi 437 // CHECK-NEXT: scf.for 438 // CHECK: // %2 = arith.addi 439 // CHECK: EndLivenessIntervals 440 // CHECK-NEXT: BeginCurrentlyLive 441 // CHECK-NEXT: arith.addi 442 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg3@0 arg4@0 arg5@0 arg6@0 val_7 443 // CHECK-NEXT: arith.addi 444 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg4@0 arg5@0 arg6@0 val_7 val_8 445 // CHECK-NEXT: scf.for 446 // COM: Skipping the body of the scf.for... 447 // CHECK: arg0@0 arg1@0 arg2@0 arg5@0 arg6@0 val_7 val_8 448 // CHECK-NEXT: cf.br 449 // CHECK-SAME: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8 450 // CHECK-NEXT: EndCurrentlyLive 451 %arg0 : index, %arg1 : index, %arg2 : index, 452 %arg3 : i32, %arg4 : i32, %arg5 : i32, 453 %buffer : memref<i32>) -> i32 { 454 %0 = arith.addi %arg3, %arg4 : i32 455 %1 = arith.addi %arg4, %arg5 : i32 456 scf.for %arg6 = %arg0 to %arg1 step %arg2 { 457 // CHECK: Block: 1 458 // CHECK-NEXT: LiveIn: arg5@0 arg6@0 val_7 459 // CHECK-NEXT: LiveOut:{{ *$}} 460 // CHECK: BeginCurrentlyLive 461 // CHECK-NEXT: arith.addi 462 // CHECK-SAME: arg5@0 arg6@0 val_7 arg0@1 val_10 463 // CHECK-NEXT: memref.store 464 // CHECK-SAME: arg6@0 val_10 465 // CHECK-NEXT: EndCurrentlyLive 466 %2 = arith.addi %0, %arg5 : i32 467 memref.store %2, %buffer[] : memref<i32> 468 } 469 cf.br ^exit 470 471^exit: 472 // CHECK: Block: 2 473 // CHECK-NEXT: LiveIn: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8 474 // CHECK-NEXT: LiveOut:{{ *$}} 475 // CHECK: BeginCurrentlyLive 476 // CHECK: scf.for 477 // CHECK: arg0@0 arg1@0 arg2@0 arg6@0 val_7 val_8 478 // CHECK-NEXT: return 479 // CHECK-SAME: val_8 480 // CHECK-NEXT: EndCurrentlyLive 481 scf.for %arg7 = %arg0 to %arg1 step %arg2 { 482 // CHECK: Block: 3 483 // CHECK-NEXT: LiveIn: arg6@0 val_7 val_8 484 // CHECK-NEXT: LiveOut:{{ *$}} 485 // CHECK: BeginCurrentlyLive 486 // CHECK-NEXT: arith.addi 487 // CHECK-SAME: arg6@0 val_7 val_8 arg0@3 val_12 488 // CHECK-NEXT: memref.store 489 // CHECK-SAME: arg6@0 val_12 490 // CHECK-NEXT: EndCurrentlyLive 491 %2 = arith.addi %0, %1 : i32 492 memref.store %2, %buffer[] : memref<i32> 493 } 494 return %1 : i32 495} 496 497// ----- 498 499// CHECK-LABEL: Testing : nested_region4 500 501func.func @nested_region4(%arg0: index, %arg1: index, %arg2: index) { 502 // CHECK: Block: 0 503 // CHECK-NEXT: LiveIn:{{ *$}} 504 // CHECK-NEXT: LiveOut:{{ *$}} 505 506 // CHECK: {{^// +}}[[VAL3:[a-z0-9_]+]]{{ *:}} 507 // CHECK: {{^// +}}[[VAL4:[a-z0-9_]+]]{{ *:}} 508 %c0_i32 = arith.constant 0 : i32 509 %c1_i32 = arith.constant 1 : i32 510 511 %0 = scf.for %arg3 = %arg0 to %arg1 step %arg2 iter_args(%arg4 = %c0_i32) -> (i32) { 512 // CHECK: Block: 1 513 // CHECK-NEXT: LiveIn: [[VAL4]]{{ *$}} 514 // CHECK-NEXT: LiveOut:{{ *$}} 515 %1 = arith.addi %arg4, %c1_i32 : i32 516 scf.yield %1 : i32 517 } 518 return 519} 520