2009-02-27 100 views
9

我正在研究堆棧機器的編譯器(特別是CIL),並將代碼解析爲基本塊的圖形。從這裏我正在尋找SSA的方法,但它不太好。我的第一次嘗試(同時使用平面列表而不是圖)是迭代代碼並保留一堆SSA id(即分配目標),當我產生一個任務時推送它們,當它彈出時彈出他們被使用。這對於單個基本塊來說工作得很好,但我根本無法弄清楚如何處理生成Φ函數。堆棧機器代碼的SSA

我一直在徘徊的想法是將堆棧位置附加到SSA ID,然後在代碼路徑收斂時查看堆棧上仍然存在的內容,但這看起來不像Right Way(TM)做事。

是否有一個簡單的算法來跟蹤跨多個代碼路徑的堆棧操作並確定它們收斂時的衝突?

+0

編譯器曾經有過什麼?我正在考慮做同樣的事情。 – 2014-03-13 21:02:44

回答

8

您需要查看融合在節點(基本塊)上的多個SSA ids集合。保持中間的基本塊結構,這樣你可以很容易地使用(例如查詢)塊中的所有標識符。

我不知道你的意思碰撞什麼,但我想你想解決類似

if (bExp)     if (bExp) 
    x := 1     x1 := 1 
else   SSA:  else 
    x := 2     x2 := 2 
y := x;     y := Phi(x1,x2) 

也就是你想要的披在這個地方。意識到在可執行代碼中沒有Phi!使用y是(依賴)x1或x2的信息,可以在下一步中重寫該信息。例如,在一個以內存爲中心的表示中,Phi(x1,x2)告訴你x1和x2應該是兩個別名到同一個內存位置,即y。 Phi只是將信息聯繫在一起。

if (bExp) 
    stackframe[y_index] = 1  (y_index being some offset) 
else 
    stackframe[y_index] = 2 
nop 

希望這會有所幫助!

+1

非常感謝。我有這個99%,但由於某種原因,堆棧位置似乎不夠。在你的答案和MS Research的Marmot編譯器文件之間,我現在擁有了一切:) – 2009-02-27 23:58:04