LLVM memiliki instruksi phi dengan penjelasan yang cukup aneh:
Instruksi 'phi' digunakan untuk mengimplementasikan node φ dalam grafik SSA yang mewakili fungsi tersebut.
Biasanya digunakan untuk mengimplementasikan percabangan. Jika saya mengerti dengan benar, itu diperlukan untuk membuat analisis ketergantungan mungkin dan dalam beberapa kasus dapat membantu untuk menghindari pemuatan yang tidak perlu. Namun masih sulit untuk memahami apa yang dilakukannya.
Contoh Kaleidoskop menjelaskannya dengan cukup baik untuk if
kasus. Namun tidak begitu jelas bagaimana mengimplementasikan operasi logis seperti &&
dan ||
. Jika saya mengetik berikut ini ke compiler llvm online :
void main1(bool r, bool y) {
bool l = y || r;
}
Beberapa baris terakhir benar-benar membingungkan saya:
; <label>:10 ; preds = %7, %0
%11 = phi i1 [ true, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8
Sepertinya node phi menghasilkan hasil yang bisa digunakan. Dan saya mendapat kesan bahwa phi node hanya menentukan dari mana nilai jalur berasal.
Bisakah seseorang menjelaskan apa itu simpul Phi, dan bagaimana menerapkannya ||
?
phi
simpul merupakan solusi dari masalah di compiler untuk mengkonversi IR menjadi "Static tunggal tugas" bentuk. Untuk memahami lebih baik tentang solusi, saya sarankan untuk lebih memahami masalahnya. Jadi saya akan memberi tahu Anda " Mengapaphi
node ".