WebSafe 3.7github.com
|
|
🏠
Skip to content

gh-100239: Handle NaN and zero division in guards#128963

Merged
Eclips4 merged 8 commits intopython:mainfrom
Eclips4:fix-zero-division
Jan 19, 2025
Merged

gh-100239: Handle NaN and zero division in guards#128963
Eclips4 merged 8 commits intopython:mainfrom
Eclips4:fix-zero-division

Conversation

@Eclips4
Copy link
Member

@Eclips4 Eclips4 commented Jan 17, 2025

@iritkatriel
Copy link
Member

Shall we check for NaN as well?

@Eclips4
Copy link
Member Author

Eclips4 commented Jan 17, 2025

Shall we check for NaN as well?

You mean "Shall we continue with specialization if we encounter a NaN value?"?
If so, I think we should add a check for NaN to all guards because I don't see any benefit in specializing to get a NaN result (As far as I remember, any operation involving NaN results in NaN).

@iritkatriel
Copy link
Member

Shall we check for NaN as well?

You mean "Shall we continue with specialization if we encounter a NaN value?"? If so, I think we should add a check for NaN to all guards because I don't see any benefit in specializing to get a NaN result (As far as I remember, any operation involving NaN results in NaN).

Yes, I guess it would be fine. Might be good to cover this in the tests though.

@Eclips4 Eclips4 changed the title gh-100239: Handle zero division in guards gh-100239: Handle NaN and zero division in guards Jan 17, 2025
@Eclips4 Eclips4 requested a review from iritkatriel January 17, 2025 22:58
@iritkatriel
Copy link
Member

Doesn't need to be in this PR, but I don't think we have a test for deoptimizing BINARY_OP_EXTEND. We should.

Eclips4 and others added 2 commits January 18, 2025 12:35
@Eclips4
Copy link
Member Author

Eclips4 commented Jan 18, 2025

Unfortunately ./python.exe -m test -v test_opcache -m test_binary_op -R 3:3 is failing:

Details
== CPython 3.14.0a4+ (heads/fix-zero-division-dirty:850a862a7d8, Jan 18 2025, 13:17:14) [Clang 16.0.0 (clang-1600.0.26.4)]
== macOS-15.1.1-arm64-arm-64bit-Mach-O little-endian
== Python build: debug
== cwd: /Users/eclips4/programming/programming-languages/cpython/build/test_python_worker_4826æ
== CPU count: 8
== encodings: locale=UTF-8 FS=utf-8
== resources: all test resources are disabled, use -u option to unskip tests

Using random seed: 548978877
0:00:00 load avg: 2.19 Run 1 test sequentially in a single process
0:00:00 load avg: 2.19 [1/1] test_opcache
beginning 6 repetitions. Showing number of leaks (. for 0 or less, X for 10 or more)
123:456
test_binary_op (test.test_opcache.TestSpecializer.test_binary_op) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.006s

OK
Xtest_binary_op (test.test_opcache.TestSpecializer.test_binary_op) ... ok

----------------------------------------------------------------------
Ran 1 test in 0.007s

OK
Xtest_binary_op (test.test_opcache.TestSpecializer.test_binary_op) ... FAIL

======================================================================
FAIL: test_binary_op (test.test_opcache.TestSpecializer.test_binary_op)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/eclips4/programming/programming-languages/cpython/Lib/test/test_opcache.py", line 1405, in test_binary_op
    binary_op_nan()
    ~~~~~~~~~~~~~^^
  File "/Users/eclips4/programming/programming-languages/cpython/Lib/test/test_opcache.py", line 1402, in binary_op_nan
    self.assert_no_opcode(compactlong_lhs, "BINARY_OP_EXTEND")
    ~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/Users/eclips4/programming/programming-languages/cpython/Lib/test/test_opcache.py", line 42, in assert_no_opcode
    self.assertNotIn(opname, opnames)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^
AssertionError: 'BINARY_OP_EXTEND' unexpectedly found in {'RESUME_CHECK', 'RETURN_VALUE', 'POP_TOP', 'LOAD_CONST_IMMORTAL', 'BINARY_OP_EXTEND', 'LOAD_SMALL_INT', 'LOAD_FAST'}

----------------------------------------------------------------------
Ran 1 test in 0.012s

FAILED (failures=1)
test test_opcache failed
test_opcache failed (1 failure)

== Tests result: FAILURE ==

1 test failed:
    test_opcache

Total duration: 174 ms
Total tests: run=1 (filtered) failures=1
Total test files: run=1/1 (filtered) failed=1
Result: FAILURE

I'm digging into what's happening.

@Eclips4
Copy link
Member Author

Eclips4 commented Jan 18, 2025

Okay, It seems that to get de-specialization it need to "hit" more guards. I'm not sure, though, if this is right.

@Eclips4 Eclips4 requested a review from iritkatriel January 18, 2025 11:46
Eclips4 and others added 2 commits January 19, 2025 11:48
Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
@Eclips4 Eclips4 enabled auto-merge (squash) January 19, 2025 10:42
Copy link
Member

@iritkatriel iritkatriel left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you!

@Eclips4
Copy link
Member Author

Eclips4 commented Jan 19, 2025

Thank you Irit and Tomas for your review!

@Eclips4 Eclips4 merged commit 6c52ada into python:main Jan 19, 2025
40 checks passed
@Eclips4 Eclips4 deleted the fix-zero-division branch January 19, 2025 14:16
srinivasreddy pushed a commit to srinivasreddy/cpython that referenced this pull request Jan 21, 2025
…P_EXTEND` (python#128963)

Co-authored-by: Tomas R. <tomas.roun8@gmail.com>
Co-authored-by: Irit Katriel <1055913+iritkatriel@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

3 participants

Comments