Skip to content

Mlir opt

mlir_opt

MLIROptPass dataclass

Bases: ModulePass

A pass for calling the mlir-opt tool with specified parameters. Will fail if mlir-opt is not available.

Source code in xdsl/transforms/mlir_opt.py
15
16
17
18
19
20
21
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
@dataclass(frozen=True)
class MLIROptPass(ModulePass):
    """
    A pass for calling the `mlir-opt` tool with specified parameters. Will fail if
    `mlir-opt` is not available.
    """

    name = "mlir-opt"

    executable: str = field(default="mlir-opt")
    generic: bool = field(default=True)
    arguments: tuple[str, ...] = field(default=())

    def apply(self, ctx: Context, op: ModuleOp) -> None:
        if not shutil.which(self.executable):
            raise ValueError(f"{self.executable} is not available")

        stream = StringIO()
        printer = Printer(print_generic_format=self.generic, stream=stream)
        printer.print_op(op)

        my_string = stream.getvalue()

        completed_process = subprocess.run(
            [self.executable, *self.arguments],
            input=my_string,
            capture_output=True,
            text=True,
        )

        try:
            completed_process.check_returncode()
        except subprocess.CalledProcessError as e:
            raise DiagnosticException("Error executing mlir-opt pass") from e

        # Get the stdout output
        stdout_output = completed_process.stdout
        parser = Parser(ctx, stdout_output)

        try:
            new_module = parser.parse_module()
        except ParseError as e:
            raise DiagnosticException("Error parsing mlir-opt pass output") from e

        op.detach_region(op.body)
        op.add_region(Rewriter().move_region_contents_to_new_regions(new_module.body))
        op.attributes = new_module.attributes

name = 'mlir-opt' class-attribute instance-attribute

executable: str = field(default='mlir-opt') class-attribute instance-attribute

generic: bool = field(default=True) class-attribute instance-attribute

arguments: tuple[str, ...] = field(default=()) class-attribute instance-attribute

__init__(executable: str = 'mlir-opt', generic: bool = True, arguments: tuple[str, ...] = ()) -> None

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

Source code in xdsl/transforms/mlir_opt.py
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
def apply(self, ctx: Context, op: ModuleOp) -> None:
    if not shutil.which(self.executable):
        raise ValueError(f"{self.executable} is not available")

    stream = StringIO()
    printer = Printer(print_generic_format=self.generic, stream=stream)
    printer.print_op(op)

    my_string = stream.getvalue()

    completed_process = subprocess.run(
        [self.executable, *self.arguments],
        input=my_string,
        capture_output=True,
        text=True,
    )

    try:
        completed_process.check_returncode()
    except subprocess.CalledProcessError as e:
        raise DiagnosticException("Error executing mlir-opt pass") from e

    # Get the stdout output
    stdout_output = completed_process.stdout
    parser = Parser(ctx, stdout_output)

    try:
        new_module = parser.parse_module()
    except ParseError as e:
        raise DiagnosticException("Error parsing mlir-opt pass output") from e

    op.detach_region(op.body)
    op.add_region(Rewriter().move_region_contents_to_new_regions(new_module.body))
    op.attributes = new_module.attributes