GH-125837: Split LOAD_CONST into three.#125972
Conversation
Co-authored-by: Tomas R. <tomas.roun8@gmail.com>
I think the range is -5 -> 256 (included) right? (at least _PyLong_SMALL_INTS works that way, but maybe 256 should be excluded even though it's stored in the _PyLong_SMALL_INTS). |
I want We can always add -5,-4,-3,-2 and -1 to |
|
Performance for tier 1 appears to be about 0.5% faster. Stats show the following fraction of constants loaded:
With a reduction in increfs of immortal objects of about 20%. |
Misc/NEWS.d/next/Core_and_Builtins/2024-10-25-15-56-14.gh-issue-125837.KlCdgD.rst
Show resolved
Hide resolved
Python/flowgraph.c
Outdated
| for (int i = 0; i < b->b_iused; i++) { | ||
| if (OPCODE_HAS_CONST(b->b_instr[i].i_opcode)) { | ||
| int opcode = b->b_instr[i].i_opcode; | ||
| if (OPCODE_HAS_CONST(opcode) && opcode != LOAD_SMALL_INT) { |
There was a problem hiding this comment.
hasconst is defined in the dis docs as "Sequence of bytecodes that access a constant". I think it will make more sense if we clarify that it means "access a constant from co_consts" and then remove LOAD_SMALL_INT from hasconst and OPCODE_HAS_CONST.
There was a problem hiding this comment.
That makes sense. LOAD_COMMON_CONST is not in hasconst.
There was a problem hiding this comment.
Maybe it's worth testing whether creating integers within the range(256) will not affect co_consts?
There was a problem hiding this comment.
I don't want to go overboard on testing internal details of the bytecode compiler.
LOAD_CONST with a small int is still correct, just a bit less efficient than LOAD_SMALL_INT.
We already have plenty of tests in test_dis that test this
…om code.co_consts
* Add LOAD_CONST_IMMORTAL opcode * Add LOAD_SMALL_INT opcode * Remove RETURN_CONST opcode
* Add LOAD_CONST_IMMORTAL opcode * Add LOAD_SMALL_INT opcode * Remove RETURN_CONST opcode
Splits
LOAD_CONSTinto three instructionsLOAD_INTfor ints inrange(256). Avoids the need for a space in theco_conststuple and avoids an increfLOAD_CONST_IMMORTALfor other immortal objects. Avoids an increfLOAD_CONSTfor the remaining constantsRETURN_VALUEandRETURN_CONST#125837📚 Documentation preview 📚: https://cpython-previews--125972.org.readthedocs.build/