wikipedia上關于SSA的定義如下:
In compiler design, static single assignment form (often abbreviated as SSA form or simply SSA) is a property of an intermediate representation (IR), which requires that each variable be assigned exactly once, and every variable be defined before it is used.
Existing variables in the original IR are split into versions, new variables typically indicated by the original name with a subscript in textbooks, so that every definition gets its own version. In SSA form, use-def chains are explicit and each contains a single element.
翻譯下來就是,編譯器設計中的一種概念,是靜態單賦值范式的簡稱,是中間表達IR的一種屬性,該屬性要求每個變數只能賦值一次,并且必須在使用前進行賦值,“賦值”這個概念在編譯器領域和“定義”是一個概念,所以真實編程語言中的各種變數,如果存在多次賦值并且多次參考不同賦值的情況的話,每次會被參考的賦值會產生一個新的變數(為了方便記憶,新的變數可以是老的變數名加上下標的方式來命名),而那些賦值了卻沒有參考,或者在多次賦值之間沒有參考陳述句的前一次賦值,會自動被編譯器優化掉,
在計算圖(一般也稱為DAG,Directed Acyclic Graph,有向無環圖)中,每個節點需要先定義,再使用,也就是說,每個節點的生命周期是Def-Use的程序,但節點間的關系就是每個節點先Use其他節點的值,然后生成自己的定義,并把自己的定義提供給下一個節點進行Use的程序,Use-Def-Use的關系,
例如下面從C代碼:
1 x=1; 2 y=2; 3 x=y+1; 4 z=x*y; 5 a=z+1;
第一輪轉換的程序中變成了下面的代碼:
1 x1=1; 2 y1=2; 3 x2=y1+1; 4 z1=x2*y1; 5 a1=z1+1;
按照SSA的原則,x1賦值之后沒有使用,所以是無用代碼,最終按SSA規范優化之后的代碼是:
1 y1=2; 2 x2=y1+1; 3 z1=x2*y1; 4 a1=z1+1;
而且,很明顯的x2和y1在第三行是最后一次參考,在第三行執行完x2和y1的資源就可以釋放了,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/308181.html
標籤:C++
上一篇:Linux下c++ 多執行緒相關(thread, mutex, atomic訊息佇列)
下一篇:C++ 可變陣列實作
