Skip to content

Conversation

@aisk
Copy link
Contributor

@aisk aisk commented Jan 18, 2026

Generated `uops` before:
_START_EXECUTOR
_MAKE_WARM
_SET_IP
_CHECK_PERIODIC
_CHECK_VALIDITY
_ITER_CHECK_RANGE
_GUARD_NOT_EXHAUSTED_RANGE
_ITER_NEXT_RANGE
_SET_IP
_SWAP_FAST_3
_SPILL_OR_RELOAD
_POP_TOP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_1
_SET_IP
_LOAD_ATTR_MODULE
_CHECK_VALIDITY
_SET_IP
_SWAP_FAST_4
_POP_TOP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_4
_SET_IP
_TO_BOOL
_CHECK_VALIDITY
_GUARD_IS_TRUE_POP
_LOAD_FAST_BORROW_2
_LOAD_CONST_INLINE_BORROW
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_POP_TOP_NOP
_POP_TOP_NOP
_SWAP_FAST_2
_POP_TOP_INT
_JUMP_TO_TOP
_DEOPT
_ERROR_POP_N
_DEOPT
_EXIT_TRACE
_EXIT_TRACE
_ERROR_POP_N
_DEOPT
_DEOPT
_DEOPT
_DEOPT
_ERROR_POP_N
_DEOPT
_EXIT_TRACE
_EXIT_TRACE
  
Generated `uops` after:
_START_EXECUTOR
_MAKE_WARM
_SET_IP
_CHECK_PERIODIC
_CHECK_VALIDITY
_ITER_CHECK_RANGE
_GUARD_NOT_EXHAUSTED_RANGE
_ITER_NEXT_RANGE
_SET_IP
_SWAP_FAST_3
_SPILL_OR_RELOAD
_POP_TOP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_1
_LOAD_ATTR_MODULE
_POP_TOP_NOP
_SET_IP
_SWAP_FAST_4
_POP_TOP
_CHECK_VALIDITY
_LOAD_FAST_BORROW_4
_SET_IP
_TO_BOOL
_CHECK_VALIDITY
_GUARD_IS_TRUE_POP
_LOAD_FAST_BORROW_2
_LOAD_CONST_INLINE_BORROW
_GUARD_NOS_INT
_BINARY_OP_ADD_INT
_POP_TOP_NOP
_POP_TOP_NOP
_SWAP_FAST_2
_POP_TOP_INT
_JUMP_TO_TOP
_DEOPT
_ERROR_POP_N
_DEOPT
_EXIT_TRACE
_EXIT_TRACE
_ERROR_POP_N
_DEOPT
_DEOPT
_DEOPT
_ERROR_POP_N
_DEOPT
_EXIT_TRACE
_EXIT_TRACE
  

Diff:

