[JSC] GreedyRegAlloc: add loop-aware live range splitting (disabled by default)
7a38dc3
Source/JavaScriptCore/b3/air/AirAllocateRegistersByGreedy.cpp
+ template<Bank bank>
+ bool trySplitAroundLoop(Tmp tmp, TmpData& tmpData)
+ {
+ if (!Options::airGreedyRegAllocSplitAroundLoops())
+ return false;
+ if (tmpData.splitAroundClobbersMetadataIndex)
+ return false;
+ auto [loop, nonLoopRange] = chooseLoopForSplit(tmpData.liveRange);
+ if (!loop) return false;
+ ...
+ Tmp loopTmp = addSplitTmp(tmp, UseDefCost(0), { });
+ }
Air는 JSC의 B3 IR 계층에서 가장 낮은 단계로, machine code 생성 직전에 위치합니다. Greedy register allocator는 spill cost와 interference를 기반으로 virtual tmp에 물리 레지스터를 할당합니다. Live range splitting은 tmp의 range를 분할하여, 각 절반이 독립적인 레지스터 할당을 받을 수 있도록 합니다. 이 commit은 loop를 인식하는 splitting을 추가합니다. Loop 경계를 가로지르는 tmp는 loop 내부와 외부 두 부분으로 분리할 수 있게 됩니다. 새로운 CFG 정규화 pass ensureDedicatedLoopEntryExitBlocks가 도입되었습니다. 이 pass는 split 경계에서 Shuffle의 안전한 삽입 지점을 보장합니다. Shuffle은 Air의 parallel-move primitive로, cycle을 포함한 임의의 register 치환을 처리합니다. 현재는 airGreedyRegAllocSplitAroundLoops option 뒤에 비활성화 상태로 있습니다.
Significance
현재 충분한 테스트가 이루어지지 않은 복잡한 새 JIT pass입니다. 기본적으로 비활성화 상태이며, fuzzer에서 --airGreedyRegAllocSplitAroundLoops=true로 활성화하면 JIT compiler pipeline 내 사실상 미검증 상태인 코드 영역을 열게 됩니다.
Audit directions
a Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaa Aaaaaaaaaa Aaa Aaa Aaaaa Aaa Aaa Aaaaaa Aaaaaaaaaaaaaaaaaaaaa Aa Aaa Aaaaaaaaa Aaa Aaaa Aaaaaaaaaaaaaa Aaaa Aa Aa Aa Aa Aaaaaa
a Aaaaaaaaa Aaaaaaaaaaaaa Aaaaaaaaaaa Aaaa Aaaaaaaa Aaaaaaaaa Aaaaa Aaaaaaaaaaaaaa Aaaa Aaa Aaaa Aaaa Aaa Aa Aaa Aaaaaa
a Aaaaaaaaaaaaa Aaaaaaa Aaaaaaaaaaaaaaaaaaaa Aaa Aaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaaaaa Aa Aaa Aaaa Aa Aaaaaaa Aaaaaaaaaaa Aaaa Aaaaaa Aaaaaaaaaaaa Aa Aaaaa Aaaaaaaaaa Aaaaa Aaa Aaaaaa
a Aaaaaaaaaaaaaaaaaaaaaa Aaaa Aaaaaaaa Aaa Aaaa Aaaa Aaaa Aaaaa Aaaaaaaaaaaaa Aaaa Aa Aaaaaa Aaa Aaaa Aaaaa
🔒New JIT splitting path with CFG surgery and parallel-move fixups — several edge cases in loop selection and split interactions are worth security investigation.
더 확인하려면 구독해 주세요