php / php/php-src

Tracing JIT drops loop-PHI CV register from SNAPSHOT after intermediate op1_def

Aperta
#22,115 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Bug Status: Needs Triage
Lingua principale
C
Stelle
40.4k
Fork
8.1k
Merge medio
2g 13h
PR unite (30g)
96

Descrizione

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

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia eseguendo il repro.php fornito con le impostazioni di tracing JIT e function JIT, quindi confronta i valori risultanti e analizza il comportamento dello snapshot del loop attorno all’operazione intermedia e all’uscita laterale. Il lavoro è completato quando il tracing JIT restituisce int(1), in corrispondenza del risultato del function JIT, senza introdurre regressioni nel caso di hot-loop fornito.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
c, php
Ambito
compilers
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Tranquilla
Chiarezza
Abbastanza chiara
Idoneità per principianti
38/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.