Skip to content

Commit 99397cc

Browse files
authored
use a worklist for emit (#128)
1 parent 885b70f commit 99397cc

File tree

4 files changed

+21
-8
lines changed

4 files changed

+21
-8
lines changed

src/kirin/dialects/cf/emit.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import IO, TypeVar
22

33
from kirin import emit
4-
from kirin.interp import MethodTable, impl
4+
from kirin.interp import Successor, MethodTable, impl
55
from kirin.emit.julia import EmitJulia
66

77
from .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 ()

src/kirin/emit/abc.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@
22
from dataclasses import field, dataclass
33

44
from kirin import ir, interp
5+
from kirin.worklist import WorkList
56
from kirin.exceptions import FuelExhaustedError
67

78
ValueType = TypeVar("ValueType")
89

910

1011
@dataclass
1112
class 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:

src/kirin/emit/abc.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ from typing import TypeVar, Iterable
22
from dataclasses import field, dataclass
33

44
from kirin import ir, interp
5+
from kirin.worklist import WorkList
56

67
ValueType = TypeVar("ValueType")
78

89
@dataclass
910
class 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

1214
FrameType = TypeVar("FrameType", bound=EmitFrame)

test/emit/test_julia.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff 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

3532
def test_py_stmts():

0 commit comments

Comments
 (0)