xref: /llvm-project/mlir/test/python/dialects/transform_interpreter.py (revision ff57f40673f0db2c1a867e5697d5407bc9f39a5e)
191f11611SOleksandr "Alex" Zinenko# RUN: %PYTHON %s | FileCheck %s
291f11611SOleksandr "Alex" Zinenko
391f11611SOleksandr "Alex" Zinenkofrom mlir import ir
491f11611SOleksandr "Alex" Zinenkofrom mlir.dialects.transform import interpreter as interp
591f11611SOleksandr "Alex" Zinenko
691f11611SOleksandr "Alex" Zinenko
791f11611SOleksandr "Alex" Zinenkodef test_in_context(f):
891f11611SOleksandr "Alex" Zinenko    with ir.Context(), ir.Location.unknown():
991f11611SOleksandr "Alex" Zinenko        f()
1091f11611SOleksandr "Alex" Zinenko    return f
1191f11611SOleksandr "Alex" Zinenko
1291f11611SOleksandr "Alex" Zinenko
1391f11611SOleksandr "Alex" Zinenkoprint_root_module = """
1491f11611SOleksandr "Alex" Zinenkomodule attributes {transform.with_named_sequence} {
1591f11611SOleksandr "Alex" Zinenko  transform.named_sequence @__transform_main(%root: !transform.any_op) {
1691f11611SOleksandr "Alex" Zinenko    transform.print %root { name = \"from interpreter\" }: !transform.any_op
1791f11611SOleksandr "Alex" Zinenko    transform.yield
1891f11611SOleksandr "Alex" Zinenko  }
1991f11611SOleksandr "Alex" Zinenko}"""
2091f11611SOleksandr "Alex" Zinenko
2191f11611SOleksandr "Alex" Zinenko
2291f11611SOleksandr "Alex" Zinenko@test_in_context
2391f11611SOleksandr "Alex" Zinenkodef print_self():
2491f11611SOleksandr "Alex" Zinenko    m = ir.Module.parse(print_root_module.replace("from interpreter", "print_self"))
2591f11611SOleksandr "Alex" Zinenko    interp.apply_named_sequence(m, m.body.operations[0], m)
2691f11611SOleksandr "Alex" Zinenko
2791f11611SOleksandr "Alex" Zinenko
2891f11611SOleksandr "Alex" Zinenko# CHECK-LABEL: print_self
2991f11611SOleksandr "Alex" Zinenko# CHECK: transform.named_sequence @__transform_main
3091f11611SOleksandr "Alex" Zinenko# CHECK: transform.print
3191f11611SOleksandr "Alex" Zinenko# CHECK: transform.yield
3291f11611SOleksandr "Alex" Zinenko
3391f11611SOleksandr "Alex" Zinenko
3491f11611SOleksandr "Alex" Zinenko@test_in_context
3591f11611SOleksandr "Alex" Zinenkodef print_other():
3691f11611SOleksandr "Alex" Zinenko    transform = ir.Module.parse(
3791f11611SOleksandr "Alex" Zinenko        print_root_module.replace("from interpreter", "print_other")
3891f11611SOleksandr "Alex" Zinenko    )
3991f11611SOleksandr "Alex" Zinenko    payload = ir.Module.parse("module attributes { this.is.payload } {}")
4091f11611SOleksandr "Alex" Zinenko    interp.apply_named_sequence(payload, transform.body.operations[0], transform)
4191f11611SOleksandr "Alex" Zinenko
4291f11611SOleksandr "Alex" Zinenko
4391f11611SOleksandr "Alex" Zinenko# CHECK-LABEL: print_other
4491f11611SOleksandr "Alex" Zinenko# CHECK-NOT: transform
4591f11611SOleksandr "Alex" Zinenko# CHECK: this.is.payload
4691f11611SOleksandr "Alex" Zinenko
4791f11611SOleksandr "Alex" Zinenko
4891f11611SOleksandr "Alex" Zinenko@test_in_context
49*ff57f406SOleksandr "Alex" Zinenkodef transform_options():
50*ff57f406SOleksandr "Alex" Zinenko    options = interp.TransformOptions()
51*ff57f406SOleksandr "Alex" Zinenko    options.expensive_checks = False
52*ff57f406SOleksandr "Alex" Zinenko    options.enforce_single_top_level_transform_op = True
53*ff57f406SOleksandr "Alex" Zinenko    m = ir.Module.parse(
54*ff57f406SOleksandr "Alex" Zinenko        print_root_module.replace("from interpreter", "transform_options")
55*ff57f406SOleksandr "Alex" Zinenko    )
56*ff57f406SOleksandr "Alex" Zinenko    payload = ir.Module.parse("module attributes { this.is.payload } {}")
57*ff57f406SOleksandr "Alex" Zinenko    interp.apply_named_sequence(payload, m.body.operations[0], m, options)
58*ff57f406SOleksandr "Alex" Zinenko
59*ff57f406SOleksandr "Alex" Zinenko
60*ff57f406SOleksandr "Alex" Zinenko# CHECK-LABEL: transform_options
61*ff57f406SOleksandr "Alex" Zinenko
62*ff57f406SOleksandr "Alex" Zinenko
63*ff57f406SOleksandr "Alex" Zinenko@test_in_context
6491f11611SOleksandr "Alex" Zinenkodef failed():
6591f11611SOleksandr "Alex" Zinenko    payload = ir.Module.parse("module attributes { this.is.payload } {}")
6691f11611SOleksandr "Alex" Zinenko    try:
6791f11611SOleksandr "Alex" Zinenko        interp.apply_named_sequence(payload, payload, payload)
6891f11611SOleksandr "Alex" Zinenko    except ValueError as e:
6991f11611SOleksandr "Alex" Zinenko        assert (
7091f11611SOleksandr "Alex" Zinenko            "must implement TransformOpInterface to be used as transform root" in str(e)
7191f11611SOleksandr "Alex" Zinenko        )
7273140daeSOleksandr "Alex" Zinenko
7373140daeSOleksandr "Alex" Zinenko
7473140daeSOleksandr "Alex" Zinenkoprint_root_via_include_module = """
7573140daeSOleksandr "Alex" Zinenkomodule @print_root_via_include_module attributes {transform.with_named_sequence} {
7673140daeSOleksandr "Alex" Zinenko  transform.named_sequence private @callee1(%root: !transform.any_op {transform.readonly})
7773140daeSOleksandr "Alex" Zinenko  transform.named_sequence private @callee2(%root: !transform.any_op {transform.readonly})
7873140daeSOleksandr "Alex" Zinenko  transform.named_sequence @__transform_main(%root: !transform.any_op) {
7973140daeSOleksandr "Alex" Zinenko    transform.include @callee2 failures(propagate)
8073140daeSOleksandr "Alex" Zinenko        (%root) : (!transform.any_op) -> ()
8173140daeSOleksandr "Alex" Zinenko    transform.yield
8273140daeSOleksandr "Alex" Zinenko  }
8373140daeSOleksandr "Alex" Zinenko}"""
8473140daeSOleksandr "Alex" Zinenko
8573140daeSOleksandr "Alex" Zinenkocallee2_definition = """
8673140daeSOleksandr "Alex" Zinenkomodule attributes {transform.with_named_sequence} {
8773140daeSOleksandr "Alex" Zinenko  transform.named_sequence private @callee1(%root: !transform.any_op {transform.readonly})
8873140daeSOleksandr "Alex" Zinenko  transform.named_sequence @callee2(%root: !transform.any_op {transform.readonly}) {
8973140daeSOleksandr "Alex" Zinenko    transform.include @callee1 failures(propagate)
9073140daeSOleksandr "Alex" Zinenko        (%root) : (!transform.any_op) -> ()
9173140daeSOleksandr "Alex" Zinenko    transform.yield
9273140daeSOleksandr "Alex" Zinenko  }
9373140daeSOleksandr "Alex" Zinenko}
9473140daeSOleksandr "Alex" Zinenko"""
9573140daeSOleksandr "Alex" Zinenko
9673140daeSOleksandr "Alex" Zinenkocallee1_definition = """
9773140daeSOleksandr "Alex" Zinenkomodule attributes {transform.with_named_sequence} {
9873140daeSOleksandr "Alex" Zinenko  transform.named_sequence @callee1(%root: !transform.any_op {transform.readonly}) {
9973140daeSOleksandr "Alex" Zinenko    transform.print %root { name = \"from interpreter\" }: !transform.any_op
10073140daeSOleksandr "Alex" Zinenko    transform.yield
10173140daeSOleksandr "Alex" Zinenko  }
10273140daeSOleksandr "Alex" Zinenko}
10373140daeSOleksandr "Alex" Zinenko"""
10473140daeSOleksandr "Alex" Zinenko
10573140daeSOleksandr "Alex" Zinenko
10673140daeSOleksandr "Alex" Zinenko@test_in_context
10773140daeSOleksandr "Alex" Zinenkodef include():
10873140daeSOleksandr "Alex" Zinenko    main = ir.Module.parse(print_root_via_include_module)
10973140daeSOleksandr "Alex" Zinenko    callee1 = ir.Module.parse(callee1_definition)
11073140daeSOleksandr "Alex" Zinenko    callee2 = ir.Module.parse(callee2_definition)
11173140daeSOleksandr "Alex" Zinenko    interp.copy_symbols_and_merge_into(main, callee1)
11273140daeSOleksandr "Alex" Zinenko    interp.copy_symbols_and_merge_into(main, callee2)
11373140daeSOleksandr "Alex" Zinenko
11473140daeSOleksandr "Alex" Zinenko    # CHECK: @print_root_via_include_module
11573140daeSOleksandr "Alex" Zinenko    # CHECK: transform.named_sequence @__transform_main
11673140daeSOleksandr "Alex" Zinenko    # CHECK: transform.include @callee2
11773140daeSOleksandr "Alex" Zinenko    #
11873140daeSOleksandr "Alex" Zinenko    # CHECK: transform.named_sequence @callee1
11973140daeSOleksandr "Alex" Zinenko    # CHECK: transform.print
12073140daeSOleksandr "Alex" Zinenko    #
12173140daeSOleksandr "Alex" Zinenko    # CHECK: transform.named_sequence @callee2
12273140daeSOleksandr "Alex" Zinenko    # CHECK: transform.include @callee1
12373140daeSOleksandr "Alex" Zinenko    interp.apply_named_sequence(main, main.body.operations[0], main)
12473140daeSOleksandr "Alex" Zinenko
12573140daeSOleksandr "Alex" Zinenko
12673140daeSOleksandr "Alex" Zinenko@test_in_context
12773140daeSOleksandr "Alex" Zinenkodef partial_include():
12873140daeSOleksandr "Alex" Zinenko    main = ir.Module.parse(print_root_via_include_module)
12973140daeSOleksandr "Alex" Zinenko    callee2 = ir.Module.parse(callee2_definition)
13073140daeSOleksandr "Alex" Zinenko    interp.copy_symbols_and_merge_into(main, callee2)
13173140daeSOleksandr "Alex" Zinenko
13273140daeSOleksandr "Alex" Zinenko    try:
13373140daeSOleksandr "Alex" Zinenko        interp.apply_named_sequence(main, main.body.operations[0], main)
13473140daeSOleksandr "Alex" Zinenko    except ValueError as e:
13573140daeSOleksandr "Alex" Zinenko        assert "Failed to apply" in str(e)
13673140daeSOleksandr "Alex" Zinenko
13773140daeSOleksandr "Alex" Zinenko
13873140daeSOleksandr "Alex" Zinenko@test_in_context
13973140daeSOleksandr "Alex" Zinenkodef repeated_include():
14073140daeSOleksandr "Alex" Zinenko    main = ir.Module.parse(print_root_via_include_module)
14173140daeSOleksandr "Alex" Zinenko    callee2 = ir.Module.parse(callee2_definition)
14273140daeSOleksandr "Alex" Zinenko    interp.copy_symbols_and_merge_into(main, callee2)
14373140daeSOleksandr "Alex" Zinenko
14473140daeSOleksandr "Alex" Zinenko    try:
14573140daeSOleksandr "Alex" Zinenko        interp.copy_symbols_and_merge_into(main, callee2)
14673140daeSOleksandr "Alex" Zinenko    except ValueError as e:
14773140daeSOleksandr "Alex" Zinenko        assert "doubly defined symbol @callee2" in str(e)
148