File tree Expand file tree Collapse file tree 4 files changed +21
-8
lines changed
Expand file tree Collapse file tree 4 files changed +21
-8
lines changed Original file line number Diff line number Diff line change 11from typing import IO , TypeVar
22
33from kirin import emit
4- from kirin .interp import MethodTable , impl
4+ from kirin .interp import Successor , MethodTable , impl
55from kirin .emit .julia import EmitJulia
66
77from .stmts import Assert , Branch , ConditionalBranch
@@ -27,6 +27,9 @@ def emit_branch(
2727 self , interp : EmitJulia [IO_t ], frame : emit .EmitStrFrame , stmt : Branch
2828 ):
2929 interp .writeln (frame , f"@goto { interp .block_id [stmt .successor ]} ;" )
30+ frame .worklist .append (
31+ Successor (stmt .successor , frame .get_values (stmt .arguments ))
32+ )
3033 return ()
3134
3235 @impl (ConditionalBranch )
@@ -51,4 +54,11 @@ def emit_cbr(
5154 interp .writeln (frame , f"@goto { interp .block_id [stmt .else_successor ]} ;" )
5255 frame .indent -= 1
5356 interp .writeln (frame , "end" )
57+
58+ frame .worklist .append (
59+ Successor (stmt .then_successor , frame .get_values (stmt .then_arguments ))
60+ )
61+ frame .worklist .append (
62+ Successor (stmt .else_successor , frame .get_values (stmt .else_arguments ))
63+ )
5464 return ()
Original file line number Diff line number Diff line change 22from dataclasses import field , dataclass
33
44from kirin import ir , interp
5+ from kirin .worklist import WorkList
56from kirin .exceptions import FuelExhaustedError
67
78ValueType = TypeVar ("ValueType" )
89
910
1011@dataclass
1112class EmitFrame (interp .Frame [ValueType ]):
13+ worklist : WorkList [interp .Successor ] = field (default_factory = WorkList )
1214 block_ref : dict [ir .Block , ValueType ] = field (default_factory = dict )
1315
1416
@@ -51,12 +53,14 @@ def run_ssacfg_region(
5153 self , frame : FrameType , region : ir .Region
5254 ) -> ValueType | interp .Err [ValueType ]:
5355 result = self .bottom
54- for block in region .blocks :
55- block_header = self .emit_block (frame , block )
56+ frame .worklist .append (
57+ interp .Successor (region .blocks [0 ], frame .get_values (region .blocks [0 ].args ))
58+ )
59+ while (succ := frame .worklist .pop ()) is not None :
60+ block_header = self .emit_block (frame , succ .block )
5661 if isinstance (block_header , interp .Err ):
5762 return block_header
58- frame .block_ref [block ] = block_header
59-
63+ frame .block_ref [succ .block ] = block_header
6064 return result
6165
6266 def emit_attribute (self , attr : ir .Attribute ) -> ValueType :
Original file line number Diff line number Diff line change @@ -2,11 +2,13 @@ from typing import TypeVar, Iterable
22from dataclasses import field , dataclass
33
44from kirin import ir , interp
5+ from kirin .worklist import WorkList
56
67ValueType = TypeVar ("ValueType" )
78
89@dataclass
910class EmitFrame (interp .Frame [ValueType ]):
11+ worklist : WorkList [interp .Successor ] = field (default_factory = WorkList )
1012 block_ref : dict [ir .Block , ValueType ] = field (default_factory = dict )
1113
1214FrameType = TypeVar ("FrameType" , bound = EmitFrame )
Original file line number Diff line number Diff line change @@ -26,10 +26,7 @@ def foo():
2626 assert "function foo()" in generated
2727 assert "@label block_1;" in generated
2828 assert "return x" in generated
29- assert "@label block_2;" in generated
30- assert "return nothing" in generated
3129 assert "return foo" in generated
32- assert "return nothing" in generated
3330
3431
3532def test_py_stmts ():
You can’t perform that action at this time.
0 commit comments