Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Merged
merged 8 commits into from
Jan 19, 2025

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
Lib/test/test_opcache.py Outdated Show resolved Hide resolved
@Eclips4 Eclips4 requested a review from iritkatriel January 17, 2025 22:58
Python/specialize.c Outdated Show resolved Hide resolved
@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
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:

== 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
Python/specialize.c Outdated Show resolved Hide resolved
Python/specialize.c Outdated Show resolved Hide resolved
Python/specialize.c Outdated Show resolved Hide resolved
Python/specialize.c Show resolved Hide resolved
Lib/test/test_opcache.py Outdated Show resolved Hide resolved
@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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants