1// RUN: mlir-opt %s -pass-pipeline="builtin.module(func.func(test-print-dominance))" -split-input-file | FileCheck %s 2 3// CHECK-LABEL: Testing : func_condBranch 4func.func @func_condBranch(%cond : i1) { 5 cf.cond_br %cond, ^bb1, ^bb2 6^bb1: 7 cf.br ^exit 8^bb2: 9 cf.br ^exit 10^exit: 11 return 12} 13 14// CHECK: --- DominanceInfo --- 15// CHECK: Nearest(0, 0) = 0 16// CHECK: Nearest(0, 1) = 0 17// CHECK: Nearest(0, 2) = 0 18// CHECK: Nearest(0, 3) = 0 19// CHECK: Nearest(0, 4) = 4 20// CHECK: Nearest(1, 0) = 0 21// CHECK: Nearest(1, 1) = 1 22// CHECK: Nearest(1, 2) = 0 23// CHECK: Nearest(1, 3) = 0 24// CHECK: Nearest(1, 4) = 4 25// CHECK: Nearest(2, 0) = 0 26// CHECK: Nearest(2, 1) = 0 27// CHECK: Nearest(2, 2) = 2 28// CHECK: Nearest(2, 3) = 0 29// CHECK: Nearest(2, 4) = 4 30// CHECK: Nearest(3, 0) = 0 31// CHECK: Nearest(3, 1) = 0 32// CHECK: Nearest(3, 2) = 0 33// CHECK: Nearest(3, 3) = 3 34// CHECK: Nearest(3, 4) = 4 35// CHECK: Nearest(4, 0) = 4 36// CHECK: Nearest(4, 1) = 4 37// CHECK: Nearest(4, 2) = 4 38// CHECK: Nearest(4, 3) = 4 39// CHECK: Nearest(4, 4) = 4 40 41// CHECK: --- PostDominanceInfo --- 42// CHECK: Nearest(0, 0) = 0 43// CHECK: Nearest(0, 1) = 3 44// CHECK: Nearest(0, 2) = 3 45// CHECK: Nearest(0, 3) = 3 46// CHECK: Nearest(0, 4) = 4 47// CHECK: Nearest(1, 0) = 3 48// CHECK: Nearest(1, 1) = 1 49// CHECK: Nearest(1, 2) = 3 50// CHECK: Nearest(1, 3) = 3 51// CHECK: Nearest(1, 4) = 4 52// CHECK: Nearest(2, 0) = 3 53// CHECK: Nearest(2, 1) = 3 54// CHECK: Nearest(2, 2) = 2 55// CHECK: Nearest(2, 3) = 3 56// CHECK: Nearest(2, 4) = 4 57// CHECK: Nearest(3, 0) = 3 58// CHECK: Nearest(3, 1) = 3 59// CHECK: Nearest(3, 2) = 3 60// CHECK: Nearest(3, 3) = 3 61// CHECK: Nearest(3, 4) = 4 62// CHECK: Nearest(4, 0) = 4 63// CHECK: Nearest(4, 1) = 4 64// CHECK: Nearest(4, 2) = 4 65// CHECK: Nearest(4, 3) = 4 66// CHECK: Nearest(4, 4) = 4 67 68// CHECK: --- Block Dominance relationship --- 69// CHECK: dominates(0, 0) = 1 (properly = 0) 70// CHECK: dominates(0, 1) = 1 (properly = 1) 71// CHECK: dominates(0, 2) = 1 (properly = 1) 72// CHECK: dominates(0, 3) = 1 (properly = 1) 73// CHECK: dominates(0, 4) = 0 (properly = 0) 74// CHECK: dominates(1, 0) = 0 (properly = 0) 75// CHECK: dominates(1, 1) = 1 (properly = 0) 76// CHECK: dominates(1, 2) = 0 (properly = 0) 77// CHECK: dominates(1, 3) = 0 (properly = 0) 78// CHECK: dominates(1, 4) = 0 (properly = 0) 79// CHECK: dominates(2, 0) = 0 (properly = 0) 80// CHECK: dominates(2, 1) = 0 (properly = 0) 81// CHECK: dominates(2, 2) = 1 (properly = 0) 82// CHECK: dominates(2, 3) = 0 (properly = 0) 83// CHECK: dominates(2, 4) = 0 (properly = 0) 84// CHECK: dominates(3, 0) = 0 (properly = 0) 85// CHECK: dominates(3, 1) = 0 (properly = 0) 86// CHECK: dominates(3, 2) = 0 (properly = 0) 87// CHECK: dominates(3, 3) = 1 (properly = 0) 88// CHECK: dominates(3, 4) = 0 (properly = 0) 89// CHECK: dominates(4, 0) = 1 (properly = 1) 90// CHECK: dominates(4, 1) = 1 (properly = 1) 91// CHECK: dominates(4, 2) = 1 (properly = 1) 92// CHECK: dominates(4, 3) = 1 (properly = 1) 93// CHECK: dominates(4, 4) = 1 (properly = 1) 94 95// CHECK: --- Block PostDominance relationship --- 96// CHECK: postdominates(0, 0) = 1 (properly = 0) 97// CHECK: postdominates(0, 1) = 0 (properly = 0) 98// CHECK: postdominates(0, 2) = 0 (properly = 0) 99// CHECK: postdominates(0, 3) = 0 (properly = 0) 100// CHECK: postdominates(0, 4) = 0 (properly = 0) 101// CHECK: postdominates(1, 0) = 0 (properly = 0) 102// CHECK: postdominates(1, 1) = 1 (properly = 0) 103// CHECK: postdominates(1, 2) = 0 (properly = 0) 104// CHECK: postdominates(1, 3) = 0 (properly = 0) 105// CHECK: postdominates(1, 4) = 0 (properly = 0) 106// CHECK: postdominates(2, 0) = 0 (properly = 0) 107// CHECK: postdominates(2, 1) = 0 (properly = 0) 108// CHECK: postdominates(2, 2) = 1 (properly = 0) 109// CHECK: postdominates(2, 3) = 0 (properly = 0) 110// CHECK: postdominates(2, 4) = 0 (properly = 0) 111// CHECK: postdominates(3, 0) = 1 (properly = 1) 112// CHECK: postdominates(3, 1) = 1 (properly = 1) 113// CHECK: postdominates(3, 2) = 1 (properly = 1) 114// CHECK: postdominates(3, 3) = 1 (properly = 0) 115// CHECK: postdominates(3, 4) = 0 (properly = 0) 116// CHECK: postdominates(4, 0) = 1 (properly = 1) 117// CHECK: postdominates(4, 1) = 1 (properly = 1) 118// CHECK: postdominates(4, 2) = 1 (properly = 1) 119// CHECK: postdominates(4, 3) = 1 (properly = 1) 120// CHECK: postdominates(4, 4) = 1 (properly = 1) 121 122// CHECK: module attributes {test.block_ids = array<i64: 4>} 123// CHECK: func.func @func_condBranch({{.*}}) attributes {test.block_ids = array<i64: 0, 1, 2, 3>} 124 125// ----- 126 127// CHECK-LABEL: Testing : func_loop 128func.func @func_loop(%arg0 : i32, %arg1 : i32) { 129 cf.br ^loopHeader(%arg0 : i32) 130^loopHeader(%counter : i32): 131 %lessThan = arith.cmpi slt, %counter, %arg1 : i32 132 cf.cond_br %lessThan, ^loopBody, ^exit 133^loopBody: 134 %const0 = arith.constant 1 : i32 135 %inc = arith.addi %counter, %const0 : i32 136 cf.br ^loopHeader(%inc : i32) 137^exit: 138 return 139} 140 141// CHECK: --- DominanceInfo --- 142// CHECK: Nearest(0, 0) = 0 143// CHECK: Nearest(0, 1) = 0 144// CHECK: Nearest(0, 2) = 0 145// CHECK: Nearest(0, 3) = 0 146// CHECK: Nearest(0, 4) = 4 147// CHECK: Nearest(1, 0) = 0 148// CHECK: Nearest(1, 1) = 1 149// CHECK: Nearest(1, 2) = 1 150// CHECK: Nearest(1, 3) = 1 151// CHECK: Nearest(1, 4) = 4 152// CHECK: Nearest(2, 0) = 0 153// CHECK: Nearest(2, 1) = 1 154// CHECK: Nearest(2, 2) = 2 155// CHECK: Nearest(2, 3) = 1 156// CHECK: Nearest(2, 4) = 4 157// CHECK: Nearest(3, 0) = 0 158// CHECK: Nearest(3, 1) = 1 159// CHECK: Nearest(3, 2) = 1 160// CHECK: Nearest(3, 3) = 3 161// CHECK: Nearest(3, 4) = 4 162// CHECK: Nearest(4, 0) = 4 163// CHECK: Nearest(4, 1) = 4 164// CHECK: Nearest(4, 2) = 4 165// CHECK: Nearest(4, 3) = 4 166// CHECK: Nearest(4, 4) = 4 167 168// CHECK: --- PostDominanceInfo --- 169// CHECK: Nearest(0, 0) = 0 170// CHECK: Nearest(0, 1) = 1 171// CHECK: Nearest(0, 2) = 1 172// CHECK: Nearest(0, 3) = 3 173// CHECK: Nearest(0, 4) = 4 174// CHECK: Nearest(1, 0) = 1 175// CHECK: Nearest(1, 1) = 1 176// CHECK: Nearest(1, 2) = 1 177// CHECK: Nearest(1, 3) = 3 178// CHECK: Nearest(1, 4) = 4 179// CHECK: Nearest(2, 0) = 1 180// CHECK: Nearest(2, 1) = 1 181// CHECK: Nearest(2, 2) = 2 182// CHECK: Nearest(2, 3) = 3 183// CHECK: Nearest(2, 4) = 4 184// CHECK: Nearest(3, 0) = 3 185// CHECK: Nearest(3, 1) = 3 186// CHECK: Nearest(3, 2) = 3 187// CHECK: Nearest(3, 3) = 3 188// CHECK: Nearest(3, 4) = 4 189// CHECK: Nearest(4, 0) = 4 190// CHECK: Nearest(4, 1) = 4 191// CHECK: Nearest(4, 2) = 4 192// CHECK: Nearest(4, 3) = 4 193// CHECK: Nearest(4, 4) = 4 194 195// CHECK: --- Block Dominance relationship --- 196// CHECK: dominates(0, 0) = 1 (properly = 0) 197// CHECK: dominates(0, 1) = 1 (properly = 1) 198// CHECK: dominates(0, 2) = 1 (properly = 1) 199// CHECK: dominates(0, 3) = 1 (properly = 1) 200// CHECK: dominates(0, 4) = 0 (properly = 0) 201// CHECK: dominates(1, 0) = 0 (properly = 0) 202// CHECK: dominates(1, 1) = 1 (properly = 0) 203// CHECK: dominates(1, 2) = 1 (properly = 1) 204// CHECK: dominates(1, 3) = 1 (properly = 1) 205// CHECK: dominates(1, 4) = 0 (properly = 0) 206// CHECK: dominates(2, 0) = 0 (properly = 0) 207// CHECK: dominates(2, 1) = 0 (properly = 0) 208// CHECK: dominates(2, 2) = 1 (properly = 0) 209// CHECK: dominates(2, 3) = 0 (properly = 0) 210// CHECK: dominates(2, 4) = 0 (properly = 0) 211// CHECK: dominates(3, 0) = 0 (properly = 0) 212// CHECK: dominates(3, 1) = 0 (properly = 0) 213// CHECK: dominates(3, 2) = 0 (properly = 0) 214// CHECK: dominates(3, 3) = 1 (properly = 0) 215// CHECK: dominates(3, 4) = 0 (properly = 0) 216// CHECK: dominates(4, 0) = 1 (properly = 1) 217// CHECK: dominates(4, 1) = 1 (properly = 1) 218// CHECK: dominates(4, 2) = 1 (properly = 1) 219// CHECK: dominates(4, 3) = 1 (properly = 1) 220// CHECK: dominates(4, 4) = 1 (properly = 1) 221 222// CHECK: --- Block PostDominance relationship --- 223// CHECK: postdominates(0, 0) = 1 (properly = 0) 224// CHECK: postdominates(0, 1) = 0 (properly = 0) 225// CHECK: postdominates(0, 2) = 0 (properly = 0) 226// CHECK: postdominates(0, 3) = 0 (properly = 0) 227// CHECK: postdominates(0, 4) = 0 (properly = 0) 228// CHECK: postdominates(1, 0) = 1 (properly = 1) 229// CHECK: postdominates(1, 1) = 1 (properly = 0) 230// CHECK: postdominates(1, 2) = 1 (properly = 1) 231// CHECK: postdominates(1, 3) = 0 (properly = 0) 232// CHECK: postdominates(1, 4) = 0 (properly = 0) 233// CHECK: postdominates(2, 0) = 0 (properly = 0) 234// CHECK: postdominates(2, 1) = 0 (properly = 0) 235// CHECK: postdominates(2, 2) = 1 (properly = 0) 236// CHECK: postdominates(2, 3) = 0 (properly = 0) 237// CHECK: postdominates(2, 4) = 0 (properly = 0) 238// CHECK: postdominates(3, 0) = 1 (properly = 1) 239// CHECK: postdominates(3, 1) = 1 (properly = 1) 240// CHECK: postdominates(3, 2) = 1 (properly = 1) 241// CHECK: postdominates(3, 3) = 1 (properly = 0) 242// CHECK: postdominates(3, 4) = 0 (properly = 0) 243// CHECK: postdominates(4, 0) = 1 (properly = 1) 244// CHECK: postdominates(4, 1) = 1 (properly = 1) 245// CHECK: postdominates(4, 2) = 1 (properly = 1) 246// CHECK: postdominates(4, 3) = 1 (properly = 1) 247// CHECK: postdominates(4, 4) = 1 (properly = 1) 248 249// CHECK: module attributes {test.block_ids = array<i64: 4>} 250// CHECK: func.func @func_loop({{.*}}) attributes {test.block_ids = array<i64: 0, 1, 2, 3>} 251 252// ----- 253 254// CHECK-LABEL: Testing : nested_region 255func.func @nested_region(%arg0 : index, %arg1 : index, %arg2 : index) { 256 scf.for %arg3 = %arg0 to %arg1 step %arg2 { } 257 return 258} 259 260// CHECK: --- DominanceInfo --- 261// CHECK: Nearest(0, 0) = 0 262// CHECK: Nearest(0, 1) = 1 263// CHECK: Nearest(0, 2) = 2 264// CHECK: Nearest(1, 0) = 1 265// CHECK: Nearest(1, 1) = 1 266// CHECK: Nearest(1, 2) = 2 267// CHECK: Nearest(2, 0) = 2 268// CHECK: Nearest(2, 1) = 2 269// CHECK: Nearest(2, 2) = 2 270 271// CHECK: --- PostDominanceInfo --- 272// CHECK: Nearest(0, 0) = 0 273// CHECK: Nearest(0, 1) = 1 274// CHECK: Nearest(0, 2) = 2 275// CHECK: Nearest(1, 0) = 1 276// CHECK: Nearest(1, 1) = 1 277// CHECK: Nearest(1, 2) = 2 278// CHECK: Nearest(2, 0) = 2 279// CHECK: Nearest(2, 1) = 2 280// CHECK: Nearest(2, 2) = 2 281 282// CHECK: --- Block Dominance relationship --- 283// CHECK: dominates(0, 0) = 1 (properly = 0) 284// CHECK: dominates(0, 1) = 0 (properly = 0) 285// CHECK: dominates(0, 2) = 0 (properly = 0) 286// CHECK: dominates(1, 0) = 1 (properly = 1) 287// CHECK: dominates(1, 1) = 1 (properly = 0) 288// CHECK: dominates(1, 2) = 0 (properly = 0) 289// CHECK: dominates(2, 0) = 1 (properly = 1) 290// CHECK: dominates(2, 1) = 1 (properly = 1) 291// CHECK: dominates(2, 2) = 1 (properly = 1) 292 293// CHECK: --- Block PostDominance relationship --- 294// CHECK: postdominates(0, 0) = 1 (properly = 0) 295// CHECK: postdominates(0, 1) = 0 (properly = 0) 296// CHECK: postdominates(0, 2) = 0 (properly = 0) 297// CHECK: postdominates(1, 0) = 1 (properly = 1) 298// CHECK: postdominates(1, 1) = 1 (properly = 0) 299// CHECK: postdominates(1, 2) = 0 (properly = 0) 300// CHECK: postdominates(2, 0) = 1 (properly = 1) 301// CHECK: postdominates(2, 1) = 1 (properly = 1) 302// CHECK: postdominates(2, 2) = 1 (properly = 1) 303 304// CHECK: module attributes {test.block_ids = array<i64: 2>} { 305// CHECK: func.func @nested_region({{.*}}) attributes {test.block_ids = array<i64: 1>} { 306// CHECK: scf.for {{.*}} { 307// CHECK: } {test.block_ids = array<i64: 0>} 308// CHECK: return 309// CHECK: } 310// CHECK: } 311 312// ----- 313 314// CHECK-LABEL: Testing : nested_region2 315func.func @nested_region2(%arg0 : index, %arg1 : index, %arg2 : index) { 316 scf.for %arg3 = %arg0 to %arg1 step %arg2 { 317 scf.for %arg4 = %arg0 to %arg1 step %arg2 { 318 scf.for %arg5 = %arg0 to %arg1 step %arg2 { } 319 } 320 } 321 return 322} 323 324// CHECK: --- DominanceInfo --- 325// CHECK: Nearest(0, 0) = 0 326// CHECK: Nearest(0, 1) = 1 327// CHECK: Nearest(0, 2) = 2 328// CHECK: Nearest(0, 3) = 3 329// CHECK: Nearest(0, 4) = 4 330// CHECK: Nearest(1, 0) = 1 331// CHECK: Nearest(1, 1) = 1 332// CHECK: Nearest(1, 2) = 2 333// CHECK: Nearest(1, 3) = 3 334// CHECK: Nearest(1, 4) = 4 335// CHECK: Nearest(2, 0) = 2 336// CHECK: Nearest(2, 1) = 2 337// CHECK: Nearest(2, 2) = 2 338// CHECK: Nearest(2, 3) = 3 339// CHECK: Nearest(2, 4) = 4 340// CHECK: Nearest(3, 0) = 3 341// CHECK: Nearest(3, 1) = 3 342// CHECK: Nearest(3, 2) = 3 343// CHECK: Nearest(3, 3) = 3 344// CHECK: Nearest(3, 4) = 4 345// CHECK: Nearest(4, 0) = 4 346// CHECK: Nearest(4, 1) = 4 347// CHECK: Nearest(4, 2) = 4 348// CHECK: Nearest(4, 3) = 4 349// CHECK: Nearest(4, 4) = 4 350 351// CHECK: --- PostDominanceInfo --- 352// CHECK: Nearest(0, 0) = 0 353// CHECK: Nearest(0, 1) = 1 354// CHECK: Nearest(0, 2) = 2 355// CHECK: Nearest(0, 3) = 3 356// CHECK: Nearest(0, 4) = 4 357// CHECK: Nearest(1, 0) = 1 358// CHECK: Nearest(1, 1) = 1 359// CHECK: Nearest(1, 2) = 2 360// CHECK: Nearest(1, 3) = 3 361// CHECK: Nearest(1, 4) = 4 362// CHECK: Nearest(2, 0) = 2 363// CHECK: Nearest(2, 1) = 2 364// CHECK: Nearest(2, 2) = 2 365// CHECK: Nearest(2, 3) = 3 366// CHECK: Nearest(2, 4) = 4 367// CHECK: Nearest(3, 0) = 3 368// CHECK: Nearest(3, 1) = 3 369// CHECK: Nearest(3, 2) = 3 370// CHECK: Nearest(3, 3) = 3 371// CHECK: Nearest(3, 4) = 4 372// CHECK: Nearest(4, 0) = 4 373// CHECK: Nearest(4, 1) = 4 374// CHECK: Nearest(4, 2) = 4 375// CHECK: Nearest(4, 3) = 4 376// CHECK: Nearest(4, 4) = 4 377 378// CHECK: --- Block Dominance relationship --- 379// CHECK: dominates(0, 0) = 1 (properly = 0) 380// CHECK: dominates(0, 1) = 0 (properly = 0) 381// CHECK: dominates(0, 2) = 0 (properly = 0) 382// CHECK: dominates(0, 3) = 0 (properly = 0) 383// CHECK: dominates(0, 4) = 0 (properly = 0) 384// CHECK: dominates(1, 0) = 1 (properly = 1) 385// CHECK: dominates(1, 1) = 1 (properly = 0) 386// CHECK: dominates(1, 2) = 0 (properly = 0) 387// CHECK: dominates(1, 3) = 0 (properly = 0) 388// CHECK: dominates(1, 4) = 0 (properly = 0) 389// CHECK: dominates(2, 0) = 1 (properly = 1) 390// CHECK: dominates(2, 1) = 1 (properly = 1) 391// CHECK: dominates(2, 2) = 1 (properly = 0) 392// CHECK: dominates(2, 3) = 0 (properly = 0) 393// CHECK: dominates(2, 4) = 0 (properly = 0) 394// CHECK: dominates(3, 0) = 1 (properly = 1) 395// CHECK: dominates(3, 1) = 1 (properly = 1) 396// CHECK: dominates(3, 2) = 1 (properly = 1) 397// CHECK: dominates(3, 3) = 1 (properly = 0) 398// CHECK: dominates(3, 4) = 0 (properly = 0) 399// CHECK: dominates(4, 0) = 1 (properly = 1) 400// CHECK: dominates(4, 1) = 1 (properly = 1) 401// CHECK: dominates(4, 2) = 1 (properly = 1) 402// CHECK: dominates(4, 3) = 1 (properly = 1) 403// CHECK: dominates(4, 4) = 1 (properly = 1) 404 405// CHECK: --- Block PostDominance relationship --- 406// CHECK: postdominates(0, 0) = 1 (properly = 0) 407// CHECK: postdominates(0, 1) = 0 (properly = 0) 408// CHECK: postdominates(0, 2) = 0 (properly = 0) 409// CHECK: postdominates(0, 3) = 0 (properly = 0) 410// CHECK: postdominates(0, 4) = 0 (properly = 0) 411// CHECK: postdominates(1, 0) = 1 (properly = 1) 412// CHECK: postdominates(1, 1) = 1 (properly = 0) 413// CHECK: postdominates(1, 2) = 0 (properly = 0) 414// CHECK: postdominates(1, 3) = 0 (properly = 0) 415// CHECK: postdominates(1, 4) = 0 (properly = 0) 416// CHECK: postdominates(2, 0) = 1 (properly = 1) 417// CHECK: postdominates(2, 1) = 1 (properly = 1) 418// CHECK: postdominates(2, 2) = 1 (properly = 0) 419// CHECK: postdominates(2, 3) = 0 (properly = 0) 420// CHECK: postdominates(2, 4) = 0 (properly = 0) 421// CHECK: postdominates(3, 0) = 1 (properly = 1) 422// CHECK: postdominates(3, 1) = 1 (properly = 1) 423// CHECK: postdominates(3, 2) = 1 (properly = 1) 424// CHECK: postdominates(3, 3) = 1 (properly = 0) 425// CHECK: postdominates(3, 4) = 0 (properly = 0) 426// CHECK: postdominates(4, 0) = 1 (properly = 1) 427// CHECK: postdominates(4, 1) = 1 (properly = 1) 428// CHECK: postdominates(4, 2) = 1 (properly = 1) 429// CHECK: postdominates(4, 3) = 1 (properly = 1) 430// CHECK: postdominates(4, 4) = 1 (properly = 1) 431 432// CHECK: module attributes {test.block_ids = array<i64: 4>} { 433// CHECK: func.func @nested_region2({{.*}}) attributes {test.block_ids = array<i64: 3>} { 434// CHECK: scf.for {{.*}} { 435// CHECK: scf.for {{.*}} { 436// CHECK: scf.for {{.*}} { 437// CHECK: } {test.block_ids = array<i64: 0>} 438// CHECK: } {test.block_ids = array<i64: 1>} 439// CHECK: } {test.block_ids = array<i64: 2>} 440// CHECK: return 441// CHECK: } 442// CHECK: } 443 444// ----- 445 446// CHECK-LABEL: Testing : func_loop_nested_region 447func.func @func_loop_nested_region( 448 %arg0 : i32, 449 %arg1 : i32, 450 %arg2 : index, 451 %arg3 : index, 452 %arg4 : index) { 453 cf.br ^loopHeader(%arg0 : i32) 454^loopHeader(%counter : i32): 455 %lessThan = arith.cmpi slt, %counter, %arg1 : i32 456 cf.cond_br %lessThan, ^loopBody, ^exit 457^loopBody: 458 %const0 = arith.constant 1 : i32 459 %inc = arith.addi %counter, %const0 : i32 460 scf.for %arg5 = %arg2 to %arg3 step %arg4 { 461 scf.for %arg6 = %arg2 to %arg3 step %arg4 { } 462 } 463 cf.br ^loopHeader(%inc : i32) 464^exit: 465 return 466} 467 468// CHECK: --- DominanceInfo --- 469// CHECK: Nearest(0, 0) = 0 470// CHECK: Nearest(0, 1) = 0 471// CHECK: Nearest(0, 2) = 0 472// CHECK: Nearest(0, 3) = 0 473// CHECK: Nearest(0, 4) = 0 474// CHECK: Nearest(0, 5) = 0 475// CHECK: Nearest(0, 6) = 6 476// CHECK: Nearest(1, 0) = 0 477// CHECK: Nearest(1, 1) = 1 478// CHECK: Nearest(1, 2) = 1 479// CHECK: Nearest(1, 3) = 1 480// CHECK: Nearest(1, 4) = 1 481// CHECK: Nearest(1, 5) = 1 482// CHECK: Nearest(1, 6) = 6 483// CHECK: Nearest(2, 0) = 0 484// CHECK: Nearest(2, 1) = 1 485// CHECK: Nearest(2, 2) = 2 486// CHECK: Nearest(2, 3) = 2 487// CHECK: Nearest(2, 4) = 2 488// CHECK: Nearest(2, 5) = 1 489// CHECK: Nearest(2, 6) = 6 490// CHECK: Nearest(3, 0) = 0 491// CHECK: Nearest(3, 1) = 1 492// CHECK: Nearest(3, 2) = 2 493// CHECK: Nearest(3, 3) = 3 494// CHECK: Nearest(3, 4) = 4 495// CHECK: Nearest(3, 5) = 1 496// CHECK: Nearest(3, 6) = 6 497// CHECK: Nearest(4, 0) = 0 498// CHECK: Nearest(4, 1) = 1 499// CHECK: Nearest(4, 2) = 2 500// CHECK: Nearest(4, 3) = 4 501// CHECK: Nearest(4, 4) = 4 502// CHECK: Nearest(4, 5) = 1 503// CHECK: Nearest(4, 6) = 6 504// CHECK: Nearest(5, 0) = 0 505// CHECK: Nearest(5, 1) = 1 506// CHECK: Nearest(5, 2) = 1 507// CHECK: Nearest(5, 3) = 1 508// CHECK: Nearest(5, 4) = 1 509// CHECK: Nearest(5, 5) = 5 510// CHECK: Nearest(5, 6) = 6 511// CHECK: Nearest(6, 0) = 6 512// CHECK: Nearest(6, 1) = 6 513// CHECK: Nearest(6, 2) = 6 514// CHECK: Nearest(6, 3) = 6 515// CHECK: Nearest(6, 4) = 6 516// CHECK: Nearest(6, 5) = 6 517// CHECK: Nearest(6, 6) = 6 518 519// CHECK: --- PostDominanceInfo --- 520// CHECK: Nearest(0, 0) = 0 521// CHECK: Nearest(0, 1) = 1 522// CHECK: Nearest(0, 2) = 1 523// CHECK: Nearest(0, 3) = 1 524// CHECK: Nearest(0, 4) = 1 525// CHECK: Nearest(0, 5) = 5 526// CHECK: Nearest(0, 6) = 6 527// CHECK: Nearest(1, 0) = 1 528// CHECK: Nearest(1, 1) = 1 529// CHECK: Nearest(1, 2) = 1 530// CHECK: Nearest(1, 3) = 1 531// CHECK: Nearest(1, 4) = 1 532// CHECK: Nearest(1, 5) = 5 533// CHECK: Nearest(1, 6) = 6 534// CHECK: Nearest(2, 0) = 1 535// CHECK: Nearest(2, 1) = 1 536// CHECK: Nearest(2, 2) = 2 537// CHECK: Nearest(2, 3) = 2 538// CHECK: Nearest(2, 4) = 2 539// CHECK: Nearest(2, 5) = 5 540// CHECK: Nearest(2, 6) = 6 541// CHECK: Nearest(3, 0) = 1 542// CHECK: Nearest(3, 1) = 1 543// CHECK: Nearest(3, 2) = 2 544// CHECK: Nearest(3, 3) = 3 545// CHECK: Nearest(3, 4) = 4 546// CHECK: Nearest(3, 5) = 5 547// CHECK: Nearest(3, 6) = 6 548// CHECK: Nearest(4, 0) = 1 549// CHECK: Nearest(4, 1) = 1 550// CHECK: Nearest(4, 2) = 2 551// CHECK: Nearest(4, 3) = 4 552// CHECK: Nearest(4, 4) = 4 553// CHECK: Nearest(4, 5) = 5 554// CHECK: Nearest(4, 6) = 6 555// CHECK: Nearest(5, 0) = 5 556// CHECK: Nearest(5, 1) = 5 557// CHECK: Nearest(5, 2) = 5 558// CHECK: Nearest(5, 3) = 5 559// CHECK: Nearest(5, 4) = 5 560// CHECK: Nearest(5, 5) = 5 561// CHECK: Nearest(5, 6) = 6 562// CHECK: Nearest(6, 0) = 6 563// CHECK: Nearest(6, 1) = 6 564// CHECK: Nearest(6, 2) = 6 565// CHECK: Nearest(6, 3) = 6 566// CHECK: Nearest(6, 4) = 6 567// CHECK: Nearest(6, 5) = 6 568// CHECK: Nearest(6, 6) = 6 569 570// CHECK: --- Block Dominance relationship --- 571// CHECK: dominates(0, 0) = 1 (properly = 0) 572// CHECK: dominates(0, 1) = 1 (properly = 1) 573// CHECK: dominates(0, 2) = 1 (properly = 1) 574// CHECK: dominates(0, 3) = 1 (properly = 1) 575// CHECK: dominates(0, 4) = 1 (properly = 1) 576// CHECK: dominates(0, 5) = 1 (properly = 1) 577// CHECK: dominates(0, 6) = 0 (properly = 0) 578// CHECK: dominates(1, 0) = 0 (properly = 0) 579// CHECK: dominates(1, 1) = 1 (properly = 0) 580// CHECK: dominates(1, 2) = 1 (properly = 1) 581// CHECK: dominates(1, 3) = 1 (properly = 1) 582// CHECK: dominates(1, 4) = 1 (properly = 1) 583// CHECK: dominates(1, 5) = 1 (properly = 1) 584// CHECK: dominates(1, 6) = 0 (properly = 0) 585// CHECK: dominates(2, 0) = 0 (properly = 0) 586// CHECK: dominates(2, 1) = 0 (properly = 0) 587// CHECK: dominates(2, 2) = 1 (properly = 0) 588// CHECK: dominates(2, 3) = 1 (properly = 1) 589// CHECK: dominates(2, 4) = 1 (properly = 1) 590// CHECK: dominates(2, 5) = 0 (properly = 0) 591// CHECK: dominates(2, 6) = 0 (properly = 0) 592// CHECK: dominates(3, 0) = 0 (properly = 0) 593// CHECK: dominates(3, 1) = 0 (properly = 0) 594// CHECK: dominates(3, 2) = 0 (properly = 0) 595// CHECK: dominates(3, 3) = 1 (properly = 0) 596// CHECK: dominates(3, 4) = 0 (properly = 0) 597// CHECK: dominates(3, 5) = 0 (properly = 0) 598// CHECK: dominates(3, 6) = 0 (properly = 0) 599// CHECK: dominates(4, 0) = 0 (properly = 0) 600// CHECK: dominates(4, 1) = 0 (properly = 0) 601// CHECK: dominates(4, 2) = 0 (properly = 0) 602// CHECK: dominates(4, 3) = 1 (properly = 1) 603// CHECK: dominates(4, 4) = 1 (properly = 0) 604// CHECK: dominates(4, 5) = 0 (properly = 0) 605// CHECK: dominates(4, 6) = 0 (properly = 0) 606// CHECK: dominates(5, 0) = 0 (properly = 0) 607// CHECK: dominates(5, 1) = 0 (properly = 0) 608// CHECK: dominates(5, 2) = 0 (properly = 0) 609// CHECK: dominates(5, 3) = 0 (properly = 0) 610// CHECK: dominates(5, 4) = 0 (properly = 0) 611// CHECK: dominates(5, 5) = 1 (properly = 0) 612// CHECK: dominates(5, 6) = 0 (properly = 0) 613// CHECK: dominates(6, 0) = 1 (properly = 1) 614// CHECK: dominates(6, 1) = 1 (properly = 1) 615// CHECK: dominates(6, 2) = 1 (properly = 1) 616// CHECK: dominates(6, 3) = 1 (properly = 1) 617// CHECK: dominates(6, 4) = 1 (properly = 1) 618// CHECK: dominates(6, 5) = 1 (properly = 1) 619// CHECK: dominates(6, 6) = 1 (properly = 1) 620 621// CHECK: --- Block PostDominance relationship --- 622// CHECK: postdominates(0, 0) = 1 (properly = 0) 623// CHECK: postdominates(0, 1) = 0 (properly = 0) 624// CHECK: postdominates(0, 2) = 0 (properly = 0) 625// CHECK: postdominates(0, 3) = 0 (properly = 0) 626// CHECK: postdominates(0, 4) = 0 (properly = 0) 627// CHECK: postdominates(0, 5) = 0 (properly = 0) 628// CHECK: postdominates(0, 6) = 0 (properly = 0) 629// CHECK: postdominates(1, 0) = 1 (properly = 1) 630// CHECK: postdominates(1, 1) = 1 (properly = 0) 631// CHECK: postdominates(1, 2) = 1 (properly = 1) 632// CHECK: postdominates(1, 3) = 1 (properly = 1) 633// CHECK: postdominates(1, 4) = 1 (properly = 1) 634// CHECK: postdominates(1, 5) = 0 (properly = 0) 635// CHECK: postdominates(1, 6) = 0 (properly = 0) 636// CHECK: postdominates(2, 0) = 0 (properly = 0) 637// CHECK: postdominates(2, 1) = 0 (properly = 0) 638// CHECK: postdominates(2, 2) = 1 (properly = 0) 639// CHECK: postdominates(2, 3) = 1 (properly = 1) 640// CHECK: postdominates(2, 4) = 1 (properly = 1) 641// CHECK: postdominates(2, 5) = 0 (properly = 0) 642// CHECK: postdominates(2, 6) = 0 (properly = 0) 643// CHECK: postdominates(3, 0) = 0 (properly = 0) 644// CHECK: postdominates(3, 1) = 0 (properly = 0) 645// CHECK: postdominates(3, 2) = 0 (properly = 0) 646// CHECK: postdominates(3, 3) = 1 (properly = 0) 647// CHECK: postdominates(3, 4) = 0 (properly = 0) 648// CHECK: postdominates(3, 5) = 0 (properly = 0) 649// CHECK: postdominates(3, 6) = 0 (properly = 0) 650// CHECK: postdominates(4, 0) = 0 (properly = 0) 651// CHECK: postdominates(4, 1) = 0 (properly = 0) 652// CHECK: postdominates(4, 2) = 0 (properly = 0) 653// CHECK: postdominates(4, 3) = 1 (properly = 1) 654// CHECK: postdominates(4, 4) = 1 (properly = 0) 655// CHECK: postdominates(4, 5) = 0 (properly = 0) 656// CHECK: postdominates(4, 6) = 0 (properly = 0) 657// CHECK: postdominates(5, 0) = 1 (properly = 1) 658// CHECK: postdominates(5, 1) = 1 (properly = 1) 659// CHECK: postdominates(5, 2) = 1 (properly = 1) 660// CHECK: postdominates(5, 3) = 1 (properly = 1) 661// CHECK: postdominates(5, 4) = 1 (properly = 1) 662// CHECK: postdominates(5, 5) = 1 (properly = 0) 663// CHECK: postdominates(5, 6) = 0 (properly = 0) 664// CHECK: postdominates(6, 0) = 1 (properly = 1) 665// CHECK: postdominates(6, 1) = 1 (properly = 1) 666// CHECK: postdominates(6, 2) = 1 (properly = 1) 667// CHECK: postdominates(6, 3) = 1 (properly = 1) 668// CHECK: postdominates(6, 4) = 1 (properly = 1) 669// CHECK: postdominates(6, 5) = 1 (properly = 1) 670// CHECK: postdominates(6, 6) = 1 (properly = 1) 671 672// CHECK: module attributes {test.block_ids = array<i64: 6>} { 673// CHECK: func.func @func_loop_nested_region({{.*}}) attributes {test.block_ids = array<i64: 0, 1, 2, 5>} { 674// CHECK: ^{{.*}} 675// CHECK: ^{{.*}} 676// CHECK: scf.for {{.*}} { 677// CHECK: scf.for {{.*}} { 678// CHECK: } {test.block_ids = array<i64: 3>} 679// CHECK: } {test.block_ids = array<i64: 4>} 680// CHECK: ^{{.*}} 681// CHECK: } 682// CHECK: } 683