Uh oh!
There was an error while loading. Please reload this page.
gh-131798: Add tier-2 list specialization for STORE_SLICE - #149446
gh-131798: Add tier-2 list specialization for STORE_SLICE#149446eendebakpt wants to merge 10 commits into
Conversation
Adds a tier-2 only `_STORE_SLICE_LIST` op and a guard `_GUARD_THIRD_LIST`, plus an optimizer rule that rewrites generic `_STORE_SLICE` to the list fast path when the LHS container is (or can be guarded as) an exact list. The list path calls a new `_PyList_StoreSlice` helper that adjusts the slice indices and dispatches into `list_ass_slice_lock_held` directly, skipping the slice-object allocation and the generic `PyObject_SetItem` lookup. The tier-1 `_STORE_SLICE` opcode is left unchanged so non-list callers incur no extra branch. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Documentation build overview
|
Resolved generated pycore_uop_ids.h conflict by regenerating from bytecodes.c / optimizer_bytecodes.c. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
markshannon
left a comment
There was a problem hiding this comment.
One question, otherwise looks good.
It would be good to optimize constant slices, but that would need a change to the bytecode compiler. For another PR.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Picks up the dead-local removal from the latest commit
('Apply suggestion from @eendebakpt') in optimizer_bytecodes.c.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Ah yes. So the mechanism is: for We could:
I am leaning towards the second option (initially only in tier2 to avoid adding a tier1 opcode). Update: a branch with STORE_SUBSCR specialized is main...eendebakpt:cpython:gh-131798-store-subscr-list-slice, but there is hardly any performance gain. |
The JIT currently dispatches
STORE_SLICE(container[start:stop] = value) throughPyObject_SetItemeven when the trace has proven the container is an exact list. Adding a tier-2 specialization_STORE_SLICE_LISTskips the slice-object allocation and the generic lookup.The optimizer rewrites
_STORE_SLICE→_STORE_SLICE_LISTonly when the container's type is statically known, so non-list callers and tier-1 are unaffected. A second commit forbytearraywas added but reverted.Benchmark results on pyperformance
fannkuch(tier-2 / JIT enabled):