LLVM ha istruzioni phi con una spiegazione piuttosto strana:
L'istruzione "phi" viene utilizzata per implementare il nodo φ nel grafico SSA che rappresenta la funzione.
In genere viene utilizzato per implementare la ramificazione. Se ho capito bene, è necessario per rendere possibile l'analisi delle dipendenze e in alcuni casi potrebbe aiutare a evitare caricamenti non necessari. Tuttavia è ancora difficile capire cosa fa esattamente.
L' esempio del caleidoscopio lo spiega abbastanza bene per il if
caso. Tuttavia non è così chiaro come implementare operazioni logiche come &&
e ||
. Se digito quanto segue nel compilatore llvm online :
void main1(bool r, bool y) {
bool l = y || r;
}
Le ultime righe mi confondono completamente:
; <label>:10 ; preds = %7, %0
%11 = phi i1 [ true, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8
Sembra che il nodo phi produca un risultato che può essere utilizzato. E avevo l'impressione che il nodo phi definisca semplicemente da quali percorsi provengono i valori.
Qualcuno potrebbe spiegare cos'è un nodo Phi e come implementarlo ||
?
phi
nodo è una soluzione del problema nei compilatori per convertire l'IR nella forma "Statica singola assegnazione". Per capire meglio capire la soluzione suggerirei di capire meglio il problema. Quindi ti chiameròphi
" Why is node ".