diff --git a/src/kirin/dialects/scf/typeinfer.py b/src/kirin/dialects/scf/typeinfer.py index 5f7c184c8..ccac6b985 100644 --- a/src/kirin/dialects/scf/typeinfer.py +++ b/src/kirin/dialects/scf/typeinfer.py @@ -34,7 +34,10 @@ def for_loop( body_block = stmt.body.blocks[0] block_args = body_block.args - eltype = interp_.frame_eval(frame, ElType(stmt.iterable)) + eltype_stmt = ElType(stmt.iterable) + eltype = interp_.frame_eval(frame, eltype_stmt) + eltype_stmt.drop_all_references() + if not isinstance(eltype, tuple): # error return item = eltype[0] diff --git a/test/passes/test_unroll_scf.py b/test/passes/test_unroll_scf.py index 9442236d0..bc9104c9b 100644 --- a/test/passes/test_unroll_scf.py +++ b/test/passes/test_unroll_scf.py @@ -1,5 +1,5 @@ -from kirin.prelude import structural -from kirin.dialects import py, func +from kirin.prelude import structural, structural_no_opt +from kirin.dialects import py, func, ilist from kirin.passes.aggressive import UnrollScf @@ -37,3 +37,22 @@ def main(r: list[int], cond: bool): assert num_adds == 10 assert num_calls == 8 + + +def test_dce_unroll_typeinfer(): + # NOTE: tests bug in typeinfer preventing DCE from issue#564 + + @structural_no_opt + def main(): + ls = [1, 2, 3] + for i in range(1): + ls[i] = 10 + return ls + + UnrollScf(main.dialects).fixpoint(main) + + for stmt in main.callable_region.stmts(): + if isinstance(stmt, py.Constant) and isinstance( + value := stmt.value, ilist.IList + ): + assert not isinstance(value.data, range), "Unused range not eliminated!"