• Joyee Cheung's avatar
    [class] Add IC support for defining class fields to replace runtime call · 713ebae3
    Joyee Cheung authored
    Introduces several new runtime mechanics for defining private fields,
    including:
      - Bytecode StaKeyedPropertyAsDefine
      - Builtins StoreOwnIC{Trampoline|Baseline|_NoFeedback}
      - Builtins KeyedDefineOwnIC{Trampoline|Baseline|_Megamorphic}
      - TurboFan IR opcode JSDefineProperty
    
    These new operations can reduce a runtime call per class field into a
    more traditional Store equivalent. In the microbenchmarks, this
    results in a substantial win over the status quo (~8x benchmark score
    for single fields with the changes, ~20x with multiple fields).
    
    The TurboFan JSDefineProperty op is lowered in
    JSNativeContextSpecialization, however this required some hacks.
    Because private fields are defined as DONT_ENUM when added to the
    object, we can't find a suitable transition using the typical data
    property (NONE) flags. I've added a mechanism to specify the required
    PropertyAttributes for the transition we want to look up.
    
    Details:
    
    New bytecodes:
      - StaKeyedPropertyAsDefine, which is essentially StaKeyedProperty
        but with a different IC builtin (KeyedDefineOwnIC). This is a
        bytecode rather than a flag for the existing StaKeyedProperty in
        order to avoid impacting typical keyed stores in any way due to
        additional branching and testing.
    
    New builtins:
      - StoreOwnIC{TTrampoline|Baseline|_NoFeedback} is now used for
        StaNamedOwnProperty. Unlike the regular StoreIC, this variant will
        no longer look up the property name in the prototype.
        In adddition, this CL changes an assumption that
        StoreNamedOwnProperty can't result in a map transition, as we
        can't rely on the property already being present in the Map due
        to an object literal boilerplate.
    
        In the context of class features, this replaces the runtime
        function %CreateDataProperty().
    
      - KeyedDefineOwnIC{Trampoline|Baseline|_Megamorphic} is used by the
        new StaKeyedPropertyAsDefine bytecode. This is similar to an
        ordinary KeyedStoreIC, but will not check the prototype for
        setters, and for private fields, will take the slow path if the
        field already exists.
    
        In the context of class features, this replaces the runtime
        function %AddPrivateField().
    
    TurboFan IR:
      - JSDefineProperty is introduced to represent a situation where we
        need to use "Define" semantics, in particular, it codifies that we
        do not consult the prototype chain, and the semantics relating to
        private fields are implied as well.
    
    R=leszeks@chromium.org, syg@chromium.org, rmcilroy@chromium.org
    
    Bug: v8:9888
    Change-Id: Idcc947585c0e612f9e8533aa4e2e0f8f0df8875d
    Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2795831Reviewed-by: 's avatarIgor Sheludko <ishell@chromium.org>
    Reviewed-by: 's avatarMichael Stanton <mvstanton@chromium.org>
    Reviewed-by: 's avatarLeszek Swirski <leszeks@chromium.org>
    Reviewed-by: 's avatarGeorg Neis <neis@chromium.org>
    Reviewed-by: 's avatarShu-yu Guo <syg@chromium.org>
    Commit-Queue: Joyee Cheung <joyee@igalia.com>
    Cr-Commit-Position: refs/heads/main@{#77377}
    713ebae3
js-native-context-specialization.h 11.8 KB