Skip to content

Convert scf to x86 scf

convert_scf_to_x86_scf

ScfForLowering dataclass

Bases: RewritePattern

Source code in xdsl/transforms/convert_scf_to_x86_scf.py
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
@dataclass
class ScfForLowering(RewritePattern):
    arch: Arch

    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: scf.ForOp, rewriter: PatternRewriter) -> None:
        lb, ub, step, *args = self.arch.cast_to_regs(op.operands, rewriter)
        new_region = rewriter.move_region_contents_to_new_regions(op.body)
        cast_block_args_to_regs(new_region.block, self.arch, rewriter)

        values = tuple(
            self.arch.move_value_to_unallocated(value, value_type, rewriter)
            for value, value_type in zip(args, op.iter_args.types)
        )

        cast_op_results(rewriter, op)

        new_op = rewriter.insert_op(x86_scf.ForOp(lb, ub, step, values, new_region))
        rewriter.insertion_point = InsertPoint.after(op)

        res_values = tuple(
            builtin.UnrealizedConversionCastOp.cast_one(res_value, res_value_type)
            for res_value, res_value_type in zip(new_op.results, op.results.types)
        )

        for res, (cast_op, result) in zip(op.results, res_values):
            rewriter.insert_op(cast_op)
            rewriter.replace_uses_with_if(
                res, result, lambda use: use.operation is not cast_op
            )

        rewriter.erase_op(op)

arch: Arch instance-attribute

__init__(arch: Arch) -> None

match_and_rewrite(op: scf.ForOp, rewriter: PatternRewriter) -> None

Source code in xdsl/transforms/convert_scf_to_x86_scf.py
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
@op_type_rewrite_pattern
def match_and_rewrite(self, op: scf.ForOp, rewriter: PatternRewriter) -> None:
    lb, ub, step, *args = self.arch.cast_to_regs(op.operands, rewriter)
    new_region = rewriter.move_region_contents_to_new_regions(op.body)
    cast_block_args_to_regs(new_region.block, self.arch, rewriter)

    values = tuple(
        self.arch.move_value_to_unallocated(value, value_type, rewriter)
        for value, value_type in zip(args, op.iter_args.types)
    )

    cast_op_results(rewriter, op)

    new_op = rewriter.insert_op(x86_scf.ForOp(lb, ub, step, values, new_region))
    rewriter.insertion_point = InsertPoint.after(op)

    res_values = tuple(
        builtin.UnrealizedConversionCastOp.cast_one(res_value, res_value_type)
        for res_value, res_value_type in zip(new_op.results, op.results.types)
    )

    for res, (cast_op, result) in zip(op.results, res_values):
        rewriter.insert_op(cast_op)
        rewriter.replace_uses_with_if(
            res, result, lambda use: use.operation is not cast_op
        )

    rewriter.erase_op(op)

ScfYieldLowering dataclass

Bases: RewritePattern

Source code in xdsl/transforms/convert_scf_to_x86_scf.py
77
78
79
80
81
82
83
84
85
@dataclass
class ScfYieldLowering(RewritePattern):
    arch: Arch

    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: scf.YieldOp, rewriter: PatternRewriter) -> None:
        rewriter.replace_op(
            op, x86_scf.YieldOp(*self.arch.cast_to_regs(op.operands, rewriter))
        )

arch: Arch instance-attribute

__init__(arch: Arch) -> None

match_and_rewrite(op: scf.YieldOp, rewriter: PatternRewriter) -> None

Source code in xdsl/transforms/convert_scf_to_x86_scf.py
81
82
83
84
85
@op_type_rewrite_pattern
def match_and_rewrite(self, op: scf.YieldOp, rewriter: PatternRewriter) -> None:
    rewriter.replace_op(
        op, x86_scf.YieldOp(*self.arch.cast_to_regs(op.operands, rewriter))
    )

ConvertScfToX86ScfPass dataclass

Bases: ModulePass

Source code in xdsl/transforms/convert_scf_to_x86_scf.py
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
@dataclass(frozen=True)
class ConvertScfToX86ScfPass(ModulePass):
    name = "convert-scf-to-x86-scf"

    arch: str = field(default="unknown")

    def apply(self, ctx: Context, op: builtin.ModuleOp) -> None:
        arch = Arch.arch_for_name(self.arch)
        PatternRewriteWalker(
            GreedyRewritePatternApplier(
                [
                    ScfYieldLowering(arch),
                    ScfForLowering(arch),
                ]
            )
        ).rewrite_module(op)

name = 'convert-scf-to-x86-scf' class-attribute instance-attribute

arch: str = field(default='unknown') class-attribute instance-attribute

__init__(arch: str = 'unknown') -> None

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

Source code in xdsl/transforms/convert_scf_to_x86_scf.py
 94
 95
 96
 97
 98
 99
100
101
102
103
def apply(self, ctx: Context, op: builtin.ModuleOp) -> None:
    arch = Arch.arch_for_name(self.arch)
    PatternRewriteWalker(
        GreedyRewritePatternApplier(
            [
                ScfYieldLowering(arch),
                ScfForLowering(arch),
            ]
        )
    ).rewrite_module(op)

cast_block_args_to_regs(block: Block, arch: Arch, rewriter: PatternRewriter)

Change the type of the block arguments to registers and add cast operations just after the block entry.

Source code in xdsl/transforms/convert_scf_to_x86_scf.py
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
def cast_block_args_to_regs(block: Block, arch: Arch, rewriter: PatternRewriter):
    """
    Change the type of the block arguments to registers and add cast operations just after
    the block entry.
    """

    for arg in block.args:
        rewriter.insert_op(
            cast_op := builtin.UnrealizedConversionCastOp(
                operands=[arg], result_types=[arg.type]
            ),
            InsertPoint.at_start(block),
        )
        new_val = cast_op.results[0]

        new_type = arch.register_type_for_type(arg.type).unallocated()
        rewriter.replace_uses_with_if(
            arg,
            new_val,
            lambda use: use.operation != cast_op,
        )
        rewriter.replace_value_with_new_type(arg, new_type)