編譯器

將上方程式碼轉為SSA形式後,if敘述之後會加入類似「x3 = φ(x1, x2)」的式子。關於此φ函數的作用,下列何者正確?

if (c) x = 1;
else   x = 2;
y = x + 3;
  1. A在x1與x2之中選出較大的值並回傳
  2. B計算x1與x2相加的值並回傳
  3. C依照所經過的路徑,選擇x1或x2
查看答案與解析

正確答案:C. 依照所經過的路徑,選擇x1或x2

在SSA形式中,then側的指派為x1、else側的指派為x2,兩者名稱各異,因此匯合之後計算y時,必須表明該使用哪一個x。φ函數是表示匯合點上值的選擇的記號:若剛才是從then側過來就選x1,從else側過來就選x2。實際的機器碼中並沒有φ函數的指令,最後會替換為暫存器的複製等。它與值的大小或總和無關。

  • A. 並非依值的大小來選擇。
  • B. 並不是將值相加。
  • C. 正確。依照所經過的路徑來選擇值。
練習這個領域 前往領域頁面

編譯器的其他題目

  1. 關於編譯器的常數摺疊(constant folding),下列哪個範例正確?
  2. 對上方程式碼反覆進行常數傳播與常數摺疊,最終會變成什麼樣的程式碼?
  3. 對上方程式碼進行共同子運算式消除時,下列說明何者正確?
  4. 在無用程式碼刪除(死碼消除)中被移除的對象,下列何者正確?
  5. 關於函式行內展開(inline expansion)的優點與缺點,下列組合何者正確?

這個領域的比較