LLVM มีคำสั่งphiพร้อมคำอธิบายที่ค่อนข้างแปลก:
คำสั่ง 'phi' ใช้เพื่อใช้โหนดφในกราฟ SSA ที่แสดงถึงฟังก์ชัน
โดยทั่วไปแล้วจะใช้เพื่อใช้การแตกแขนง ถ้าฉันเข้าใจถูกต้องจำเป็นต้องทำให้การวิเคราะห์การพึ่งพาเป็นไปได้และในบางกรณีอาจช่วยหลีกเลี่ยงการโหลดที่ไม่จำเป็นได้ อย่างไรก็ตามยังยากที่จะเข้าใจว่ามันทำอะไรได้บ้าง
ตัวอย่าง Kaleidoscope อธิบายได้ค่อนข้างดีสำหรับif
กรณี อย่างไรก็ตามมันไม่ชัดเจนว่าจะใช้การดำเนินการเชิงตรรกะเช่น&&
และ||
. ถ้าฉันพิมพ์สิ่งต่อไปนี้ลงในคอมไพเลอร์llvm ออนไลน์ :
void main1(bool r, bool y) {
bool l = y || r;
}
หลายบรรทัดสุดท้ายทำให้ฉันสับสน:
; <label>:10 ; preds = %7, %0
%11 = phi i1 [ true, %0 ], [ %9, %7 ]
%12 = zext i1 %11 to i8
ดูเหมือนว่า phi node จะสร้างผลลัพธ์ที่สามารถใช้ได้ และฉันรู้สึกประทับใจที่ phi node เพียงแค่กำหนดค่าของเส้นทางที่จะมา
มีใครสามารถอธิบายได้ว่าโหนด Phi คืออะไรและจะนำไปใช้||
อย่างไร
phi
โหนดเป็นวิธีการแก้ปัญหาในคอมไพเลอร์ที่จะแปลง IR ลง "คงที่ได้รับมอบหมายเดียว" แบบฟอร์ม เพื่อให้เข้าใจวิธีแก้ปัญหาได้ดีขึ้นฉันขอแนะนำให้เข้าใจปัญหาให้ดีขึ้น ดังนั้นฉันจะเรียกคุณว่า " โหนทำไมphi
"