Skip to content

Commit af99ebc

Browse files
authored
[mypyc] Fix type of for loop index register in for over range (#9634)
It sometimes was short int even though it should have been int.
1 parent 8fd20eb commit af99ebc

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

mypyc/irbuild/for_helpers.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
)
1818
from mypyc.ir.rtypes import (
1919
RType, is_short_int_rprimitive, is_list_rprimitive, is_sequence_rprimitive,
20-
RTuple, is_dict_rprimitive, short_int_rprimitive
20+
RTuple, is_dict_rprimitive, short_int_rprimitive, int_rprimitive
2121
)
2222
from mypyc.primitives.registry import CFunctionDescription
2323
from mypyc.primitives.dict_ops import (
@@ -605,7 +605,11 @@ def init(self, start_reg: Value, end_reg: Value, step: int) -> None:
605605
self.end_reg = end_reg
606606
self.step = step
607607
self.end_target = builder.maybe_spill(end_reg)
608-
index_reg = builder.alloc_temp(start_reg.type)
608+
if is_short_int_rprimitive(start_reg.type) and is_short_int_rprimitive(end_reg.type):
609+
index_type = short_int_rprimitive
610+
else:
611+
index_type = int_rprimitive
612+
index_reg = builder.alloc_temp(index_type)
609613
builder.assign(index_reg, start_reg, -1)
610614
self.index_reg = builder.maybe_spill_assignable(index_reg)
611615
# Initialize loop index to 0. Assert that the index target is assignable.

mypyc/test-data/irbuild-statements.test

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,47 @@ L3:
2929
L4:
3030
return 1
3131

32+
[case testForInRangeVariableEndIndxe]
33+
def f(a: int) -> None:
34+
for i in range(a):
35+
pass
36+
[out]
37+
def f(a):
38+
a, r0, i :: int
39+
r1 :: bool
40+
r2 :: native_int
41+
r3 :: bit
42+
r4 :: native_int
43+
r5, r6, r7, r8 :: bit
44+
r9 :: int
45+
L0:
46+
r0 = 0
47+
i = r0
48+
L1:
49+
r2 = r0 & 1
50+
r3 = r2 == 0
51+
r4 = a & 1
52+
r5 = r4 == 0
53+
r6 = r3 & r5
54+
if r6 goto L2 else goto L3 :: bool
55+
L2:
56+
r7 = r0 < a :: signed
57+
r1 = r7
58+
goto L4
59+
L3:
60+
r8 = CPyTagged_IsLt_(r0, a)
61+
r1 = r8
62+
L4:
63+
if r1 goto L5 else goto L7 :: bool
64+
L5:
65+
L6:
66+
r9 = CPyTagged_Add(r0, 2)
67+
r0 = r9
68+
i = r9
69+
goto L1
70+
L7:
71+
return 1
72+
3273
[case testForInNegativeRange]
3374
def f() -> None:
3475
for i in range(10, 0, -1):

0 commit comments

Comments
 (0)