xref: /llvm-project/mlir/test/python/dialects/transform_interpreter.py (revision 73140daebbf522dbb14dc4b2f3c67dc0aa1a62dd)
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
4991f11611SOleksandr "Alex" Zinenkodef failed():
5091f11611SOleksandr "Alex" Zinenko    payload = ir.Module.parse("module attributes { this.is.payload } {}")
5191f11611SOleksandr "Alex" Zinenko    try:
5291f11611SOleksandr "Alex" Zinenko        interp.apply_named_sequence(payload, payload, payload)
5391f11611SOleksandr "Alex" Zinenko    except ValueError as e:
5491f11611SOleksandr "Alex" Zinenko        assert (
5591f11611SOleksandr "Alex" Zinenko            "must implement TransformOpInterface to be used as transform root" in str(e)
5691f11611SOleksandr "Alex" Zinenko        )
57*73140daeSOleksandr "Alex" Zinenko
58*73140daeSOleksandr "Alex" Zinenko
59*73140daeSOleksandr "Alex" Zinenkoprint_root_via_include_module = """
60*73140daeSOleksandr "Alex" Zinenkomodule @print_root_via_include_module attributes {transform.with_named_sequence} {
61*73140daeSOleksandr "Alex" Zinenko  transform.named_sequence private @callee1(%root: !transform.any_op {transform.readonly})
62*73140daeSOleksandr "Alex" Zinenko  transform.named_sequence private @callee2(%root: !transform.any_op {transform.readonly})
63*73140daeSOleksandr "Alex" Zinenko  transform.named_sequence @__transform_main(%root: !transform.any_op) {
64*73140daeSOleksandr "Alex" Zinenko    transform.include @callee2 failures(propagate)
65*73140daeSOleksandr "Alex" Zinenko        (%root) : (!transform.any_op) -> ()
66*73140daeSOleksandr "Alex" Zinenko    transform.yield
67*73140daeSOleksandr "Alex" Zinenko  }
68*73140daeSOleksandr "Alex" Zinenko}"""
69*73140daeSOleksandr "Alex" Zinenko
70*73140daeSOleksandr "Alex" Zinenkocallee2_definition = """
71*73140daeSOleksandr "Alex" Zinenkomodule attributes {transform.with_named_sequence} {
72*73140daeSOleksandr "Alex" Zinenko  transform.named_sequence private @callee1(%root: !transform.any_op {transform.readonly})
73*73140daeSOleksandr "Alex" Zinenko  transform.named_sequence @callee2(%root: !transform.any_op {transform.readonly}) {
74*73140daeSOleksandr "Alex" Zinenko    transform.include @callee1 failures(propagate)
75*73140daeSOleksandr "Alex" Zinenko        (%root) : (!transform.any_op) -> ()
76*73140daeSOleksandr "Alex" Zinenko    transform.yield
77*73140daeSOleksandr "Alex" Zinenko  }
78*73140daeSOleksandr "Alex" Zinenko}
79*73140daeSOleksandr "Alex" Zinenko"""
80*73140daeSOleksandr "Alex" Zinenko
81*73140daeSOleksandr "Alex" Zinenkocallee1_definition = """
82*73140daeSOleksandr "Alex" Zinenkomodule attributes {transform.with_named_sequence} {
83*73140daeSOleksandr "Alex" Zinenko  transform.named_sequence @callee1(%root: !transform.any_op {transform.readonly}) {
84*73140daeSOleksandr "Alex" Zinenko    transform.print %root { name = \"from interpreter\" }: !transform.any_op
85*73140daeSOleksandr "Alex" Zinenko    transform.yield
86*73140daeSOleksandr "Alex" Zinenko  }
87*73140daeSOleksandr "Alex" Zinenko}
88*73140daeSOleksandr "Alex" Zinenko"""
89*73140daeSOleksandr "Alex" Zinenko
90*73140daeSOleksandr "Alex" Zinenko
91*73140daeSOleksandr "Alex" Zinenko@test_in_context
92*73140daeSOleksandr "Alex" Zinenkodef include():
93*73140daeSOleksandr "Alex" Zinenko    main = ir.Module.parse(print_root_via_include_module)
94*73140daeSOleksandr "Alex" Zinenko    callee1 = ir.Module.parse(callee1_definition)
95*73140daeSOleksandr "Alex" Zinenko    callee2 = ir.Module.parse(callee2_definition)
96*73140daeSOleksandr "Alex" Zinenko    interp.copy_symbols_and_merge_into(main, callee1)
97*73140daeSOleksandr "Alex" Zinenko    interp.copy_symbols_and_merge_into(main, callee2)
98*73140daeSOleksandr "Alex" Zinenko
99*73140daeSOleksandr "Alex" Zinenko    # CHECK: @print_root_via_include_module
100*73140daeSOleksandr "Alex" Zinenko    # CHECK: transform.named_sequence @__transform_main
101*73140daeSOleksandr "Alex" Zinenko    # CHECK: transform.include @callee2
102*73140daeSOleksandr "Alex" Zinenko    #
103*73140daeSOleksandr "Alex" Zinenko    # CHECK: transform.named_sequence @callee1
104*73140daeSOleksandr "Alex" Zinenko    # CHECK: transform.print
105*73140daeSOleksandr "Alex" Zinenko    #
106*73140daeSOleksandr "Alex" Zinenko    # CHECK: transform.named_sequence @callee2
107*73140daeSOleksandr "Alex" Zinenko    # CHECK: transform.include @callee1
108*73140daeSOleksandr "Alex" Zinenko    interp.apply_named_sequence(main, main.body.operations[0], main)
109*73140daeSOleksandr "Alex" Zinenko
110*73140daeSOleksandr "Alex" Zinenko
111*73140daeSOleksandr "Alex" Zinenko@test_in_context
112*73140daeSOleksandr "Alex" Zinenkodef partial_include():
113*73140daeSOleksandr "Alex" Zinenko    main = ir.Module.parse(print_root_via_include_module)
114*73140daeSOleksandr "Alex" Zinenko    callee2 = ir.Module.parse(callee2_definition)
115*73140daeSOleksandr "Alex" Zinenko    interp.copy_symbols_and_merge_into(main, callee2)
116*73140daeSOleksandr "Alex" Zinenko
117*73140daeSOleksandr "Alex" Zinenko    try:
118*73140daeSOleksandr "Alex" Zinenko        interp.apply_named_sequence(main, main.body.operations[0], main)
119*73140daeSOleksandr "Alex" Zinenko    except ValueError as e:
120*73140daeSOleksandr "Alex" Zinenko        assert "Failed to apply" in str(e)
121*73140daeSOleksandr "Alex" Zinenko
122*73140daeSOleksandr "Alex" Zinenko
123*73140daeSOleksandr "Alex" Zinenko@test_in_context
124*73140daeSOleksandr "Alex" Zinenkodef repeated_include():
125*73140daeSOleksandr "Alex" Zinenko    main = ir.Module.parse(print_root_via_include_module)
126*73140daeSOleksandr "Alex" Zinenko    callee2 = ir.Module.parse(callee2_definition)
127*73140daeSOleksandr "Alex" Zinenko    interp.copy_symbols_and_merge_into(main, callee2)
128*73140daeSOleksandr "Alex" Zinenko
129*73140daeSOleksandr "Alex" Zinenko    try:
130*73140daeSOleksandr "Alex" Zinenko        interp.copy_symbols_and_merge_into(main, callee2)
131*73140daeSOleksandr "Alex" Zinenko    except ValueError as e:
132*73140daeSOleksandr "Alex" Zinenko        assert "doubly defined symbol @callee2" in str(e)
133