Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove __bp__ and speed-up bmethod calls #8060

Merged
merged 1 commit into from
Jul 17, 2023
Merged

Remove __bp__ and speed-up bmethod calls #8060

merged 1 commit into from
Jul 17, 2023

Commits on Jul 17, 2023

  1. Remove rb_control_frame_t::__bp__ and optimize bmethod calls

    This commit removes the __bp__ field from rb_control_frame_t. It was
    introduced to help MJIT, but since MJIT was replaced by RJIT, we can use
    vm_base_ptr() to compute it from the SP of the previous control frame
    instead. Removing the field avoids needing to set it up when pushing new
    frames.
    
    Simply removing __bp__ would cause crashes since RJIT and YJIT used a
    slightly different stack layout for bmethod calls than the interpreter.
    At the moment of the call, the two layouts looked as follows:
    
                       ┌────────────┐    ┌────────────┐
                       │ frame_base │    │ frame_base │
                       ├────────────┤    ├────────────┤
                       │    ...     │    │    ...     │
                       ├────────────┤    ├────────────┤
                       │    args    │    │    args    │
                       ├────────────┤    └────────────┘<─prev_frame_sp
                       │  receiver  │
        prev_frame_sp─>└────────────┘
                         RJIT & YJIT      interpreter
    
    Essentially, vm_base_ptr() needs to compute the address to frame_base
    given prev_frame_sp in the diagrams. The presence of the receiver
    created an off-by-one situation.
    
    Make the interpreter use the layout the JITs use for iseq-to-iseq
    bmethod calls. Doing so removes unnecessary argument shifting and
    vm_exec_core() re-entry from the interpreter, yielding a speed
    improvement visible through `benchmark/vm_defined_method.yml`:
    
         patched:   7578743.1 i/s
          master:   4796596.3 i/s - 1.58x  slower
    
    C-to-iseq bmethod calls now store one more VALUE than before, but that
    should have negligible impact on overall performance.
    
    Note that re-entering vm_exec_core() used to be necessary for firing
    TracePoint events, but that's no longer the case since
    9121e57.
    
    Closes ruby#6428
    XrXr committed Jul 17, 2023
    Configuration menu
    Copy the full SHA
    a4ddbff View commit details
    Browse the repository at this point in the history