Tracing JIT drops loop-PHI CV register from SNAPSHOT after intermediate op1_def
オープン
まだ誰も着手していません。
Bug
Status: Needs Triage
- 主要言語
- C
- スター
- 40.4k
- フォーク
- 8.2k
- 平均マージ
- 2日 13時間
- マージ済み PR(30日)
- 96
説明
Description
Tracing JIT returns wrong values from hot loops!
<?php
function f(array $meta, int $n): int {
$s = 0; $i = 0; $sink = 0;
while ($i < $n) {
$copy = $s; // QM_ASSIGN, op1_def on $s under RC inference
$sink += $copy; // keep ASSIGN past DCE
$m = (int) $meta[$s]; // FETCH_DIM_R use of $s, ZREG_LAST_USE
if (($m & 0xFF) === 1) { // IS_IDENTICAL guard, side-exit's SNAPSHOT misses $s
$i++;
$s = ($m >> 32) & 0xFFFFFF;
continue;
}
return $s;
}
return $s;
}
$meta = [0 => 1 | (1 << 32), 1 => 2 | (2 << 32)];
for ($w = 0; $w < 2000; $w++) f($meta, 3);
var_dump(f($meta, 3));
Results in:
$ php -d opcache.enable_cli=1 -d opcache.jit_buffer_size=64M -d opcache.jit=tracing repro.php
int(0)
Expected:
$ php -d opcache.enable_cli=1 -d opcache.jit_buffer_size=64M -d opcache.jit=function repro.php
int(1)
PHP Version
PHP 8.4 and above
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
まず、提供された repro.php を tracing JIT と function JIT の設定で実行し、得られた値を比較してから、中間操作とサイド exit の周辺におけるループの snapshot の挙動を調べます。tracing JIT が function JIT の結果と一致する int(1) を返し、提供された hot-loop のケースでリグレッションが発生しなければ完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- c, php
- 領域
- compilers
- issue の種類
- バグ
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 活発さ
- 静か
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 38/100