Files
TheRock/compiler/amd-llvm/mlir/test/Analysis/test-dominance.mlir
T
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

683 lines
23 KiB
MLIR

// RUN: mlir-opt %s -pass-pipeline="builtin.module(func.func(test-print-dominance))" -split-input-file | FileCheck %s
// CHECK-LABEL: Testing : func_condBranch
func.func @func_condBranch(%cond : i1) {
cf.cond_br %cond, ^bb1, ^bb2
^bb1:
cf.br ^exit
^bb2:
cf.br ^exit
^exit:
return
}
// CHECK: --- DominanceInfo ---
// CHECK: Nearest(0, 0) = 0
// CHECK: Nearest(0, 1) = 0
// CHECK: Nearest(0, 2) = 0
// CHECK: Nearest(0, 3) = 0
// CHECK: Nearest(0, 4) = 4
// CHECK: Nearest(1, 0) = 0
// CHECK: Nearest(1, 1) = 1
// CHECK: Nearest(1, 2) = 0
// CHECK: Nearest(1, 3) = 0
// CHECK: Nearest(1, 4) = 4
// CHECK: Nearest(2, 0) = 0
// CHECK: Nearest(2, 1) = 0
// CHECK: Nearest(2, 2) = 2
// CHECK: Nearest(2, 3) = 0
// CHECK: Nearest(2, 4) = 4
// CHECK: Nearest(3, 0) = 0
// CHECK: Nearest(3, 1) = 0
// CHECK: Nearest(3, 2) = 0
// CHECK: Nearest(3, 3) = 3
// CHECK: Nearest(3, 4) = 4
// CHECK: Nearest(4, 0) = 4
// CHECK: Nearest(4, 1) = 4
// CHECK: Nearest(4, 2) = 4
// CHECK: Nearest(4, 3) = 4
// CHECK: Nearest(4, 4) = 4
// CHECK: --- PostDominanceInfo ---
// CHECK: Nearest(0, 0) = 0
// CHECK: Nearest(0, 1) = 3
// CHECK: Nearest(0, 2) = 3
// CHECK: Nearest(0, 3) = 3
// CHECK: Nearest(0, 4) = 4
// CHECK: Nearest(1, 0) = 3
// CHECK: Nearest(1, 1) = 1
// CHECK: Nearest(1, 2) = 3
// CHECK: Nearest(1, 3) = 3
// CHECK: Nearest(1, 4) = 4
// CHECK: Nearest(2, 0) = 3
// CHECK: Nearest(2, 1) = 3
// CHECK: Nearest(2, 2) = 2
// CHECK: Nearest(2, 3) = 3
// CHECK: Nearest(2, 4) = 4
// CHECK: Nearest(3, 0) = 3
// CHECK: Nearest(3, 1) = 3
// CHECK: Nearest(3, 2) = 3
// CHECK: Nearest(3, 3) = 3
// CHECK: Nearest(3, 4) = 4
// CHECK: Nearest(4, 0) = 4
// CHECK: Nearest(4, 1) = 4
// CHECK: Nearest(4, 2) = 4
// CHECK: Nearest(4, 3) = 4
// CHECK: Nearest(4, 4) = 4
// CHECK: --- Block Dominance relationship ---
// CHECK: dominates(0, 0) = 1 (properly = 0)
// CHECK: dominates(0, 1) = 1 (properly = 1)
// CHECK: dominates(0, 2) = 1 (properly = 1)
// CHECK: dominates(0, 3) = 1 (properly = 1)
// CHECK: dominates(0, 4) = 0 (properly = 0)
// CHECK: dominates(1, 0) = 0 (properly = 0)
// CHECK: dominates(1, 1) = 1 (properly = 0)
// CHECK: dominates(1, 2) = 0 (properly = 0)
// CHECK: dominates(1, 3) = 0 (properly = 0)
// CHECK: dominates(1, 4) = 0 (properly = 0)
// CHECK: dominates(2, 0) = 0 (properly = 0)
// CHECK: dominates(2, 1) = 0 (properly = 0)
// CHECK: dominates(2, 2) = 1 (properly = 0)
// CHECK: dominates(2, 3) = 0 (properly = 0)
// CHECK: dominates(2, 4) = 0 (properly = 0)
// CHECK: dominates(3, 0) = 0 (properly = 0)
// CHECK: dominates(3, 1) = 0 (properly = 0)
// CHECK: dominates(3, 2) = 0 (properly = 0)
// CHECK: dominates(3, 3) = 1 (properly = 0)
// CHECK: dominates(3, 4) = 0 (properly = 0)
// CHECK: dominates(4, 0) = 1 (properly = 1)
// CHECK: dominates(4, 1) = 1 (properly = 1)
// CHECK: dominates(4, 2) = 1 (properly = 1)
// CHECK: dominates(4, 3) = 1 (properly = 1)
// CHECK: dominates(4, 4) = 1 (properly = 1)
// CHECK: --- Block PostDominance relationship ---
// CHECK: postdominates(0, 0) = 1 (properly = 0)
// CHECK: postdominates(0, 1) = 0 (properly = 0)
// CHECK: postdominates(0, 2) = 0 (properly = 0)
// CHECK: postdominates(0, 3) = 0 (properly = 0)
// CHECK: postdominates(0, 4) = 0 (properly = 0)
// CHECK: postdominates(1, 0) = 0 (properly = 0)
// CHECK: postdominates(1, 1) = 1 (properly = 0)
// CHECK: postdominates(1, 2) = 0 (properly = 0)
// CHECK: postdominates(1, 3) = 0 (properly = 0)
// CHECK: postdominates(1, 4) = 0 (properly = 0)
// CHECK: postdominates(2, 0) = 0 (properly = 0)
// CHECK: postdominates(2, 1) = 0 (properly = 0)
// CHECK: postdominates(2, 2) = 1 (properly = 0)
// CHECK: postdominates(2, 3) = 0 (properly = 0)
// CHECK: postdominates(2, 4) = 0 (properly = 0)
// CHECK: postdominates(3, 0) = 1 (properly = 1)
// CHECK: postdominates(3, 1) = 1 (properly = 1)
// CHECK: postdominates(3, 2) = 1 (properly = 1)
// CHECK: postdominates(3, 3) = 1 (properly = 0)
// CHECK: postdominates(3, 4) = 0 (properly = 0)
// CHECK: postdominates(4, 0) = 1 (properly = 1)
// CHECK: postdominates(4, 1) = 1 (properly = 1)
// CHECK: postdominates(4, 2) = 1 (properly = 1)
// CHECK: postdominates(4, 3) = 1 (properly = 1)
// CHECK: postdominates(4, 4) = 1 (properly = 1)
// CHECK: module attributes {test.block_ids = array<i64: 4>}
// CHECK: func.func @func_condBranch({{.*}}) attributes {test.block_ids = array<i64: 0, 1, 2, 3>}
// -----
// CHECK-LABEL: Testing : func_loop
func.func @func_loop(%arg0 : i32, %arg1 : i32) {
cf.br ^loopHeader(%arg0 : i32)
^loopHeader(%counter : i32):
%lessThan = arith.cmpi slt, %counter, %arg1 : i32
cf.cond_br %lessThan, ^loopBody, ^exit
^loopBody:
%const0 = arith.constant 1 : i32
%inc = arith.addi %counter, %const0 : i32
cf.br ^loopHeader(%inc : i32)
^exit:
return
}
// CHECK: --- DominanceInfo ---
// CHECK: Nearest(0, 0) = 0
// CHECK: Nearest(0, 1) = 0
// CHECK: Nearest(0, 2) = 0
// CHECK: Nearest(0, 3) = 0
// CHECK: Nearest(0, 4) = 4
// CHECK: Nearest(1, 0) = 0
// CHECK: Nearest(1, 1) = 1
// CHECK: Nearest(1, 2) = 1
// CHECK: Nearest(1, 3) = 1
// CHECK: Nearest(1, 4) = 4
// CHECK: Nearest(2, 0) = 0
// CHECK: Nearest(2, 1) = 1
// CHECK: Nearest(2, 2) = 2
// CHECK: Nearest(2, 3) = 1
// CHECK: Nearest(2, 4) = 4
// CHECK: Nearest(3, 0) = 0
// CHECK: Nearest(3, 1) = 1
// CHECK: Nearest(3, 2) = 1
// CHECK: Nearest(3, 3) = 3
// CHECK: Nearest(3, 4) = 4
// CHECK: Nearest(4, 0) = 4
// CHECK: Nearest(4, 1) = 4
// CHECK: Nearest(4, 2) = 4
// CHECK: Nearest(4, 3) = 4
// CHECK: Nearest(4, 4) = 4
// CHECK: --- PostDominanceInfo ---
// CHECK: Nearest(0, 0) = 0
// CHECK: Nearest(0, 1) = 1
// CHECK: Nearest(0, 2) = 1
// CHECK: Nearest(0, 3) = 3
// CHECK: Nearest(0, 4) = 4
// CHECK: Nearest(1, 0) = 1
// CHECK: Nearest(1, 1) = 1
// CHECK: Nearest(1, 2) = 1
// CHECK: Nearest(1, 3) = 3
// CHECK: Nearest(1, 4) = 4
// CHECK: Nearest(2, 0) = 1
// CHECK: Nearest(2, 1) = 1
// CHECK: Nearest(2, 2) = 2
// CHECK: Nearest(2, 3) = 3
// CHECK: Nearest(2, 4) = 4
// CHECK: Nearest(3, 0) = 3
// CHECK: Nearest(3, 1) = 3
// CHECK: Nearest(3, 2) = 3
// CHECK: Nearest(3, 3) = 3
// CHECK: Nearest(3, 4) = 4
// CHECK: Nearest(4, 0) = 4
// CHECK: Nearest(4, 1) = 4
// CHECK: Nearest(4, 2) = 4
// CHECK: Nearest(4, 3) = 4
// CHECK: Nearest(4, 4) = 4
// CHECK: --- Block Dominance relationship ---
// CHECK: dominates(0, 0) = 1 (properly = 0)
// CHECK: dominates(0, 1) = 1 (properly = 1)
// CHECK: dominates(0, 2) = 1 (properly = 1)
// CHECK: dominates(0, 3) = 1 (properly = 1)
// CHECK: dominates(0, 4) = 0 (properly = 0)
// CHECK: dominates(1, 0) = 0 (properly = 0)
// CHECK: dominates(1, 1) = 1 (properly = 0)
// CHECK: dominates(1, 2) = 1 (properly = 1)
// CHECK: dominates(1, 3) = 1 (properly = 1)
// CHECK: dominates(1, 4) = 0 (properly = 0)
// CHECK: dominates(2, 0) = 0 (properly = 0)
// CHECK: dominates(2, 1) = 0 (properly = 0)
// CHECK: dominates(2, 2) = 1 (properly = 0)
// CHECK: dominates(2, 3) = 0 (properly = 0)
// CHECK: dominates(2, 4) = 0 (properly = 0)
// CHECK: dominates(3, 0) = 0 (properly = 0)
// CHECK: dominates(3, 1) = 0 (properly = 0)
// CHECK: dominates(3, 2) = 0 (properly = 0)
// CHECK: dominates(3, 3) = 1 (properly = 0)
// CHECK: dominates(3, 4) = 0 (properly = 0)
// CHECK: dominates(4, 0) = 1 (properly = 1)
// CHECK: dominates(4, 1) = 1 (properly = 1)
// CHECK: dominates(4, 2) = 1 (properly = 1)
// CHECK: dominates(4, 3) = 1 (properly = 1)
// CHECK: dominates(4, 4) = 1 (properly = 1)
// CHECK: --- Block PostDominance relationship ---
// CHECK: postdominates(0, 0) = 1 (properly = 0)
// CHECK: postdominates(0, 1) = 0 (properly = 0)
// CHECK: postdominates(0, 2) = 0 (properly = 0)
// CHECK: postdominates(0, 3) = 0 (properly = 0)
// CHECK: postdominates(0, 4) = 0 (properly = 0)
// CHECK: postdominates(1, 0) = 1 (properly = 1)
// CHECK: postdominates(1, 1) = 1 (properly = 0)
// CHECK: postdominates(1, 2) = 1 (properly = 1)
// CHECK: postdominates(1, 3) = 0 (properly = 0)
// CHECK: postdominates(1, 4) = 0 (properly = 0)
// CHECK: postdominates(2, 0) = 0 (properly = 0)
// CHECK: postdominates(2, 1) = 0 (properly = 0)
// CHECK: postdominates(2, 2) = 1 (properly = 0)
// CHECK: postdominates(2, 3) = 0 (properly = 0)
// CHECK: postdominates(2, 4) = 0 (properly = 0)
// CHECK: postdominates(3, 0) = 1 (properly = 1)
// CHECK: postdominates(3, 1) = 1 (properly = 1)
// CHECK: postdominates(3, 2) = 1 (properly = 1)
// CHECK: postdominates(3, 3) = 1 (properly = 0)
// CHECK: postdominates(3, 4) = 0 (properly = 0)
// CHECK: postdominates(4, 0) = 1 (properly = 1)
// CHECK: postdominates(4, 1) = 1 (properly = 1)
// CHECK: postdominates(4, 2) = 1 (properly = 1)
// CHECK: postdominates(4, 3) = 1 (properly = 1)
// CHECK: postdominates(4, 4) = 1 (properly = 1)
// CHECK: module attributes {test.block_ids = array<i64: 4>}
// CHECK: func.func @func_loop({{.*}}) attributes {test.block_ids = array<i64: 0, 1, 2, 3>}
// -----
// CHECK-LABEL: Testing : nested_region
func.func @nested_region(%arg0 : index, %arg1 : index, %arg2 : index) {
scf.for %arg3 = %arg0 to %arg1 step %arg2 { }
return
}
// CHECK: --- DominanceInfo ---
// CHECK: Nearest(0, 0) = 0
// CHECK: Nearest(0, 1) = 1
// CHECK: Nearest(0, 2) = 2
// CHECK: Nearest(1, 0) = 1
// CHECK: Nearest(1, 1) = 1
// CHECK: Nearest(1, 2) = 2
// CHECK: Nearest(2, 0) = 2
// CHECK: Nearest(2, 1) = 2
// CHECK: Nearest(2, 2) = 2
// CHECK: --- PostDominanceInfo ---
// CHECK: Nearest(0, 0) = 0
// CHECK: Nearest(0, 1) = 1
// CHECK: Nearest(0, 2) = 2
// CHECK: Nearest(1, 0) = 1
// CHECK: Nearest(1, 1) = 1
// CHECK: Nearest(1, 2) = 2
// CHECK: Nearest(2, 0) = 2
// CHECK: Nearest(2, 1) = 2
// CHECK: Nearest(2, 2) = 2
// CHECK: --- Block Dominance relationship ---
// CHECK: dominates(0, 0) = 1 (properly = 0)
// CHECK: dominates(0, 1) = 0 (properly = 0)
// CHECK: dominates(0, 2) = 0 (properly = 0)
// CHECK: dominates(1, 0) = 1 (properly = 1)
// CHECK: dominates(1, 1) = 1 (properly = 0)
// CHECK: dominates(1, 2) = 0 (properly = 0)
// CHECK: dominates(2, 0) = 1 (properly = 1)
// CHECK: dominates(2, 1) = 1 (properly = 1)
// CHECK: dominates(2, 2) = 1 (properly = 1)
// CHECK: --- Block PostDominance relationship ---
// CHECK: postdominates(0, 0) = 1 (properly = 0)
// CHECK: postdominates(0, 1) = 0 (properly = 0)
// CHECK: postdominates(0, 2) = 0 (properly = 0)
// CHECK: postdominates(1, 0) = 1 (properly = 1)
// CHECK: postdominates(1, 1) = 1 (properly = 0)
// CHECK: postdominates(1, 2) = 0 (properly = 0)
// CHECK: postdominates(2, 0) = 1 (properly = 1)
// CHECK: postdominates(2, 1) = 1 (properly = 1)
// CHECK: postdominates(2, 2) = 1 (properly = 1)
// CHECK: module attributes {test.block_ids = array<i64: 2>} {
// CHECK: func.func @nested_region({{.*}}) attributes {test.block_ids = array<i64: 1>} {
// CHECK: scf.for {{.*}} {
// CHECK: } {test.block_ids = array<i64: 0>}
// CHECK: return
// CHECK: }
// CHECK: }
// -----
// CHECK-LABEL: Testing : nested_region2
func.func @nested_region2(%arg0 : index, %arg1 : index, %arg2 : index) {
scf.for %arg3 = %arg0 to %arg1 step %arg2 {
scf.for %arg4 = %arg0 to %arg1 step %arg2 {
scf.for %arg5 = %arg0 to %arg1 step %arg2 { }
}
}
return
}
// CHECK: --- DominanceInfo ---
// CHECK: Nearest(0, 0) = 0
// CHECK: Nearest(0, 1) = 1
// CHECK: Nearest(0, 2) = 2
// CHECK: Nearest(0, 3) = 3
// CHECK: Nearest(0, 4) = 4
// CHECK: Nearest(1, 0) = 1
// CHECK: Nearest(1, 1) = 1
// CHECK: Nearest(1, 2) = 2
// CHECK: Nearest(1, 3) = 3
// CHECK: Nearest(1, 4) = 4
// CHECK: Nearest(2, 0) = 2
// CHECK: Nearest(2, 1) = 2
// CHECK: Nearest(2, 2) = 2
// CHECK: Nearest(2, 3) = 3
// CHECK: Nearest(2, 4) = 4
// CHECK: Nearest(3, 0) = 3
// CHECK: Nearest(3, 1) = 3
// CHECK: Nearest(3, 2) = 3
// CHECK: Nearest(3, 3) = 3
// CHECK: Nearest(3, 4) = 4
// CHECK: Nearest(4, 0) = 4
// CHECK: Nearest(4, 1) = 4
// CHECK: Nearest(4, 2) = 4
// CHECK: Nearest(4, 3) = 4
// CHECK: Nearest(4, 4) = 4
// CHECK: --- PostDominanceInfo ---
// CHECK: Nearest(0, 0) = 0
// CHECK: Nearest(0, 1) = 1
// CHECK: Nearest(0, 2) = 2
// CHECK: Nearest(0, 3) = 3
// CHECK: Nearest(0, 4) = 4
// CHECK: Nearest(1, 0) = 1
// CHECK: Nearest(1, 1) = 1
// CHECK: Nearest(1, 2) = 2
// CHECK: Nearest(1, 3) = 3
// CHECK: Nearest(1, 4) = 4
// CHECK: Nearest(2, 0) = 2
// CHECK: Nearest(2, 1) = 2
// CHECK: Nearest(2, 2) = 2
// CHECK: Nearest(2, 3) = 3
// CHECK: Nearest(2, 4) = 4
// CHECK: Nearest(3, 0) = 3
// CHECK: Nearest(3, 1) = 3
// CHECK: Nearest(3, 2) = 3
// CHECK: Nearest(3, 3) = 3
// CHECK: Nearest(3, 4) = 4
// CHECK: Nearest(4, 0) = 4
// CHECK: Nearest(4, 1) = 4
// CHECK: Nearest(4, 2) = 4
// CHECK: Nearest(4, 3) = 4
// CHECK: Nearest(4, 4) = 4
// CHECK: --- Block Dominance relationship ---
// CHECK: dominates(0, 0) = 1 (properly = 0)
// CHECK: dominates(0, 1) = 0 (properly = 0)
// CHECK: dominates(0, 2) = 0 (properly = 0)
// CHECK: dominates(0, 3) = 0 (properly = 0)
// CHECK: dominates(0, 4) = 0 (properly = 0)
// CHECK: dominates(1, 0) = 1 (properly = 1)
// CHECK: dominates(1, 1) = 1 (properly = 0)
// CHECK: dominates(1, 2) = 0 (properly = 0)
// CHECK: dominates(1, 3) = 0 (properly = 0)
// CHECK: dominates(1, 4) = 0 (properly = 0)
// CHECK: dominates(2, 0) = 1 (properly = 1)
// CHECK: dominates(2, 1) = 1 (properly = 1)
// CHECK: dominates(2, 2) = 1 (properly = 0)
// CHECK: dominates(2, 3) = 0 (properly = 0)
// CHECK: dominates(2, 4) = 0 (properly = 0)
// CHECK: dominates(3, 0) = 1 (properly = 1)
// CHECK: dominates(3, 1) = 1 (properly = 1)
// CHECK: dominates(3, 2) = 1 (properly = 1)
// CHECK: dominates(3, 3) = 1 (properly = 0)
// CHECK: dominates(3, 4) = 0 (properly = 0)
// CHECK: dominates(4, 0) = 1 (properly = 1)
// CHECK: dominates(4, 1) = 1 (properly = 1)
// CHECK: dominates(4, 2) = 1 (properly = 1)
// CHECK: dominates(4, 3) = 1 (properly = 1)
// CHECK: dominates(4, 4) = 1 (properly = 1)
// CHECK: --- Block PostDominance relationship ---
// CHECK: postdominates(0, 0) = 1 (properly = 0)
// CHECK: postdominates(0, 1) = 0 (properly = 0)
// CHECK: postdominates(0, 2) = 0 (properly = 0)
// CHECK: postdominates(0, 3) = 0 (properly = 0)
// CHECK: postdominates(0, 4) = 0 (properly = 0)
// CHECK: postdominates(1, 0) = 1 (properly = 1)
// CHECK: postdominates(1, 1) = 1 (properly = 0)
// CHECK: postdominates(1, 2) = 0 (properly = 0)
// CHECK: postdominates(1, 3) = 0 (properly = 0)
// CHECK: postdominates(1, 4) = 0 (properly = 0)
// CHECK: postdominates(2, 0) = 1 (properly = 1)
// CHECK: postdominates(2, 1) = 1 (properly = 1)
// CHECK: postdominates(2, 2) = 1 (properly = 0)
// CHECK: postdominates(2, 3) = 0 (properly = 0)
// CHECK: postdominates(2, 4) = 0 (properly = 0)
// CHECK: postdominates(3, 0) = 1 (properly = 1)
// CHECK: postdominates(3, 1) = 1 (properly = 1)
// CHECK: postdominates(3, 2) = 1 (properly = 1)
// CHECK: postdominates(3, 3) = 1 (properly = 0)
// CHECK: postdominates(3, 4) = 0 (properly = 0)
// CHECK: postdominates(4, 0) = 1 (properly = 1)
// CHECK: postdominates(4, 1) = 1 (properly = 1)
// CHECK: postdominates(4, 2) = 1 (properly = 1)
// CHECK: postdominates(4, 3) = 1 (properly = 1)
// CHECK: postdominates(4, 4) = 1 (properly = 1)
// CHECK: module attributes {test.block_ids = array<i64: 4>} {
// CHECK: func.func @nested_region2({{.*}}) attributes {test.block_ids = array<i64: 3>} {
// CHECK: scf.for {{.*}} {
// CHECK: scf.for {{.*}} {
// CHECK: scf.for {{.*}} {
// CHECK: } {test.block_ids = array<i64: 0>}
// CHECK: } {test.block_ids = array<i64: 1>}
// CHECK: } {test.block_ids = array<i64: 2>}
// CHECK: return
// CHECK: }
// CHECK: }
// -----
// CHECK-LABEL: Testing : func_loop_nested_region
func.func @func_loop_nested_region(
%arg0 : i32,
%arg1 : i32,
%arg2 : index,
%arg3 : index,
%arg4 : index) {
cf.br ^loopHeader(%arg0 : i32)
^loopHeader(%counter : i32):
%lessThan = arith.cmpi slt, %counter, %arg1 : i32
cf.cond_br %lessThan, ^loopBody, ^exit
^loopBody:
%const0 = arith.constant 1 : i32
%inc = arith.addi %counter, %const0 : i32
scf.for %arg5 = %arg2 to %arg3 step %arg4 {
scf.for %arg6 = %arg2 to %arg3 step %arg4 { }
}
cf.br ^loopHeader(%inc : i32)
^exit:
return
}
// CHECK: --- DominanceInfo ---
// CHECK: Nearest(0, 0) = 0
// CHECK: Nearest(0, 1) = 0
// CHECK: Nearest(0, 2) = 0
// CHECK: Nearest(0, 3) = 0
// CHECK: Nearest(0, 4) = 0
// CHECK: Nearest(0, 5) = 0
// CHECK: Nearest(0, 6) = 6
// CHECK: Nearest(1, 0) = 0
// CHECK: Nearest(1, 1) = 1
// CHECK: Nearest(1, 2) = 1
// CHECK: Nearest(1, 3) = 1
// CHECK: Nearest(1, 4) = 1
// CHECK: Nearest(1, 5) = 1
// CHECK: Nearest(1, 6) = 6
// CHECK: Nearest(2, 0) = 0
// CHECK: Nearest(2, 1) = 1
// CHECK: Nearest(2, 2) = 2
// CHECK: Nearest(2, 3) = 2
// CHECK: Nearest(2, 4) = 2
// CHECK: Nearest(2, 5) = 1
// CHECK: Nearest(2, 6) = 6
// CHECK: Nearest(3, 0) = 0
// CHECK: Nearest(3, 1) = 1
// CHECK: Nearest(3, 2) = 2
// CHECK: Nearest(3, 3) = 3
// CHECK: Nearest(3, 4) = 4
// CHECK: Nearest(3, 5) = 1
// CHECK: Nearest(3, 6) = 6
// CHECK: Nearest(4, 0) = 0
// CHECK: Nearest(4, 1) = 1
// CHECK: Nearest(4, 2) = 2
// CHECK: Nearest(4, 3) = 4
// CHECK: Nearest(4, 4) = 4
// CHECK: Nearest(4, 5) = 1
// CHECK: Nearest(4, 6) = 6
// CHECK: Nearest(5, 0) = 0
// CHECK: Nearest(5, 1) = 1
// CHECK: Nearest(5, 2) = 1
// CHECK: Nearest(5, 3) = 1
// CHECK: Nearest(5, 4) = 1
// CHECK: Nearest(5, 5) = 5
// CHECK: Nearest(5, 6) = 6
// CHECK: Nearest(6, 0) = 6
// CHECK: Nearest(6, 1) = 6
// CHECK: Nearest(6, 2) = 6
// CHECK: Nearest(6, 3) = 6
// CHECK: Nearest(6, 4) = 6
// CHECK: Nearest(6, 5) = 6
// CHECK: Nearest(6, 6) = 6
// CHECK: --- PostDominanceInfo ---
// CHECK: Nearest(0, 0) = 0
// CHECK: Nearest(0, 1) = 1
// CHECK: Nearest(0, 2) = 1
// CHECK: Nearest(0, 3) = 1
// CHECK: Nearest(0, 4) = 1
// CHECK: Nearest(0, 5) = 5
// CHECK: Nearest(0, 6) = 6
// CHECK: Nearest(1, 0) = 1
// CHECK: Nearest(1, 1) = 1
// CHECK: Nearest(1, 2) = 1
// CHECK: Nearest(1, 3) = 1
// CHECK: Nearest(1, 4) = 1
// CHECK: Nearest(1, 5) = 5
// CHECK: Nearest(1, 6) = 6
// CHECK: Nearest(2, 0) = 1
// CHECK: Nearest(2, 1) = 1
// CHECK: Nearest(2, 2) = 2
// CHECK: Nearest(2, 3) = 2
// CHECK: Nearest(2, 4) = 2
// CHECK: Nearest(2, 5) = 5
// CHECK: Nearest(2, 6) = 6
// CHECK: Nearest(3, 0) = 1
// CHECK: Nearest(3, 1) = 1
// CHECK: Nearest(3, 2) = 2
// CHECK: Nearest(3, 3) = 3
// CHECK: Nearest(3, 4) = 4
// CHECK: Nearest(3, 5) = 5
// CHECK: Nearest(3, 6) = 6
// CHECK: Nearest(4, 0) = 1
// CHECK: Nearest(4, 1) = 1
// CHECK: Nearest(4, 2) = 2
// CHECK: Nearest(4, 3) = 4
// CHECK: Nearest(4, 4) = 4
// CHECK: Nearest(4, 5) = 5
// CHECK: Nearest(4, 6) = 6
// CHECK: Nearest(5, 0) = 5
// CHECK: Nearest(5, 1) = 5
// CHECK: Nearest(5, 2) = 5
// CHECK: Nearest(5, 3) = 5
// CHECK: Nearest(5, 4) = 5
// CHECK: Nearest(5, 5) = 5
// CHECK: Nearest(5, 6) = 6
// CHECK: Nearest(6, 0) = 6
// CHECK: Nearest(6, 1) = 6
// CHECK: Nearest(6, 2) = 6
// CHECK: Nearest(6, 3) = 6
// CHECK: Nearest(6, 4) = 6
// CHECK: Nearest(6, 5) = 6
// CHECK: Nearest(6, 6) = 6
// CHECK: --- Block Dominance relationship ---
// CHECK: dominates(0, 0) = 1 (properly = 0)
// CHECK: dominates(0, 1) = 1 (properly = 1)
// CHECK: dominates(0, 2) = 1 (properly = 1)
// CHECK: dominates(0, 3) = 1 (properly = 1)
// CHECK: dominates(0, 4) = 1 (properly = 1)
// CHECK: dominates(0, 5) = 1 (properly = 1)
// CHECK: dominates(0, 6) = 0 (properly = 0)
// CHECK: dominates(1, 0) = 0 (properly = 0)
// CHECK: dominates(1, 1) = 1 (properly = 0)
// CHECK: dominates(1, 2) = 1 (properly = 1)
// CHECK: dominates(1, 3) = 1 (properly = 1)
// CHECK: dominates(1, 4) = 1 (properly = 1)
// CHECK: dominates(1, 5) = 1 (properly = 1)
// CHECK: dominates(1, 6) = 0 (properly = 0)
// CHECK: dominates(2, 0) = 0 (properly = 0)
// CHECK: dominates(2, 1) = 0 (properly = 0)
// CHECK: dominates(2, 2) = 1 (properly = 0)
// CHECK: dominates(2, 3) = 1 (properly = 1)
// CHECK: dominates(2, 4) = 1 (properly = 1)
// CHECK: dominates(2, 5) = 0 (properly = 0)
// CHECK: dominates(2, 6) = 0 (properly = 0)
// CHECK: dominates(3, 0) = 0 (properly = 0)
// CHECK: dominates(3, 1) = 0 (properly = 0)
// CHECK: dominates(3, 2) = 0 (properly = 0)
// CHECK: dominates(3, 3) = 1 (properly = 0)
// CHECK: dominates(3, 4) = 0 (properly = 0)
// CHECK: dominates(3, 5) = 0 (properly = 0)
// CHECK: dominates(3, 6) = 0 (properly = 0)
// CHECK: dominates(4, 0) = 0 (properly = 0)
// CHECK: dominates(4, 1) = 0 (properly = 0)
// CHECK: dominates(4, 2) = 0 (properly = 0)
// CHECK: dominates(4, 3) = 1 (properly = 1)
// CHECK: dominates(4, 4) = 1 (properly = 0)
// CHECK: dominates(4, 5) = 0 (properly = 0)
// CHECK: dominates(4, 6) = 0 (properly = 0)
// CHECK: dominates(5, 0) = 0 (properly = 0)
// CHECK: dominates(5, 1) = 0 (properly = 0)
// CHECK: dominates(5, 2) = 0 (properly = 0)
// CHECK: dominates(5, 3) = 0 (properly = 0)
// CHECK: dominates(5, 4) = 0 (properly = 0)
// CHECK: dominates(5, 5) = 1 (properly = 0)
// CHECK: dominates(5, 6) = 0 (properly = 0)
// CHECK: dominates(6, 0) = 1 (properly = 1)
// CHECK: dominates(6, 1) = 1 (properly = 1)
// CHECK: dominates(6, 2) = 1 (properly = 1)
// CHECK: dominates(6, 3) = 1 (properly = 1)
// CHECK: dominates(6, 4) = 1 (properly = 1)
// CHECK: dominates(6, 5) = 1 (properly = 1)
// CHECK: dominates(6, 6) = 1 (properly = 1)
// CHECK: --- Block PostDominance relationship ---
// CHECK: postdominates(0, 0) = 1 (properly = 0)
// CHECK: postdominates(0, 1) = 0 (properly = 0)
// CHECK: postdominates(0, 2) = 0 (properly = 0)
// CHECK: postdominates(0, 3) = 0 (properly = 0)
// CHECK: postdominates(0, 4) = 0 (properly = 0)
// CHECK: postdominates(0, 5) = 0 (properly = 0)
// CHECK: postdominates(0, 6) = 0 (properly = 0)
// CHECK: postdominates(1, 0) = 1 (properly = 1)
// CHECK: postdominates(1, 1) = 1 (properly = 0)
// CHECK: postdominates(1, 2) = 1 (properly = 1)
// CHECK: postdominates(1, 3) = 1 (properly = 1)
// CHECK: postdominates(1, 4) = 1 (properly = 1)
// CHECK: postdominates(1, 5) = 0 (properly = 0)
// CHECK: postdominates(1, 6) = 0 (properly = 0)
// CHECK: postdominates(2, 0) = 0 (properly = 0)
// CHECK: postdominates(2, 1) = 0 (properly = 0)
// CHECK: postdominates(2, 2) = 1 (properly = 0)
// CHECK: postdominates(2, 3) = 1 (properly = 1)
// CHECK: postdominates(2, 4) = 1 (properly = 1)
// CHECK: postdominates(2, 5) = 0 (properly = 0)
// CHECK: postdominates(2, 6) = 0 (properly = 0)
// CHECK: postdominates(3, 0) = 0 (properly = 0)
// CHECK: postdominates(3, 1) = 0 (properly = 0)
// CHECK: postdominates(3, 2) = 0 (properly = 0)
// CHECK: postdominates(3, 3) = 1 (properly = 0)
// CHECK: postdominates(3, 4) = 0 (properly = 0)
// CHECK: postdominates(3, 5) = 0 (properly = 0)
// CHECK: postdominates(3, 6) = 0 (properly = 0)
// CHECK: postdominates(4, 0) = 0 (properly = 0)
// CHECK: postdominates(4, 1) = 0 (properly = 0)
// CHECK: postdominates(4, 2) = 0 (properly = 0)
// CHECK: postdominates(4, 3) = 1 (properly = 1)
// CHECK: postdominates(4, 4) = 1 (properly = 0)
// CHECK: postdominates(4, 5) = 0 (properly = 0)
// CHECK: postdominates(4, 6) = 0 (properly = 0)
// CHECK: postdominates(5, 0) = 1 (properly = 1)
// CHECK: postdominates(5, 1) = 1 (properly = 1)
// CHECK: postdominates(5, 2) = 1 (properly = 1)
// CHECK: postdominates(5, 3) = 1 (properly = 1)
// CHECK: postdominates(5, 4) = 1 (properly = 1)
// CHECK: postdominates(5, 5) = 1 (properly = 0)
// CHECK: postdominates(5, 6) = 0 (properly = 0)
// CHECK: postdominates(6, 0) = 1 (properly = 1)
// CHECK: postdominates(6, 1) = 1 (properly = 1)
// CHECK: postdominates(6, 2) = 1 (properly = 1)
// CHECK: postdominates(6, 3) = 1 (properly = 1)
// CHECK: postdominates(6, 4) = 1 (properly = 1)
// CHECK: postdominates(6, 5) = 1 (properly = 1)
// CHECK: postdominates(6, 6) = 1 (properly = 1)
// CHECK: module attributes {test.block_ids = array<i64: 6>} {
// CHECK: func.func @func_loop_nested_region({{.*}}) attributes {test.block_ids = array<i64: 0, 1, 2, 5>} {
// CHECK: ^{{.*}}
// CHECK: ^{{.*}}
// CHECK: scf.for {{.*}} {
// CHECK: scf.for {{.*}} {
// CHECK: } {test.block_ids = array<i64: 3>}
// CHECK: } {test.block_ids = array<i64: 4>}
// CHECK: ^{{.*}}
// CHECK: }
// CHECK: }