<input id="ohw05"></input>
  • <table id="ohw05"><menu id="ohw05"></menu></table>
  • <var id="ohw05"></var>
  • <code id="ohw05"><cite id="ohw05"></cite></code>
    <label id="ohw05"></label>
    <var id="ohw05"></var>
  • SSA

    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的資源就可以釋放了。

    posted @ 2021-09-30 16:30  周榮華  閱讀(400)  評論(0編輯  收藏  舉報
    国产美女a做受大片观看