ノート

[ENHANCEMENT] 8386858: [lworld] omit load_prototype_header when UseObjectMonitorTable is used

UseObjectMonitorTable 有効時に Valhalla 固有の mark word flag を読む経路で load_prototype_header を避けるようにしました。

概要#

 Valhalla の​ lworld ブランチでは,​オブジェクトが​ロックされているように​見える​場合に,​ klass から​ prototype header を​読み,​Valhalla 固有の​ markWord フラグを​確認します。

 しかし,UseObjectMonitorTable が​有効な​場合,​object monitor は​オブジェクト・ヘッダ上の​ markWord と​して​表現されません。​ この​場合,​必要な​ mark word bit は​オブジェクト・ヘッダに​残っている​ため,​ load_prototype_header に​進まず,​読み込んだ​ヘッダを​そのまま​検査できます。

 今回の​修正では,test_oop_prototype_bit で​ prototype header を​読む処理を!UseObjectMonitorTable の​場合だけ実行するようにしました1。​ 対象は​ aarch64,​ppc,​riscv,​x86 の​ 4 アーキテクチャです。​ これに​より,より​軽量に​事が​進みます。

 ldr(temp_reg, Address(oop, oopDesc::mark_offset_in_bytes()));
-tst(temp_reg, markWord::unlocked_value);
-br(Assembler::NE, test_mark_word);
-load_prototype_header(temp_reg, oop);
+if (!UseObjectMonitorTable) {
+  tst(temp_reg, markWord::unlocked_value);
+  br(Assembler::NE, test_mark_word);
+  load_prototype_header(temp_reg, oop);
+}

 結果と​して​ UseObjectMonitorTable 有効時は​不要な​ prototype header 読み込みを​避け,​ オブジェクト・ヘッダから​直接 flag を​検査する​形に​なります。

2026/06/29 PR 作成#

 PR では,UseObjectMonitorTable 有効時には​ object monitor が​ displaced mark word と​して​ オブジェクト・ヘッダに​置かれない​こと,​その​ため読み込んだ​ヘッダから​直接 bit を​取得できる​ことを​説明しました2

 修正は​各 CPU の​ MacroAssembler::test_oop_prototype_bit に​同じ​考え方を​適用しています。​ まず mark word を​ロードし,UseObjectMonitorTable が​無効な​場合に​従来のよりを​実行します。

2026/06/29-30 レビュー#

 Coleen Phillimore 氏3から​ Approve を​いただきました。​ 同氏からは,​ObjectMonitorTable は​今後​取り除かれる​予定で​あり,​ この​変更が​より​速い​コードに​なるとの​コメントも​いただきました。

 ​その​後,/integrate を​行い,​sponsor 待ちの​状態に​なりました。

2026/06/30 統合#

 David Holmes 氏4からも​ Approve を​いただき,​そのまま​ /sponsor していただきました。​ 最終的に​ 28b617e5 と​して​ Valhalla の​ lworld ブランチへ​統合されました。


Footnotes#