Skip to content

Region utils

region_utils

Collection of helpers for dealing with Regions, similar to RegionUtils.cpp in MLIR.

iter_used_values_defined_above(region: Region, limit: Region | None = None)

An iterator over the values used within region defined outside of limit. If limit is None, it is set to region. Values may be repeated.

Source code in xdsl/ir/region_utils.py
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
def iter_used_values_defined_above(region: Region, limit: Region | None = None):
    """
    An iterator over the values used within `region` defined outside of `limit`.
    If `limit` is `None`, it is set to `region`.
    Values may be repeated.
    """
    if limit is not None:
        assert limit.is_ancestor(region), (
            "expected isolation limit to be an ancestor of the given region"
        )
    else:
        limit = region

    # Collect proper ancestors of `limit` upfront to avoid traversing the region
    # tree for every value.
    proper_ancestors = set[Region]()
    ancestor = limit.parent_region()
    while ancestor is not None:
        proper_ancestors.add(ancestor)
        ancestor = ancestor.parent_region()

    for op in region.walk():
        for operand in op.operands:
            if operand.owner.parent_region() in proper_ancestors:
                yield operand

used_values_defined_above(region: Region, limit: Region | None = None)

The set of values used within region defined outside of limit. If limit is None, it is set to region.

Source code in xdsl/ir/region_utils.py
35
36
37
38
39
40
def used_values_defined_above(region: Region, limit: Region | None = None):
    """
    The set of values used within `region` defined outside of `limit`.
    If `limit` is `None`, it is set to `region`.
    """
    return set(iter_used_values_defined_above(region, limit))