From 61c64c90f392bca291011eca9fca6b51dbede10e Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Wed, 12 Nov 2025 14:02:42 -0500 Subject: [PATCH 1/4] adding logic to canonicalize constant range(...) values to IList(range(...)) --- src/kirin/dialects/ilist/rewrite/const.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/kirin/dialects/ilist/rewrite/const.py b/src/kirin/dialects/ilist/rewrite/const.py index dedf58181..ba162a187 100644 --- a/src/kirin/dialects/ilist/rewrite/const.py +++ b/src/kirin/dialects/ilist/rewrite/const.py @@ -39,11 +39,20 @@ def rewrite_Statement(self, node: ir.Statement) -> RewriteResult: return RewriteResult(has_done_something=has_done_something) def rewrite_Constant(self, node: Constant) -> RewriteResult: - if isinstance(node.value, ir.PyAttr) and isinstance(node.value.data, list): + if not isinstance(node.value, ir.PyAttr): + return RewriteResult() + + if isinstance(data := node.value.data, (list)): stmt = Constant(value=IList(data=node.value.data)) node.replace_by(stmt) self._rewrite_IList_type(stmt.result, node.value.data) return RewriteResult(has_done_something=True) + elif isinstance(data, range): + stmt = Constant(value=IList(data=data, elem=types.Int)) + node.replace_by(stmt) + self._rewrite_IList_type(stmt.result, list(data)) + return RewriteResult(has_done_something=True) + return RewriteResult() def _rewrite_IList_type(self, result: ir.SSAValue, data): From 545ce2e0b3b6e6280ee22384161b0e03187cb5f2 Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Wed, 12 Nov 2025 14:11:23 -0500 Subject: [PATCH 2/4] adding test --- test/dialects/test_ilist2list.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/test/dialects/test_ilist2list.py b/test/dialects/test_ilist2list.py index 14bad06ee..4dcea6842 100644 --- a/test/dialects/test_ilist2list.py +++ b/test/dialects/test_ilist2list.py @@ -28,3 +28,18 @@ def ilist2_list(): x = ilist2_list() assert isinstance(x, ilist.IList) + + +def test_range_rewrite(): + + r = range(10) + + @basic_desugar + def ilist_range(): + return r + + ilist_range.print() + + x = ilist_range() + + assert isinstance(x, ilist.IList) From 7aa5096ef4e67a9ca2a2a6094020d46dc647bf8b Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Wed, 12 Nov 2025 14:19:06 -0500 Subject: [PATCH 3/4] simplfying type and hint updates --- src/kirin/dialects/ilist/rewrite/const.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/kirin/dialects/ilist/rewrite/const.py b/src/kirin/dialects/ilist/rewrite/const.py index ba162a187..39b0b8f6a 100644 --- a/src/kirin/dialects/ilist/rewrite/const.py +++ b/src/kirin/dialects/ilist/rewrite/const.py @@ -42,15 +42,17 @@ def rewrite_Constant(self, node: Constant) -> RewriteResult: if not isinstance(node.value, ir.PyAttr): return RewriteResult() - if isinstance(data := node.value.data, (list)): - stmt = Constant(value=IList(data=node.value.data)) + if isinstance(data := node.value.data, list): + stmt = Constant(value=IList(data=data)) node.replace_by(stmt) - self._rewrite_IList_type(stmt.result, node.value.data) + self._rewrite_IList_type(stmt.result, data) return RewriteResult(has_done_something=True) elif isinstance(data, range): - stmt = Constant(value=IList(data=data, elem=types.Int)) + new_constant = IList(data=data, elem=types.Int) + stmt = Constant(value=new_constant) + stmt.result.hints["const"] = const.Value(new_constant) + stmt.result.type = IListType[types.Int, types.Literal(len(data))] node.replace_by(stmt) - self._rewrite_IList_type(stmt.result, list(data)) return RewriteResult(has_done_something=True) return RewriteResult() From 7524aa39f0e3a93432ed94b72e39b38b93a4d29e Mon Sep 17 00:00:00 2001 From: Phillip Weinberg Date: Wed, 12 Nov 2025 14:20:20 -0500 Subject: [PATCH 4/4] simplfying type and hint updates --- src/kirin/dialects/ilist/rewrite/const.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/kirin/dialects/ilist/rewrite/const.py b/src/kirin/dialects/ilist/rewrite/const.py index 39b0b8f6a..81eb3cf95 100644 --- a/src/kirin/dialects/ilist/rewrite/const.py +++ b/src/kirin/dialects/ilist/rewrite/const.py @@ -50,6 +50,8 @@ def rewrite_Constant(self, node: Constant) -> RewriteResult: elif isinstance(data, range): new_constant = IList(data=data, elem=types.Int) stmt = Constant(value=new_constant) + # specializing the type computation since we know that a + # range will always be integer typed. stmt.result.hints["const"] = const.Value(new_constant) stmt.result.type = IListType[types.Int, types.Literal(len(data))] node.replace_by(stmt)