Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit e1ac8b2

Browse files
authored
[mypyc] Check both operands when op is not eq or neq (#9148)
This fixes a bug I found during merging int logical ops.
1 parent b363204 commit e1ac8b2

4 files changed

Lines changed: 261 additions & 167 deletions

File tree

mypyc/irbuild/ll_builder.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,14 @@ def compare_tagged(self, lhs: Value, rhs: Value, op: str, line: int) -> Value:
576576
op_type, c_func_desc = int_logical_op_mapping[op]
577577
result = self.alloc_temp(bool_rprimitive)
578578
short_int_block, int_block, out = BasicBlock(), BasicBlock(), BasicBlock()
579-
check = self.check_tagged_short_int(lhs, line)
579+
check_lhs = self.check_tagged_short_int(lhs, line)
580+
if op in ("==", "!="):
581+
check = check_lhs
582+
else:
583+
# for non-equal logical ops(less than, greater than, etc.), need to check both side
584+
check_rhs = self.check_tagged_short_int(rhs, line)
585+
check = self.binary_int_op(bool_rprimitive, check_lhs,
586+
check_rhs, BinaryIntOp.AND, line)
580587
branch = Branch(check, short_int_block, int_block, Branch.BOOL_EXPR)
581588
branch.negated = False
582589
self.add(branch)

mypyc/test-data/analysis.test

Lines changed: 76 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -370,84 +370,108 @@ def f(a):
370370
a :: int
371371
r0 :: bool
372372
r1, r2, r3 :: native_int
373-
r4, r5, r6, r7 :: bool
374-
r8, r9, r10 :: native_int
375-
r11, r12, r13 :: bool
373+
r4 :: bool
374+
r5, r6, r7 :: native_int
375+
r8, r9, r10, r11, r12 :: bool
376+
r13, r14, r15 :: native_int
377+
r16 :: bool
378+
r17, r18, r19 :: native_int
379+
r20, r21, r22, r23 :: bool
376380
y, x :: int
377-
r14 :: None
381+
r24 :: None
378382
L0:
379383
L1:
380384
r1 = 1
381385
r2 = a & r1
382386
r3 = 0
383387
r4 = r2 == r3
384-
if r4 goto L2 else goto L3 :: bool
388+
r5 = 1
389+
r6 = a & r5
390+
r7 = 0
391+
r8 = r6 == r7
392+
r9 = r4 & r8
393+
if r9 goto L2 else goto L3 :: bool
385394
L2:
386-
r5 = a < a
387-
r0 = r5
395+
r10 = a < a
396+
r0 = r10
388397
goto L4
389398
L3:
390-
r6 = CPyTagged_IsLt_(a, a)
391-
r0 = r6
399+
r11 = CPyTagged_IsLt_(a, a)
400+
r0 = r11
392401
L4:
393402
if r0 goto L5 else goto L12 :: bool
394403
L5:
395404
L6:
396-
r8 = 1
397-
r9 = a & r8
398-
r10 = 0
399-
r11 = r9 == r10
400-
if r11 goto L7 else goto L8 :: bool
405+
r13 = 1
406+
r14 = a & r13
407+
r15 = 0
408+
r16 = r14 == r15
409+
r17 = 1
410+
r18 = a & r17
411+
r19 = 0
412+
r20 = r18 == r19
413+
r21 = r16 & r20
414+
if r21 goto L7 else goto L8 :: bool
401415
L7:
402-
r12 = a < a
403-
r7 = r12
416+
r22 = a < a
417+
r12 = r22
404418
goto L9
405419
L8:
406-
r13 = CPyTagged_IsLt_(a, a)
407-
r7 = r13
420+
r23 = CPyTagged_IsLt_(a, a)
421+
r12 = r23
408422
L9:
409-
if r7 goto L10 else goto L11 :: bool
423+
if r12 goto L10 else goto L11 :: bool
410424
L10:
411425
y = a
412426
goto L6
413427
L11:
414428
x = a
415429
goto L1
416430
L12:
417-
r14 = None
418-
return r14
431+
r24 = None
432+
return r24
419433
(0, 0) {a} {a}
420-
(1, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
421-
(1, 1) {a, r0, r7, x, y} {a, r0, r7, x, y}
422-
(1, 2) {a, r0, r7, x, y} {a, r0, r7, x, y}
423-
(1, 3) {a, r0, r7, x, y} {a, r0, r7, x, y}
424-
(1, 4) {a, r0, r7, x, y} {a, r0, r7, x, y}
425-
(2, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
426-
(2, 1) {a, r0, r7, x, y} {a, r0, r7, x, y}
427-
(2, 2) {a, r0, r7, x, y} {a, r0, r7, x, y}
428-
(3, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
429-
(3, 1) {a, r0, r7, x, y} {a, r0, r7, x, y}
430-
(3, 2) {a, r0, r7, x, y} {a, r0, r7, x, y}
431-
(4, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
432-
(5, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
433-
(6, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
434-
(6, 1) {a, r0, r7, x, y} {a, r0, r7, x, y}
435-
(6, 2) {a, r0, r7, x, y} {a, r0, r7, x, y}
436-
(6, 3) {a, r0, r7, x, y} {a, r0, r7, x, y}
437-
(6, 4) {a, r0, r7, x, y} {a, r0, r7, x, y}
438-
(7, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
439-
(7, 1) {a, r0, r7, x, y} {a, r0, r7, x, y}
440-
(7, 2) {a, r0, r7, x, y} {a, r0, r7, x, y}
441-
(8, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
442-
(8, 1) {a, r0, r7, x, y} {a, r0, r7, x, y}
443-
(8, 2) {a, r0, r7, x, y} {a, r0, r7, x, y}
444-
(9, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
445-
(10, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
446-
(10, 1) {a, r0, r7, x, y} {a, r0, r7, x, y}
447-
(11, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
448-
(11, 1) {a, r0, r7, x, y} {a, r0, r7, x, y}
449-
(12, 0) {a, r0, r7, x, y} {a, r0, r7, x, y}
450-
(12, 1) {a, r0, r7, x, y} {a, r0, r7, x, y}
434+
(1, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
435+
(1, 1) {a, r0, r12, x, y} {a, r0, r12, x, y}
436+
(1, 2) {a, r0, r12, x, y} {a, r0, r12, x, y}
437+
(1, 3) {a, r0, r12, x, y} {a, r0, r12, x, y}
438+
(1, 4) {a, r0, r12, x, y} {a, r0, r12, x, y}
439+
(1, 5) {a, r0, r12, x, y} {a, r0, r12, x, y}
440+
(1, 6) {a, r0, r12, x, y} {a, r0, r12, x, y}
441+
(1, 7) {a, r0, r12, x, y} {a, r0, r12, x, y}
442+
(1, 8) {a, r0, r12, x, y} {a, r0, r12, x, y}
443+
(1, 9) {a, r0, r12, x, y} {a, r0, r12, x, y}
444+
(2, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
445+
(2, 1) {a, r0, r12, x, y} {a, r0, r12, x, y}
446+
(2, 2) {a, r0, r12, x, y} {a, r0, r12, x, y}
447+
(3, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
448+
(3, 1) {a, r0, r12, x, y} {a, r0, r12, x, y}
449+
(3, 2) {a, r0, r12, x, y} {a, r0, r12, x, y}
450+
(4, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
451+
(5, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
452+
(6, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
453+
(6, 1) {a, r0, r12, x, y} {a, r0, r12, x, y}
454+
(6, 2) {a, r0, r12, x, y} {a, r0, r12, x, y}
455+
(6, 3) {a, r0, r12, x, y} {a, r0, r12, x, y}
456+
(6, 4) {a, r0, r12, x, y} {a, r0, r12, x, y}
457+
(6, 5) {a, r0, r12, x, y} {a, r0, r12, x, y}
458+
(6, 6) {a, r0, r12, x, y} {a, r0, r12, x, y}
459+
(6, 7) {a, r0, r12, x, y} {a, r0, r12, x, y}
460+
(6, 8) {a, r0, r12, x, y} {a, r0, r12, x, y}
461+
(6, 9) {a, r0, r12, x, y} {a, r0, r12, x, y}
462+
(7, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
463+
(7, 1) {a, r0, r12, x, y} {a, r0, r12, x, y}
464+
(7, 2) {a, r0, r12, x, y} {a, r0, r12, x, y}
465+
(8, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
466+
(8, 1) {a, r0, r12, x, y} {a, r0, r12, x, y}
467+
(8, 2) {a, r0, r12, x, y} {a, r0, r12, x, y}
468+
(9, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
469+
(10, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
470+
(10, 1) {a, r0, r12, x, y} {a, r0, r12, x, y}
471+
(11, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
472+
(11, 1) {a, r0, r12, x, y} {a, r0, r12, x, y}
473+
(12, 0) {a, r0, r12, x, y} {a, r0, r12, x, y}
474+
(12, 1) {a, r0, r12, x, y} {a, r0, r12, x, y}
451475

452476
[case testTrivial_BorrowedArgument]
453477
def f(a: int, b: int) -> int:

mypyc/test-data/exceptions.test

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -132,11 +132,13 @@ def sum(a, l):
132132
i :: int
133133
r2 :: bool
134134
r3, r4, r5 :: native_int
135-
r6, r7, r8 :: bool
136-
r9 :: object
137-
r10, r11 :: int
138-
r12 :: short_int
139-
r13, r14 :: int
135+
r6 :: bool
136+
r7, r8, r9 :: native_int
137+
r10, r11, r12, r13 :: bool
138+
r14 :: object
139+
r15, r16 :: int
140+
r17 :: short_int
141+
r18, r19 :: int
140142
L0:
141143
r0 = 0
142144
sum = r0
@@ -147,38 +149,43 @@ L1:
147149
r4 = i & r3
148150
r5 = 0
149151
r6 = r4 == r5
150-
if r6 goto L2 else goto L3 :: bool
152+
r7 = 1
153+
r8 = l & r7
154+
r9 = 0
155+
r10 = r8 == r9
156+
r11 = r6 & r10
157+
if r11 goto L2 else goto L3 :: bool
151158
L2:
152-
r7 = i < l
153-
r2 = r7
159+
r12 = i < l
160+
r2 = r12
154161
goto L4
155162
L3:
156-
r8 = CPyTagged_IsLt_(i, l)
157-
r2 = r8
163+
r13 = CPyTagged_IsLt_(i, l)
164+
r2 = r13
158165
L4:
159166
if r2 goto L5 else goto L10 :: bool
160167
L5:
161-
r9 = CPyList_GetItem(a, i)
162-
if is_error(r9) goto L11 (error at sum:6) else goto L6
168+
r14 = CPyList_GetItem(a, i)
169+
if is_error(r14) goto L11 (error at sum:6) else goto L6
163170
L6:
164-
r10 = unbox(int, r9)
165-
dec_ref r9
166-
if is_error(r10) goto L11 (error at sum:6) else goto L7
171+
r15 = unbox(int, r14)
172+
dec_ref r14
173+
if is_error(r15) goto L11 (error at sum:6) else goto L7
167174
L7:
168-
r11 = CPyTagged_Add(sum, r10)
175+
r16 = CPyTagged_Add(sum, r15)
169176
dec_ref sum :: int
170-
dec_ref r10 :: int
171-
sum = r11
172-
r12 = 1
173-
r13 = CPyTagged_Add(i, r12)
177+
dec_ref r15 :: int
178+
sum = r16
179+
r17 = 1
180+
r18 = CPyTagged_Add(i, r17)
174181
dec_ref i :: int
175-
i = r13
182+
i = r18
176183
goto L1
177184
L8:
178185
return sum
179186
L9:
180-
r14 = <error> :: int
181-
return r14
187+
r19 = <error> :: int
188+
return r19
182189
L10:
183190
dec_ref i :: int
184191
goto L8

0 commit comments

Comments
 (0)