Skip to content

Convert scf to riscv scf

convert_scf_to_riscv_scf

ScfForLowering

Bases: RewritePattern

Source code in xdsl/backend/riscv/lowering/convert_scf_to_riscv_scf.py
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class ScfForLowering(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: scf.ForOp, rewriter: PatternRewriter) -> None:
        lb, ub, step, *args = cast_operands_to_regs(rewriter, op)
        new_region = rewriter.move_region_contents_to_new_regions(op.body)
        cast_block_args_to_regs(new_region.block, rewriter)
        mv_ops, values = move_to_unallocated_regs(args, op.iter_args.types)
        rewriter.insert_op(mv_ops)
        cast_op_results(rewriter, op)
        new_op = riscv_scf.ForOp(lb, ub, step, values, new_region)

        new_ops = list[Operation]()
        new_values = list[SSAValue]()

        for value, value_type in zip(new_op.results, op.iter_args.types, strict=True):
            register_type = register_type_for_type(value.type)
            move_op, new_value = move_ops_for_value(
                value, value_type, register_type.unallocated()
            )
            new_ops.append(move_op)
            new_values.append(new_value)

        mv_res_ops, res_values = new_ops, new_values

        rewriter.replace_op(op, (new_op, *mv_res_ops), res_values)

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

Source code in xdsl/backend/riscv/lowering/convert_scf_to_riscv_scf.py
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
@op_type_rewrite_pattern
def match_and_rewrite(self, op: scf.ForOp, rewriter: PatternRewriter) -> None:
    lb, ub, step, *args = cast_operands_to_regs(rewriter, op)
    new_region = rewriter.move_region_contents_to_new_regions(op.body)
    cast_block_args_to_regs(new_region.block, rewriter)
    mv_ops, values = move_to_unallocated_regs(args, op.iter_args.types)
    rewriter.insert_op(mv_ops)
    cast_op_results(rewriter, op)
    new_op = riscv_scf.ForOp(lb, ub, step, values, new_region)

    new_ops = list[Operation]()
    new_values = list[SSAValue]()

    for value, value_type in zip(new_op.results, op.iter_args.types, strict=True):
        register_type = register_type_for_type(value.type)
        move_op, new_value = move_ops_for_value(
            value, value_type, register_type.unallocated()
        )
        new_ops.append(move_op)
        new_values.append(new_value)

    mv_res_ops, res_values = new_ops, new_values

    rewriter.replace_op(op, (new_op, *mv_res_ops), res_values)

ScfYieldLowering

Bases: RewritePattern

Source code in xdsl/backend/riscv/lowering/convert_scf_to_riscv_scf.py
49
50
51
52
class ScfYieldLowering(RewritePattern):
    @op_type_rewrite_pattern
    def match_and_rewrite(self, op: scf.YieldOp, rewriter: PatternRewriter) -> None:
        rewriter.replace_op(op, riscv_scf.YieldOp(*cast_operands_to_regs(rewriter, op)))

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

Source code in xdsl/backend/riscv/lowering/convert_scf_to_riscv_scf.py
50
51
52
@op_type_rewrite_pattern
def match_and_rewrite(self, op: scf.YieldOp, rewriter: PatternRewriter) -> None:
    rewriter.replace_op(op, riscv_scf.YieldOp(*cast_operands_to_regs(rewriter, op)))

ConvertScfToRiscvPass dataclass

Bases: ModulePass

Source code in xdsl/backend/riscv/lowering/convert_scf_to_riscv_scf.py
55
56
57
58
59
60
61
62
63
64
65
66
class ConvertScfToRiscvPass(ModulePass):
    name = "convert-scf-to-riscv-scf"

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

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

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

Source code in xdsl/backend/riscv/lowering/convert_scf_to_riscv_scf.py
58
59
60
61
62
63
64
65
66
def apply(self, ctx: Context, op: builtin.ModuleOp) -> None:
    PatternRewriteWalker(
        GreedyRewritePatternApplier(
            [
                ScfYieldLowering(),
                ScfForLowering(),
            ]
        )
    ).rewrite_module(op)