1// RUN: mlir-opt %s -test-print-dominance -split-input-file 2>&1 | FileCheck %s 2 3// CHECK-LABEL: Testing : func_condBranch 4func @func_condBranch(%cond : i1) { 5 cond_br %cond, ^bb1, ^bb2 6^bb1: 7 br ^exit 8^bb2: 9 br ^exit 10^exit: 11 return 12} 13// CHECK-LABEL: --- DominanceInfo --- 14// CHECK-NEXT: Nearest(0, 0) = 0 15// CHECK-NEXT: Nearest(0, 1) = 0 16// CHECK-NEXT: Nearest(0, 2) = 0 17// CHECK-NEXT: Nearest(0, 3) = 0 18// CHECK: Nearest(1, 0) = 0 19// CHECK-NEXT: Nearest(1, 1) = 1 20// CHECK-NEXT: Nearest(1, 2) = 0 21// CHECK-NEXT: Nearest(1, 3) = 0 22// CHECK: Nearest(2, 0) = 0 23// CHECK-NEXT: Nearest(2, 1) = 0 24// CHECK-NEXT: Nearest(2, 2) = 2 25// CHECK-NEXT: Nearest(2, 3) = 0 26// CHECK: Nearest(3, 0) = 0 27// CHECK-NEXT: Nearest(3, 1) = 0 28// CHECK-NEXT: Nearest(3, 2) = 0 29// CHECK-NEXT: Nearest(3, 3) = 3 30// CHECK-LABEL: --- PostDominanceInfo --- 31// CHECK-NEXT: Nearest(0, 0) = 0 32// CHECK-NEXT: Nearest(0, 1) = 3 33// CHECK-NEXT: Nearest(0, 2) = 3 34// CHECK-NEXT: Nearest(0, 3) = 3 35// CHECK: Nearest(1, 0) = 3 36// CHECK-NEXT: Nearest(1, 1) = 1 37// CHECK-NEXT: Nearest(1, 2) = 3 38// CHECK-NEXT: Nearest(1, 3) = 3 39// CHECK: Nearest(2, 0) = 3 40// CHECK-NEXT: Nearest(2, 1) = 3 41// CHECK-NEXT: Nearest(2, 2) = 2 42// CHECK-NEXT: Nearest(2, 3) = 3 43// CHECK: Nearest(3, 0) = 3 44// CHECK-NEXT: Nearest(3, 1) = 3 45// CHECK-NEXT: Nearest(3, 2) = 3 46// CHECK-NEXT: Nearest(3, 3) = 3 47 48// ----- 49 50// CHECK-LABEL: Testing : func_loop 51func @func_loop(%arg0 : i32, %arg1 : i32) { 52 br ^loopHeader(%arg0 : i32) 53^loopHeader(%counter : i32): 54 %lessThan = cmpi slt, %counter, %arg1 : i32 55 cond_br %lessThan, ^loopBody, ^exit 56^loopBody: 57 %const0 = constant 1 : i32 58 %inc = addi %counter, %const0 : i32 59 br ^loopHeader(%inc : i32) 60^exit: 61 return 62} 63// CHECK-LABEL: --- DominanceInfo --- 64// CHECK: Nearest(1, 0) = 0 65// CHECK-NEXT: Nearest(1, 1) = 1 66// CHECK-NEXT: Nearest(1, 2) = 1 67// CHECK-NEXT: Nearest(1, 3) = 1 68// CHECK: Nearest(2, 0) = 0 69// CHECK-NEXT: Nearest(2, 1) = 1 70// CHECK-NEXT: Nearest(2, 2) = 2 71// CHECK-NEXT: Nearest(2, 3) = 1 72// CHECK: Nearest(3, 0) = 0 73// CHECK-NEXT: Nearest(3, 1) = 1 74// CHECK-NEXT: Nearest(3, 2) = 1 75// CHECK-NEXT: Nearest(3, 3) = 3 76// CHECK-LABEL: --- PostDominanceInfo --- 77// CHECK: Nearest(1, 0) = 1 78// CHECK-NEXT: Nearest(1, 1) = 1 79// CHECK-NEXT: Nearest(1, 2) = 1 80// CHECK-NEXT: Nearest(1, 3) = 3 81// CHECK: Nearest(2, 0) = 1 82// CHECK-NEXT: Nearest(2, 1) = 1 83// CHECK-NEXT: Nearest(2, 2) = 2 84// CHECK-NEXT: Nearest(2, 3) = 3 85// CHECK: Nearest(3, 0) = 3 86// CHECK-NEXT: Nearest(3, 1) = 3 87// CHECK-NEXT: Nearest(3, 2) = 3 88// CHECK-NEXT: Nearest(3, 3) = 3 89 90// ----- 91 92// CHECK-LABEL: Testing : nested_region 93func @nested_region(%arg0 : index, %arg1 : index, %arg2 : index) { 94 scf.for %arg3 = %arg0 to %arg1 step %arg2 { } 95 return 96} 97 98// CHECK-LABEL: --- DominanceInfo --- 99// CHECK-NEXT: Nearest(0, 0) = 0 100// CHECK-NEXT: Nearest(0, 1) = 1 101// CHECK: Nearest(1, 0) = 1 102// CHECK-NEXT: Nearest(1, 1) = 1 103// CHECK-LABEL: --- PostDominanceInfo --- 104// CHECK-NEXT: Nearest(0, 0) = 0 105// CHECK-NEXT: Nearest(0, 1) = 1 106// CHECK: Nearest(1, 0) = 1 107// CHECK-NEXT: Nearest(1, 1) = 1 108 109// ----- 110 111// CHECK-LABEL: Testing : nested_region2 112func @nested_region2(%arg0 : index, %arg1 : index, %arg2 : index) { 113 scf.for %arg3 = %arg0 to %arg1 step %arg2 { 114 scf.for %arg4 = %arg0 to %arg1 step %arg2 { 115 scf.for %arg5 = %arg0 to %arg1 step %arg2 { } 116 } 117 } 118 return 119} 120// CHECK-LABEL: --- DominanceInfo --- 121// CHECK: Nearest(1, 0) = 1 122// CHECK-NEXT: Nearest(1, 1) = 1 123// CHECK-NEXT: Nearest(1, 2) = 2 124// CHECK-NEXT: Nearest(1, 3) = 3 125// CHECK: Nearest(2, 0) = 2 126// CHECK-NEXT: Nearest(2, 1) = 2 127// CHECK-NEXT: Nearest(2, 2) = 2 128// CHECK-NEXT: Nearest(2, 3) = 3 129// CHECK: Nearest(3, 0) = 3 130// CHECK-NEXT: Nearest(3, 1) = 3 131// CHECK-NEXT: Nearest(3, 2) = 3 132// CHECK-NEXT: Nearest(3, 3) = 3 133// CHECK-LABEL: --- PostDominanceInfo --- 134// CHECK-NEXT: Nearest(0, 0) = 0 135// CHECK-NEXT: Nearest(0, 1) = 1 136// CHECK-NEXT: Nearest(0, 2) = 2 137// CHECK-NEXT: Nearest(0, 3) = 3 138// CHECK: Nearest(1, 0) = 1 139// CHECK-NEXT: Nearest(1, 1) = 1 140// CHECK-NEXT: Nearest(1, 2) = 2 141// CHECK-NEXT: Nearest(1, 3) = 3 142// CHECK: Nearest(2, 0) = 2 143// CHECK-NEXT: Nearest(2, 1) = 2 144// CHECK-NEXT: Nearest(2, 2) = 2 145// CHECK-NEXT: Nearest(2, 3) = 3 146 147// ----- 148 149// CHECK-LABEL: Testing : func_loop_nested_region 150func @func_loop_nested_region( 151 %arg0 : i32, 152 %arg1 : i32, 153 %arg2 : index, 154 %arg3 : index, 155 %arg4 : index) { 156 br ^loopHeader(%arg0 : i32) 157^loopHeader(%counter : i32): 158 %lessThan = cmpi slt, %counter, %arg1 : i32 159 cond_br %lessThan, ^loopBody, ^exit 160^loopBody: 161 %const0 = constant 1 : i32 162 %inc = addi %counter, %const0 : i32 163 scf.for %arg5 = %arg2 to %arg3 step %arg4 { 164 scf.for %arg6 = %arg2 to %arg3 step %arg4 { } 165 } 166 br ^loopHeader(%inc : i32) 167^exit: 168 return 169} 170// CHECK-LABEL: --- DominanceInfo --- 171// CHECK: Nearest(2, 0) = 0 172// CHECK-NEXT: Nearest(2, 1) = 1 173// CHECK-NEXT: Nearest(2, 2) = 2 174// CHECK-NEXT: Nearest(2, 3) = 2 175// CHECK-NEXT: Nearest(2, 4) = 2 176// CHECK-NEXT: Nearest(2, 5) = 1 177// CHECK: Nearest(3, 0) = 0 178// CHECK-NEXT: Nearest(3, 1) = 1 179// CHECK-NEXT: Nearest(3, 2) = 2 180// CHECK-NEXT: Nearest(3, 3) = 3 181// CHECK-NEXT: Nearest(3, 4) = 4 182// CHECK-NEXT: Nearest(3, 5) = 1 183// CHECK: Nearest(4, 0) = 0 184// CHECK-NEXT: Nearest(4, 1) = 1 185// CHECK-NEXT: Nearest(4, 2) = 2 186// CHECK-NEXT: Nearest(4, 3) = 4 187// CHECK-NEXT: Nearest(4, 4) = 4 188// CHECK-NEXT: Nearest(4, 5) = 1 189// CHECK-LABEL: --- PostDominanceInfo --- 190// CHECK: Nearest(2, 0) = 1 191// CHECK-NEXT: Nearest(2, 1) = 1 192// CHECK-NEXT: Nearest(2, 2) = 2 193// CHECK-NEXT: Nearest(2, 3) = 2 194// CHECK-NEXT: Nearest(2, 4) = 2 195// CHECK-NEXT: Nearest(2, 5) = 5 196// CHECK: Nearest(3, 0) = 1 197// CHECK-NEXT: Nearest(3, 1) = 1 198// CHECK-NEXT: Nearest(3, 2) = 2 199// CHECK-NEXT: Nearest(3, 3) = 3 200// CHECK-NEXT: Nearest(3, 4) = 4 201// CHECK-NEXT: Nearest(3, 5) = 5 202// CHECK: Nearest(4, 0) = 1 203// CHECK-NEXT: Nearest(4, 1) = 1 204// CHECK-NEXT: Nearest(4, 2) = 2 205// CHECK-NEXT: Nearest(4, 3) = 4 206// CHECK-NEXT: Nearest(4, 4) = 4 207// CHECK-NEXT: Nearest(4, 5) = 5 208// CHECK-LABEL: --- Block Dominance relationship --- 209// CHECK-NEXT: dominates(0, 0) = true 210// CHECK-NEXT: dominates(0, 1) = true 211// CHECK-NEXT: dominates(0, 2) = true 212// CHECK-NEXT: dominates(0, 3) = true 213// CHECK-NEXT: dominates(0, 4) = true 214// CHECK-NEXT: dominates(0, 5) = true 215// CHECK-NEXT: dominates(0, 6) = false 216// CHECK-NEXT: dominates(1, 0) = false 217// CHECK-NEXT: dominates(1, 1) = true 218// CHECK-NEXT: dominates(1, 2) = true 219// CHECK-NEXT: dominates(1, 3) = true 220// CHECK-NEXT: dominates(1, 4) = true 221// CHECK-NEXT: dominates(1, 5) = true 222// CHECK-NEXT: dominates(1, 6) = false 223// CHECK-NEXT: dominates(2, 0) = false 224// CHECK-NEXT: dominates(2, 1) = false 225// CHECK-NEXT: dominates(2, 2) = true 226// CHECK-NEXT: dominates(2, 3) = true 227// CHECK-NEXT: dominates(2, 4) = true 228// CHECK-NEXT: dominates(2, 5) = false 229// CHECK-NEXT: dominates(2, 6) = false 230// CHECK-NEXT: dominates(3, 0) = false 231// CHECK-NEXT: dominates(3, 1) = false 232// CHECK-NEXT: dominates(3, 2) = false 233// CHECK-NEXT: dominates(3, 3) = true 234// CHECK-NEXT: dominates(3, 4) = false 235// CHECK-NEXT: dominates(3, 5) = false 236// CHECK-NEXT: dominates(3, 6) = false 237// CHECK-NEXT: dominates(4, 0) = false 238// CHECK-NEXT: dominates(4, 1) = false 239// CHECK-NEXT: dominates(4, 2) = false 240// CHECK-NEXT: dominates(4, 3) = true 241// CHECK-NEXT: dominates(4, 4) = true 242// CHECK-NEXT: dominates(4, 5) = false 243// CHECK-NEXT: dominates(4, 6) = false 244// CHECK-NEXT: dominates(5, 0) = false 245// CHECK-NEXT: dominates(5, 1) = false 246// CHECK-NEXT: dominates(5, 2) = false 247// CHECK-NEXT: dominates(5, 3) = false 248// CHECK-NEXT: dominates(5, 4) = false 249// CHECK-NEXT: dominates(5, 5) = true 250// CHECK-NEXT: dominates(5, 6) = false 251// CHECK-NEXT: dominates(6, 0) = true 252// CHECK-NEXT: dominates(6, 1) = true 253// CHECK-NEXT: dominates(6, 2) = true 254// CHECK-NEXT: dominates(6, 3) = true 255// CHECK-NEXT: dominates(6, 4) = true 256// CHECK-NEXT: dominates(6, 5) = true 257// CHECK-NEXT: dominates(6, 6) = true 258// CHECK-LABEL: --- Block PostDominance relationship --- 259// CHECK-NEXT: postdominates(0, 0) = true 260// CHECK-NEXT: postdominates(0, 1) = false 261// CHECK-NEXT: postdominates(0, 2) = false 262// CHECK-NEXT: postdominates(0, 3) = false 263// CHECK-NEXT: postdominates(0, 4) = false 264// CHECK-NEXT: postdominates(0, 5) = false 265// CHECK-NEXT: postdominates(0, 6) = false 266// CHECK-NEXT: postdominates(1, 0) = true 267// CHECK-NEXT: postdominates(1, 1) = true 268// CHECK-NEXT: postdominates(1, 2) = true 269// CHECK-NEXT: postdominates(1, 3) = true 270// CHECK-NEXT: postdominates(1, 4) = true 271// CHECK-NEXT: postdominates(1, 5) = false 272// CHECK-NEXT: postdominates(1, 6) = false 273// CHECK-NEXT: postdominates(2, 0) = false 274// CHECK-NEXT: postdominates(2, 1) = false 275// CHECK-NEXT: postdominates(2, 2) = true 276// CHECK-NEXT: postdominates(2, 3) = true 277// CHECK-NEXT: postdominates(2, 4) = true 278// CHECK-NEXT: postdominates(2, 5) = false 279// CHECK-NEXT: postdominates(2, 6) = false 280// CHECK-NEXT: postdominates(3, 0) = false 281// CHECK-NEXT: postdominates(3, 1) = false 282// CHECK-NEXT: postdominates(3, 2) = false 283// CHECK-NEXT: postdominates(3, 3) = true 284// CHECK-NEXT: postdominates(3, 4) = false 285// CHECK-NEXT: postdominates(3, 5) = false 286// CHECK-NEXT: postdominates(3, 6) = false 287// CHECK-NEXT: postdominates(4, 0) = false 288// CHECK-NEXT: postdominates(4, 1) = false 289// CHECK-NEXT: postdominates(4, 2) = false 290// CHECK-NEXT: postdominates(4, 3) = true 291// CHECK-NEXT: postdominates(4, 4) = true 292// CHECK-NEXT: postdominates(4, 5) = false 293// CHECK-NEXT: postdominates(4, 6) = false 294// CHECK-NEXT: postdominates(5, 0) = true 295// CHECK-NEXT: postdominates(5, 1) = true 296// CHECK-NEXT: postdominates(5, 2) = true 297// CHECK-NEXT: postdominates(5, 3) = true 298// CHECK-NEXT: postdominates(5, 4) = true 299// CHECK-NEXT: postdominates(5, 5) = true 300// CHECK-NEXT: postdominates(5, 6) = false 301// CHECK-NEXT: postdominates(6, 0) = true 302// CHECK-NEXT: postdominates(6, 1) = true 303// CHECK-NEXT: postdominates(6, 2) = true 304// CHECK-NEXT: postdominates(6, 3) = true 305// CHECK-NEXT: postdominates(6, 4) = true 306// CHECK-NEXT: postdominates(6, 5) = true 307// CHECK-NEXT: postdominates(6, 6) = true 308