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