_START_EXECUTOR                                                         _START_EXECUTOR
_MAKE_WARM                                                              _MAKE_WARM
_SET_IP                                                                 _SET_IP
_CHECK_PERIODIC                                                         _CHECK_PERIODIC
_CHECK_VALIDITY                                                         _CHECK_VALIDITY
_ITER_CHECK_RANGE                                                       _ITER_CHECK_RANGE
_GUARD_NOT_EXHAUSTED_RANGE                                              _GUARD_NOT_EXHAUSTED_RANGE
_ITER_NEXT_RANGE                                                        _ITER_NEXT_RANGE
_SET_IP                                                                 _SET_IP
_SWAP_FAST_3                                                            _SWAP_FAST_3
_SPILL_OR_RELOAD                                                        _SPILL_OR_RELOAD
_POP_TOP                                                                _POP_TOP
_CHECK_VALIDITY                                                         _CHECK_VALIDITY
_LOAD_FAST_BORROW_1                                                     _LOAD_FAST_BORROW_1
_SET_IP                                                         <
_LOAD_ATTR_MODULE                                                       _LOAD_ATTR_MODULE
_CHECK_VALIDITY                                                 |       _POP_TOP_NOP
_SET_IP                                                                 _SET_IP
_SWAP_FAST_4                                                            _SWAP_FAST_4
_POP_TOP                                                                _POP_TOP
_CHECK_VALIDITY                                                         _CHECK_VALIDITY
_LOAD_FAST_BORROW_4                                                     _LOAD_FAST_BORROW_4
_SET_IP                                                                 _SET_IP
_TO_BOOL                                                                _TO_BOOL
_CHECK_VALIDITY                                                         _CHECK_VALIDITY
_GUARD_IS_TRUE_POP                                                      _GUARD_IS_TRUE_POP
_LOAD_FAST_BORROW_2                                                     _LOAD_FAST_BORROW_2
_LOAD_CONST_INLINE_BORROW                                               _LOAD_CONST_INLINE_BORROW
_GUARD_NOS_INT                                                          _GUARD_NOS_INT
_BINARY_OP_ADD_INT                                                      _BINARY_OP_ADD_INT
_POP_TOP_NOP                                                            _POP_TOP_NOP
_POP_TOP_NOP                                                            _POP_TOP_NOP
_SWAP_FAST_2                                                            _SWAP_FAST_2
_POP_TOP_INT                                                            _POP_TOP_INT
_JUMP_TO_TOP                                                            _JUMP_TO_TOP
_DEOPT                                                                  _DEOPT
_ERROR_POP_N                                                            _ERROR_POP_N
_DEOPT                                                                  _DEOPT
_EXIT_TRACE                                                             _EXIT_TRACE
_EXIT_TRACE                                                             _EXIT_TRACE
_ERROR_POP_N                                                            _ERROR_POP_N
_DEOPT                                                          <
_DEOPT                                                                  _DEOPT
_DEOPT                                                                  _DEOPT
_DEOPT                                                                  _DEOPT
_ERROR_POP_N                                                            _ERROR_POP_N
_DEOPT                                                                  _DEOPT
_EXIT_TRACE                                                             _EXIT_TRACE
_EXIT_TRACE                                                             _EXIT_TRACE

The time cost for 1000000 iterations in the testfunc in the test case is reduced from approximately 126 seconds to 120 seconds.

Comment on lines 1129 to 1135
void
_PyModule_ExactDealloc(PyObject *self)
{
assert(PyModule_CheckExact(self));
module_dealloc(self);
}

Copy link
Member

Choose a reason for hiding this comment

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

No need to do this. The main benefit of CLOSE_SPECIALIZED is to tell the bytecodes generator the call is non-escaping. In this case, this is actually escaping as deallocating a module object frees other data.

macro(LOAD_ATTR_MODULE) =
unused/1 +
_LOAD_ATTR_MODULE +
_POP_TOP_MODULE +
Copy link
Member

Choose a reason for hiding this comment

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

Please use POP_TOP here

Comment on lines 640 to 645
op(_POP_TOP_MODULE, (value --)) {
if (PyJitRef_IsBorrowed(value) ||
sym_is_immortal(PyJitRef_Unwrap(value))) {
REPLACE_OP(this_instr, _POP_TOP_NOP, 0, 0);
}
}
Copy link
Member

Choose a reason for hiding this comment

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

Remove this please.

}

op(_LOAD_ATTR_MODULE, (dict_version/2, index/1, owner -- attr)) {
op(_LOAD_ATTR_MODULE, (dict_version/2, index/1, owner -- attr, o)) {
Copy link
Member

Choose a reason for hiding this comment

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

Tests are failing because the case where this is promoted to globals successfully now has wrong stack effect. It should use the SHUFFLE/INSERT opcodes rather than LOAD_CONST_INLINE_BORROW.

If you'd like to look into it, let me know, otherwise I can fix this.

@aisk aisk marked this pull request as draft January 24, 2026 16:59
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.

2 participants