Skip to content

Transforms

transforms

LengthOfMap

Bases: RewritePattern

Source code in xdsl/frontend/listlang/transforms.py
16
17
18
19
20
21
22
class LengthOfMap(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: list_dialect.LengthOp, rewriter: PatternRewriter):
        if not isa(op.li.owner, list_dialect.MapOp):
            return

        rewriter.replace_op(op, list_dialect.LengthOp(op.li.owner.li))

match_and_rewrite(op: list_dialect.LengthOp, rewriter: PatternRewriter)

Source code in xdsl/frontend/listlang/transforms.py
17
18
19
20
21
22
@op_type_rewrite_pattern
def match_and_rewrite(self, op: list_dialect.LengthOp, rewriter: PatternRewriter):
    if not isa(op.li.owner, list_dialect.MapOp):
        return

    rewriter.replace_op(op, list_dialect.LengthOp(op.li.owner.li))

MapOfMap

Bases: RewritePattern

Source code in xdsl/frontend/listlang/transforms.py
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
class MapOfMap(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: list_dialect.MapOp, rewriter: PatternRewriter):
        if not isa(op.li.owner, list_dialect.MapOp):
            return

        if op.li.uses.get_length() != 1:
            return

        first_block = op.li.owner.body.block
        second_block = op.body.block

        assert isa(first_block.last_op, list_dialect.YieldOp)
        first_block_result = first_block.last_op.yielded
        rewriter.erase_op(first_block.last_op)

        rewriter.inline_block(
            second_block, InsertPoint.at_end(first_block), [first_block_result]
        )

        rewriter.replace_value_with_new_type(op.li.owner.result, op.result.type)

        rewriter.replace_all_uses_with(op.result, op.li)
        rewriter.erase_op(op)

match_and_rewrite(op: list_dialect.MapOp, rewriter: PatternRewriter)

Source code in xdsl/frontend/listlang/transforms.py
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
@op_type_rewrite_pattern
def match_and_rewrite(self, op: list_dialect.MapOp, rewriter: PatternRewriter):
    if not isa(op.li.owner, list_dialect.MapOp):
        return

    if op.li.uses.get_length() != 1:
        return

    first_block = op.li.owner.body.block
    second_block = op.body.block

    assert isa(first_block.last_op, list_dialect.YieldOp)
    first_block_result = first_block.last_op.yielded
    rewriter.erase_op(first_block.last_op)

    rewriter.inline_block(
        second_block, InsertPoint.at_end(first_block), [first_block_result]
    )

    rewriter.replace_value_with_new_type(op.li.owner.result, op.result.type)

    rewriter.replace_all_uses_with(op.result, op.li)
    rewriter.erase_op(op)

OptimizeListOps dataclass

Bases: ModulePass

Applies optimizations to list operations.

Source code in xdsl/frontend/listlang/transforms.py
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
class OptimizeListOps(ModulePass):
    """
    Applies optimizations to list operations.
    """

    name = "optimize-lists"

    def apply(self, ctx: Context, op: builtin.ModuleOp) -> None:
        PatternRewriteWalker(
            GreedyRewritePatternApplier(
                [
                    LengthOfMap(),
                    MapOfMap(),
                ]
            ),
        ).rewrite_module(op)

name = 'optimize-lists' class-attribute instance-attribute

apply(ctx: Context, op: builtin.ModuleOp) -> None

Source code in xdsl/frontend/listlang/transforms.py
58
59
60
61
62
63
64
65
66
def apply(self, ctx: Context, op: builtin.ModuleOp) -> None:
    PatternRewriteWalker(
        GreedyRewritePatternApplier(
            [
                LengthOfMap(),
                MapOfMap(),
            ]
        ),
    ).rewrite_module(op)