Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: 94e35cf4d86c0d426751c9e46ce9a8f853dfea64
      
https://github.com/WebKit/WebKit/commit/94e35cf4d86c0d426751c9e46ce9a8f853dfea64
  Author: Yusuke Suzuki <[email protected]>
  Date:   2026-05-04 (Mon, 04 May 2026)

  Changed paths:
    A JSTests/stress/array-concat-intrinsic-cow-result.js
    A JSTests/stress/array-concat-intrinsic-non-array-object.js
    A JSTests/stress/array-concat-intrinsic-sparse-threshold.js
    A JSTests/stress/array-concat-intrinsic-spreadable-watchpoint.js
    A JSTests/stress/array-concat-intrinsic.js
    M Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
    M Source/JavaScriptCore/dfg/DFGBackwardsPropagationPhase.cpp
    M Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp
    M Source/JavaScriptCore/dfg/DFGClobberize.h
    M Source/JavaScriptCore/dfg/DFGCloneHelper.h
    M Source/JavaScriptCore/dfg/DFGDoesGC.cpp
    M Source/JavaScriptCore/dfg/DFGFixupPhase.cpp
    M Source/JavaScriptCore/dfg/DFGNodeType.h
    M Source/JavaScriptCore/dfg/DFGOperations.cpp
    M Source/JavaScriptCore/dfg/DFGOperations.h
    M Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp
    M Source/JavaScriptCore/dfg/DFGSafeToExecute.h
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp
    M Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp
    M Source/JavaScriptCore/ftl/FTLCapabilities.cpp
    M Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp
    M Source/JavaScriptCore/runtime/ArrayPrototype.cpp
    M Source/JavaScriptCore/runtime/ArrayPrototype.h
    M Source/JavaScriptCore/runtime/Intrinsic.h

  Log Message:
  -----------
  [JSC] Add Array#concat DFG nodes
https://bugs.webkit.org/show_bug.cgi?id=313926
rdar://176122830

Reviewed by Yijia Huang.

This patch adds Array#concat handling in DFG / FTL.

1. Initially we emit ArrayConcatAppendOne DFG node. This is because we
   have no idea whether second input is Array or not at this point yet.
2. In fixup phase, we check prediction, and we may convert
   ArrayConcatAppendOne to ArrayConcatArray, which is more optimized for
   `array.concat(array)` case.
3. Add DFG operation, which can return nullptr when it has complicated
   side-effects, like @@isConcatSpreadable for the second argument. When
   we found these cases, we just return nullptr. And then DFG / FTL will
   do OSR exit via ExoticObjectMode.
4. We set necessary watchpoints in DFG so that operation code skips many
   checks.

Tests: JSTests/stress/array-concat-intrinsic-cow-result.js
       JSTests/stress/array-concat-intrinsic-non-array-object.js
       JSTests/stress/array-concat-intrinsic-sparse-threshold.js
       JSTests/stress/array-concat-intrinsic-spreadable-watchpoint.js
       JSTests/stress/array-concat-intrinsic.js

* JSTests/stress/array-concat-intrinsic-cow-result.js: Added.
(assert):
(shallowEq):
(firstEmpty):
(secondEmpty):
(firstEmptyDouble):
(secondEmptyDouble):
(firstEmptyContiguous):
(secondEmptyContiguous):
(sumAfterConcat):
* JSTests/stress/array-concat-intrinsic-non-array-object.js: Added.
(assert):
(objConcat):
(runAll):
* JSTests/stress/array-concat-intrinsic-sparse-threshold.js: Added.
(assert):
(makeInt32):
(doConcat):
* JSTests/stress/array-concat-intrinsic-spreadable-watchpoint.js: Added.
(assert):
(shallowEq):
(concatArr):
(concatOne):
* JSTests/stress/array-concat-intrinsic.js: Added.
(assert):
(shallowEq):
(runConcat):
(testBasic):
(testSpeciesInvalidation.MyArray.get Symbol):
(testSpeciesInvalidation.MyArray):
(testSpeciesInvalidation):
(testIsConcatSpreadable):
(testCOW.makeCOW):
(testCOW):
(testLarge):
(appendInt):
(appendDouble):
(appendString):
(appendBool):
(appendNull):
(appendUndef):
(polyConcat):
(objConcat):
* Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h:
(JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
* Source/JavaScriptCore/dfg/DFGBackwardsPropagationPhase.cpp:
(JSC::DFG::BackwardsPropagationPhase::propagate):
* Source/JavaScriptCore/dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::handleIntrinsicCall):
* Source/JavaScriptCore/dfg/DFGClobberize.h:
(JSC::DFG::clobberize):
* Source/JavaScriptCore/dfg/DFGCloneHelper.h:
* Source/JavaScriptCore/dfg/DFGDoesGC.cpp:
(JSC::DFG::doesGC):
* Source/JavaScriptCore/dfg/DFGFixupPhase.cpp:
(JSC::DFG::FixupPhase::fixupNode):
* Source/JavaScriptCore/dfg/DFGNodeType.h:
* Source/JavaScriptCore/dfg/DFGOperations.cpp:
(JSC::DFG::JSC_DEFINE_JIT_OPERATION):
* Source/JavaScriptCore/dfg/DFGOperations.h:
* Source/JavaScriptCore/dfg/DFGPredictionPropagationPhase.cpp:
* Source/JavaScriptCore/dfg/DFGSafeToExecute.h:
(JSC::DFG::safeToExecute):
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT.cpp:
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT.h:
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT32_64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
* Source/JavaScriptCore/dfg/DFGSpeculativeJIT64.cpp:
(JSC::DFG::SpeculativeJIT::compile):
* Source/JavaScriptCore/ftl/FTLCapabilities.cpp:
(JSC::FTL::canCompile):
* Source/JavaScriptCore/ftl/FTLLowerDFGToB3.cpp:
(JSC::FTL::DFG::LowerDFGToB3::compileNode):
(JSC::FTL::DFG::LowerDFGToB3::compileArrayConcatArray):
(JSC::FTL::DFG::LowerDFGToB3::compileArrayConcatAppendOne):
* Source/JavaScriptCore/runtime/ArrayPrototype.cpp:
(JSC::ArrayPrototype::finishCreation):
(JSC::tryConcatAppendOneNonArray):
(JSC::tryConcatAppendArrayFastWithWatchpoints):
(JSC::tryConcatOneArgFast):
(JSC::JSC_DEFINE_HOST_FUNCTION):
(JSC::concatAppendOne): Deleted.
(JSC::concatAppendArray): Deleted.
* Source/JavaScriptCore/runtime/ArrayPrototype.h:
* Source/JavaScriptCore/runtime/Intrinsic.h:

Canonical link: https://commits.webkit.org/312543@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to