New `DateNow` DFG node
Source/JavaScriptCore/dfg/DFGAbstractHeap.h
Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
JSC의 DFG JIT는 JS 연산을 타입이 지정된 data-flow graph로 표현합니다. "Intrinsic" 노드는 컴파일러가 알려진 builtin 함수에 대해 full host-call sequence 대신 특화된 machine code를 직접 생성할 수 있도록 합니다. 각 노드는 clobberize, doesGC, safeToExecute, prediction propagation, abstract interpreter 등 여러 분석 단계와 32비트·64비트 speculative JIT backend 양쪽 모두에 등록되어야 합니다.
이 commit에서 DateNow DFG intrinsic이 도입되었습니다. Date.now()는 DFG 및 FTL 계층에서 operationDateNow에 대한 직접 호출을 통해 인라인 처리되며, host function dispatch 오버헤드가 제거되었습니다. 한편 CSE가 두 개의 DateNow 노드를 하나로 합치거나 LICM이 해당 노드를 루프 밖으로 끌어올리는 것을 막기 위해, 새로운 WallClock abstract heap location이 등록되었습니다.
Significance
벤치마크에서 약 19%의 성능 향상이 관찰되었습니다. 다만 더 중요한 점은, 새로운 DFG intrinsic은 clobberize, doesGC, safeToExecute, prediction propagation, loop unrolling, 그리고 양쪽 speculative JIT backend를 모두 통과해야 하며, 각 단계와의 상호작용 하나하나가 잠재적인 miscompilation 지점이 된다는 것입니다.
Audit directions
WallClockclobberize 어노테이션 및superKind()체인. 체인이 의도치 않게 더 넓은 heap 클래스(예:World)로 흡수되면 alias analysis가 지나치게 보수적으로 동작하게 됩니다. 반대로WallClock이 관련 alias 검사에서 누락된 경우, CSE가 호출을 여전히 합칠 가능성이 있습니다.SpecDoubleReal타입 정밀도. Abstract interpreter는 결과 타입을SpecDoubleReal(유한하고 NaN이 아닌 double)로 설정합니다. 플랫폼 클록 구현에는 edge case가 존재합니다.operationDateNow가 NaN, Infinity, 또는 음수를 반환하게 되면 이후 타입 기반 speculation이 잘못 발동될 수 있습니다.- Loop unrolling 단계.
DFGLoopUnrollingPhase::isNumericComputationNode가 수정되었습니다.DateNow가 순수한 numeric computation 노드로 잘못 분류되면, loop unrolling이 clock read를 중복 실행하거나 순서를 변경할 가능성이 있습니다. - 32비트 JIT 경로. 32비트 intrinsic 컴파일 경로는 64비트에 비해 테스트 빈도가 훨씬 낮습니다. C 연산에서 반환된 double은 GPR pair가 필요하므로, calling convention이나 register allocation 오류가 발생할 가능성이 가장 높은 지점입니다.