◐ Shell
reader mode source ↗
Skip to content

GH-101291: Rearrange the size bits in PyLongObject#102464

Merged
markshannon merged 37 commits into
python:mainfrom
faster-cpython:long-rearrange-size-bits
Mar 22, 2023
Merged

GH-101291: Rearrange the size bits in PyLongObject#102464
markshannon merged 37 commits into
python:mainfrom
faster-cpython:long-rearrange-size-bits

Conversation

@markshannon

@markshannon markshannon commented Mar 6, 2023

Copy link
Copy Markdown
Member

This PR rearranges the bits in what was ob_size, to slightly speedup the most common operations and to prepare for storing the tagged 2-complement value directly in a future PR.

The new layout is as follows:

  • Bits 0 and 1: 1 - sign. I.e. 0 for positive numbers, 1 for zero and 2 for negative numbers.
  • Bit 2 reserved (probably for the immortal bit)
  • Bits 3+ the unsigned size.

The bulk of the change is removing all the uses of Py_SIZE and Py_SETSIZE, and replacing them with a new set of inline functions.
It disturbs me how much we use unchecked casts, but that's a separate issue...

This will, inevitably, break Cython generated code again.

Performance measurement shows no significant change: https://github.com/faster-cpython/benchmarking/tree/main/results/bm-20230302-3.12.0a5%2B-ce6bfb2

…Long_SignedDigitCount which might not be optimal, but is safe.
…ion of immortal ints and tagged medium ints.
52 hidden items Load more…

@gvanrossum gvanrossum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hide comment

As my flight might depart soon here's a first batch of review comments. Still to do longobject.c, and some modules.

1 hidden conversation Load more…

@gvanrossum gvanrossum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hide comment

Here's the rest. I went over every diff chunk in longobject.c. Let's get this merged...

5 hidden conversations Load more…

@gvanrossum gvanrossum left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Hide comment

Go for it!

@markshannon markshannon merged commit 7559f5f into python:main Mar 22, 2023
@markshannon markshannon deleted the long-rearrange-size-bits branch March 22, 2023 14:50
@sobolevn

Copy link
Copy Markdown
Member

I've opened #102940 to fix two new warnings from this PR :)

Fidget-Spinner pushed a commit to Fidget-Spinner/cpython that referenced this pull request Mar 27, 2023
…2464)

* Eliminate all remaining uses of Py_SIZE and Py_SET_SIZE on PyLongObject, adding asserts.

* Change layout of size/sign bits in longobject to support future addition of immortal ints and tagged medium ints.

* Add functions to hide some internals of long object, and for setting sign and digit count.

* Replace uses of IS_MEDIUM_VALUE macro with _PyLong_IsCompact().
@scoder

scoder commented Mar 28, 2023

Copy link
Copy Markdown
Contributor

ISTM that the simple accessor functions like IsZero, IsPositive, IsNegative should be publicly available.

What about this part? Looks like it was dropped on the floor along the way.

warsaw pushed a commit to warsaw/cpython that referenced this pull request Apr 11, 2023
…2464)

* Eliminate all remaining uses of Py_SIZE and Py_SET_SIZE on PyLongObject, adding asserts.

* Change layout of size/sign bits in longobject to support future addition of immortal ints and tagged medium ints.

* Add functions to hide some internals of long object, and for setting sign and digit count.

* Replace uses of IS_MEDIUM_VALUE macro with _PyLong_IsCompact().
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

9 participants