在編譯器理論中,一個指令的定義可達性(Reaching Definition)必然是另外一個指令,而這個指令則是一個沒有交錯賦值指令的目標變數(shù),舉例來說:
例子d1 : y := 3d2 : x := y在d2中,d1為定義可達性,而在下列的范例中:
d1 : y := 3d2 : y := 4d3 : x := yd1在d3不再是定義可達性,因為d2使它不再可能被到達。
作為分析用途定義可達性也可稱為數(shù)據(jù)流分析,它靜態(tài)的決定在程式碼當中哪些定義可以被到達,由于他相當簡單,它在教課書當中通常被使用作數(shù)據(jù)分析的經(jīng)典范例。數(shù)據(jù)流匯流運算(data-flow confluence operator)則是使用聯(lián)集,而他的分析則是正向流動。定義可達性被使用在計算UD鏈以及DU鏈。
資料流方程式,給定一個基本區(qū)塊 在定義可達性:
換句話說,定義可達性的集合為,
為
的前身,在控制流程圖(Control flow graph)中,
包含所有在
區(qū)塊前的基本區(qū)塊。定義可達性出來的
,為所有定義可達性自己前身減掉那些被
剃除掉的變數(shù),再加上
產(chǎn)生的新的定義1。
我們定義通用的指令及
如下:
為所有賦值給
變數(shù)定義的集合,
是一個獨立的標簽附加在賦值的指令,那么定義可達性的值域就是這些指令標簽。
工作清單算法通常使用迭代工作列表算法來計算到達定義。
輸入:控制流程圖CFG =(節(jié)點,邊緣,進入,退出)
// Initializefor all CFG nodes n in N, OUT[n] = emptyset; // can optimize by OUT[n] = GEN[n];// put all nodes into the changed set// N is all nodes in graph, Changed = N; //Iterate while (Changed != emptyset){ choose a node n in Changed; // remove it from the changed set Changed = Changed -{ n }; // init IN[n] to be empty IN[n] = emptyset; // calculate IN[n] from predecessors' OUT[p] for all nodes p in predecessors(n) IN[n] = IN[n] Union OUT[p]; oldout = OUT[n]; // save old OUT[n] // update OUT[n] using transfer function f_n () OUT[n] = GEN[n] Union (IN[n] -KILL[n]); // any change to OUT[n] compared to previous value? if (OUT[n] changed) // compare oldout vs. OUT[n] { // if yes, put all successors of n into the changed set for all nodes s in successors(n) Changed = Changed U { s }; }}本詞條內(nèi)容貢獻者為:
王沛 - 副教授、副研究員 - 中國科學院工程熱物理研究所