← All issues

DFG `ArrayIsArray` clobberize refinement

bc02c09

Source/JavaScriptCore/dfg/DFGClobberize.h

- // ArrayIsArray가 clobberTop()으로 fall through되었습니다 — 명시적 케이스가 존재하지 않았습니다
+ case ArrayIsArray:
+ read(MiscFields);
+ write(SideState);
+ def(HeapLocation(ArrayIsArrayLoc, MiscFields, node->child1()), LazyNode(node));
+ return;

Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h

case ArrayIsArray:
- clobberWorld();
setNonCellTypeForNode(node, SpecBoolean);
break;

Source/JavaScriptCore/dfg/DFGHeapLocation.h

+ ArrayIsArrayLoc,

DFG JIT는 JS 함수를 노드들의 data-flow graph로 표현합니다. 각 노드에는 clobberize 규칙이 있으며, 해당 노드가 읽고, 쓰고, 정의하는 heap location을 컴파일러에 전달합니다. CSE·LICM·alias analysis는 이 정보를 기반으로 동작합니다. clobberTop()으로 fall through되는 노드는 모든 heap location을 보수적으로 무효화하여, 해당 노드 주변의 최적화를 사실상 전부 차단합니다. abstract interpreter도 보완적인 annotation을 사용하며, clobberWorld()는 추론된 모든 type 정보를 폐기합니다.

이 commit은 ArrayIsArray DFG 노드에 적용되던 과도하게 보수적인 clobberTop()을 정밀한 annotation으로 교체했습니다. read(MiscFields) / write(SideState) / def(ArrayIsArrayLoc)으로 대체되었으며, abstract interpreter에서는 clobberWorld()가 함께 제거되었습니다. read(MiscFields)revoke()로 null이 될 수 있는 proxy handler slot을 커버합니다. write(SideState)는 revoke된 proxy에서 조건부로 발생하는 TypeError를 모델링합니다. def(ArrayIsArrayLoc)는 동일한 값에 대한 중복 Array.isArray() 호출의 CSE를 가능하게 합니다.

Before:
  Array.isArray(x)   →  clobberTop()  →  invalidates ALL heap locations
                                          no CSE, no LICM possible

After:
  Array.isArray(x)   →  read(MiscFields)      // proxy handler slot
                         write(SideState)      // TypeError on revoked proxy
                         def(ArrayIsArrayLoc)  // enables CSE

  revoke() Call node →  clobbers Heap ⊇ MiscFields  →  kills ArrayIsArrayLoc
                                                         (prevents CSE across revocation)

이 변경은 CSE가 적용 가능한 Array.isArray() 패턴에서 약 1.76배의 속도 향상을 가져옵니다. 그러나 더 중요한 점은, IsArray에 대한 새로운 semantic claim이 JIT 최적화 모델에 내재화되었다는 것입니다. 이 claim이 정확하지 않으면 miscompilation으로 이어집니다.

🔒

New JIT optimization axioms about proxy semantics — the kill chain and chain-walk assumptions are worth auditing for edge cases.

더 확인하려면 구독해 주세요