Skip to content

Commit 0687436

Browse files
authored
Add range to constants rewritten in ConstList2IList rewrite rule. (#576)
1 parent e9fdb04 commit 0687436

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

src/kirin/dialects/ilist/rewrite/const.py

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,24 @@ def rewrite_Statement(self, node: ir.Statement) -> RewriteResult:
3939
return RewriteResult(has_done_something=has_done_something)
4040

4141
def rewrite_Constant(self, node: Constant) -> RewriteResult:
42-
if isinstance(node.value, ir.PyAttr) and isinstance(node.value.data, list):
43-
stmt = Constant(value=IList(data=node.value.data))
42+
if not isinstance(node.value, ir.PyAttr):
43+
return RewriteResult()
44+
45+
if isinstance(data := node.value.data, list):
46+
stmt = Constant(value=IList(data=data))
47+
node.replace_by(stmt)
48+
self._rewrite_IList_type(stmt.result, data)
49+
return RewriteResult(has_done_something=True)
50+
elif isinstance(data, range):
51+
new_constant = IList(data=data, elem=types.Int)
52+
stmt = Constant(value=new_constant)
53+
# specializing the type computation since we know that a
54+
# range will always be integer typed.
55+
stmt.result.hints["const"] = const.Value(new_constant)
56+
stmt.result.type = IListType[types.Int, types.Literal(len(data))]
4457
node.replace_by(stmt)
45-
self._rewrite_IList_type(stmt.result, node.value.data)
4658
return RewriteResult(has_done_something=True)
59+
4760
return RewriteResult()
4861

4962
def _rewrite_IList_type(self, result: ir.SSAValue, data):

test/dialects/test_ilist2list.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,3 +28,18 @@ def ilist2_list():
2828
x = ilist2_list()
2929

3030
assert isinstance(x, ilist.IList)
31+
32+
33+
def test_range_rewrite():
34+
35+
r = range(10)
36+
37+
@basic_desugar
38+
def ilist_range():
39+
return r
40+
41+
ilist_range.print()
42+
43+
x = ilist_range()
44+
45+
assert isinstance(x, ilist.IList)

0 commit comments

Comments
 (0)