2012-05-21 25 views
4

我正在執行SSA構建我正在編寫一個編譯器。在SSA算法中有一些我不明白的地方(使用Java編寫的the Cytron paper現代編譯器實現,A.W.Appel的第二版)。如果一個變量y是在一個直線控制流路徑中第一次(和使用過)定義的,但從未在另一條平行路徑中定義。我是否必須在連接點處插入PHI函數(定義爲y的塊的優勢邊界)?靜態單一賦值:並非所有可能的路徑都定義了一個變量 - 如何插入PHI?

x = 1;   // A 
if (P)   // A 
    y = x + 1; // B 
    y = y + 1; // B 
x = x + 1;  // C 
return;   // C 

例如,在塊B中有y的第一個定義。我需要在程序段C的開始插入一條PHI指令,有兩個操作數(每個輸入控制流程路徑)?然後在SSA重命名:我如何命名來自路徑A -> C(不是通過B)的操作數,其中y從未被定義?

Entry --- A --------- C --- Exit 
      \  /
      \-- B --/ 
+1

沒有,如果變量從未逃脫它定義塊,那麼你並不需要的phi-功能。我不明白你爲什麼認爲你需要一個? –

回答

3

通過材料再看完後,我發現了一個小提示在Java中的書現代編譯器實現,第二版通過A.W. Appel關於一個隱含定義的變量c0。進一步搜索發現算法期望所有變量在第一個基本塊之前有一個隱式定義。該隱式定義表示變量是全局變量,參數或未初始化的變量。

添加這種隱含定義解決我的問題,和例子將成爲:

x1 = 1;   // A 
if (P)   // A 
    y1 = x1 + 1; // B 
    y2 = y1 + 1; // B 
y3 = φ(y0, y2) // C 
x2 = x1 + 1;  // C 
return;   // C 
+0

我也試圖實現SSA,並遵循'現代編譯器在Java中的實現,第二版由A.W'的書,我不明白如果我做y3 =φ(y0,y2),我在哪裏定義φ以及如何?如果你能提供一些提示,這將會非常有幫助。謝謝。 – MMH

相關問題