Skip to content

gh-146381: Fold frozendict(key=const, ...) calls to LOAD_CONST#146423

Draft
corona10 wants to merge 1 commit intopython:mainfrom
corona10:gh-146381
Draft

gh-146381: Fold frozendict(key=const, ...) calls to LOAD_CONST#146423
corona10 wants to merge 1 commit intopython:mainfrom
corona10:gh-146381

Conversation

@corona10
Copy link
Member

@corona10 corona10 commented Mar 25, 2026

This PR folds frozendict calls into LOAD_CONST at compile time.

This is a prerequisite for JIT constant folding of frozendict lookups. Without this, frozendict compiles to CALL_KW, which the JIT cannot recognize as a constant. With this change, it becomes LOAD_CONST frozendict(...), enabling the JIT to promote it and fold subscript operations like d['x'] at optimization time.

Without codegen-level folding like this, supporting frozendict constants in the JIT would likely require introducing a new literal syntax (e.g., <1: 3, 5: 6>) at the language level, and it might need a PEP for this change.

cc @vstinner

@corona10
Copy link
Member Author

corona10 commented Mar 25, 2026

## main
5           LOAD_GLOBAL              1 (frozendict + NULL)
LOAD_SMALL_INT           1
LOAD_SMALL_INT           2
LOAD_CONST               1 (('x', 'y'))
CALL_KW                  2
STORE_FAST               0 (d)


## gh-146381
5           LOAD_GLOBAL              0 (frozendict)
COPY                     1
LOAD_COMMON_CONSTANT     7 (frozendict)
IS_OP                    0 (is)
POP_JUMP_IF_FALSE        4 (to L1)
NOT_TAKEN
POP_TOP
LOAD_CONST               0 (frozendict({'x': 1, 'y': 2}))  ← compile-time constant
JUMP_FORWARD             8 (to L2)
L1:     PUSH_NULL
LOAD_SMALL_INT           1
LOAD_SMALL_INT           2
LOAD_CONST               1 (('x', 'y'))
CALL_KW                  2                                  ← fallback
L2:     STORE_FAST               0 (d)

@corona10 corona10 marked this pull request as draft March 25, 2026 14:29
@corona10
Copy link
Member Author

Since @Fidget-Spinner suggeted to optimize from JIT pipeline directly, I covert this PR to the draft.

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.

1 participant