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