專利名稱:保留部分冗余移去的運(yùn)行時(shí)間行為的制作方法
背景技術(shù):
部分冗余移去(PRE)準(zhǔn)許部分冗余表達(dá)式從程序中移除。這在圖1(a)(現(xiàn)有領(lǐng)域)和圖1(b)(現(xiàn)有領(lǐng)域)中闡明。圖1(a)證明典型的PRE問題。在控制流程圖100中,存在四個(gè)表達(dá)式h(x)的出現(xiàn)。為簡(jiǎn)單起見,這四個(gè)出現(xiàn)被假定計(jì)算相同的值,而且沒有其它副作用。節(jié)點(diǎn)7處的表達(dá)式h(x)是完全冗余的,這是因?yàn)樵谠擖c(diǎn)處,h(x)已經(jīng)在節(jié)點(diǎn)4或節(jié)點(diǎn)5處被預(yù)先計(jì)算了。節(jié)點(diǎn)9處的表達(dá)式是部分冗余的,這是因?yàn)樵谠擖c(diǎn)處,h(x)可能已經(jīng)沿著從節(jié)點(diǎn)1到節(jié)點(diǎn)8的路徑而被計(jì)算了,后者沒有沿著從節(jié)點(diǎn)1到節(jié)點(diǎn)2的路徑計(jì)算。
移除冗余的傳統(tǒng)方法在圖1(b)中闡明了。為移去在節(jié)點(diǎn)7處標(biāo)識(shí)的完全冗余,在節(jié)點(diǎn)4或節(jié)點(diǎn)5處計(jì)算的表達(dá)式h(x)的數(shù)值被分配一臨時(shí)變量t。在節(jié)點(diǎn)7處,h(x)的計(jì)算由t替換。為移除節(jié)點(diǎn)9處的部分冗余,表達(dá)式h(x)的實(shí)例被插入并被保存在臨時(shí)變量t中。該插入使得節(jié)點(diǎn)9處的表達(dá)式h(x)是完全冗余的,并且這樣其h(x)計(jì)算由臨時(shí)變量t的使用而替代。
與部分冗余移去的傳統(tǒng)解決方法相關(guān)聯(lián)的問題是其改變了原代碼的運(yùn)行時(shí)間行為。若h(x)的計(jì)算拋出一異常(throws an exception)或者該h(x)的計(jì)算不能終止,則h(x)的向上運(yùn)動(dòng)可促使基礎(chǔ)代碼(underlying code)表現(xiàn)不同。例如,若h(x)拋出異常A,則h(x)在另一個(gè)拋出異常B的計(jì)算之前被向上移動(dòng)了?,F(xiàn)在,該變換會(huì)促使代碼拋出異常A,而不是異常B。由于同樣的原因,向下移動(dòng)也可促使運(yùn)行時(shí)間行為的類似變化。因此,傳統(tǒng)方法通常不能被用于要求保留異常行為的環(huán)境中。
在這里做出權(quán)利要求或在這里說明的本發(fā)明依照范例實(shí)施例而被進(jìn)一步說明。這些范例實(shí)施例是參考附圖而被詳細(xì)說明的。這些實(shí)施例是非限制性范例實(shí)施例,其中,在這幾個(gè)附圖視圖中,相同的參考數(shù)字代表相同的部分,附圖如下圖1(a)-(b)(現(xiàn)有領(lǐng)域)闡明冗余問題以及移除完全和部分冗余的傳統(tǒng)解決方法;圖2依照本發(fā)明的實(shí)施例,描述保留冗余移去的運(yùn)行時(shí)間行為;圖3依照本發(fā)明的實(shí)施例,描述保留冗余移去的運(yùn)行時(shí)間行為的范例內(nèi)部高層框圖;圖4依照本發(fā)明的實(shí)施例,示出數(shù)據(jù)流分析器的范例內(nèi)部結(jié)構(gòu);圖5(a)闡明四點(diǎn)金剛石格點(diǎn);圖5(b)依照本發(fā)明闡明范例控制流程圖上范例數(shù)據(jù)流分析器的輸出;圖6依照本發(fā)明,示出完全冗余移去機(jī)制的范例內(nèi)部結(jié)構(gòu);圖7依照本發(fā)明,描述部分冗余移去機(jī)制的范例內(nèi)部結(jié)構(gòu);圖8是依照本發(fā)明的范例進(jìn)程流程圖,其中冗余被以保留運(yùn)行時(shí)間行為的方式而被移去;圖9是依照本發(fā)明的范例進(jìn)程的流程圖,其中完全冗余被標(biāo)識(shí)并被移去;圖10是依照本發(fā)明的范例進(jìn)程的流程圖,其中部分冗余被標(biāo)識(shí)并被移去;圖11依照本發(fā)明闡明保留冗余移去的運(yùn)行時(shí)間行為的范例;圖12(a)-(c)依照本發(fā)明闡明移去關(guān)于循環(huán)中的循環(huán)不變式的部分冗余的范例;圖13(a)-(c)依照本發(fā)明闡明移去關(guān)于循環(huán)中的循環(huán)不變式的部分冗余的范例;圖14依照本發(fā)明,描述使用保留冗余移去的運(yùn)行時(shí)間行為機(jī)制的框架。
具體實(shí)施例方式
下面說明的處理可由正確編程的通用計(jì)算機(jī)單獨(dú)或者與專用計(jì)算機(jī)結(jié)合而執(zhí)行。這樣的處理可由單獨(dú)平臺(tái)或由分布式處理平臺(tái)執(zhí)行。另外,這樣的處理和功能性能以專用硬件的形式或以由通用或網(wǎng)絡(luò)處理器運(yùn)行的軟件或固件形式而實(shí)現(xiàn)。在這樣的處理中操作或被創(chuàng)建為這樣的處理結(jié)果的數(shù)據(jù)可被保存在任何存儲(chǔ)器中,如傳統(tǒng)領(lǐng)域中的。例如,這樣的數(shù)據(jù)可被保存在暫態(tài)存儲(chǔ)器中,如所給計(jì)算機(jī)系統(tǒng)或子系統(tǒng)的RAM。另外,或者其它方法,這樣的數(shù)據(jù)可被保存在長(zhǎng)期存儲(chǔ)器件中,如磁盤、可重寫光盤,等等。為這里揭示起見,計(jì)算機(jī)可讀介質(zhì)可包含任何形式的數(shù)據(jù)存儲(chǔ)機(jī)制,這包括這樣的現(xiàn)有存儲(chǔ)器技術(shù),以及這樣結(jié)構(gòu)或這樣數(shù)據(jù)的硬件或電路表示。
圖2依照本發(fā)明,描述保留冗余移去的運(yùn)行時(shí)間行為。保留冗余移去的運(yùn)行時(shí)間行為機(jī)制210采用原代碼200作為輸入,并移除原代碼200中的冗余,以通過原代碼200的運(yùn)行時(shí)間行為被保留的方式而產(chǎn)生最優(yōu)化代碼220。最初代碼200可用諸如Pascal、Visual Basic、C和Java這樣的編程語(yǔ)言來開發(fā)。C語(yǔ)言的異體也可被包括在內(nèi),這如C++、Borland C和C#。
原代碼200可包括不同的變量聲明、結(jié)構(gòu)定義以及不同的語(yǔ)句。語(yǔ)句可使用諸如變量或函數(shù)這樣的定義。語(yǔ)句也可計(jì)算一個(gè)或多個(gè)變量的值。例如,賦值語(yǔ)句可計(jì)算特定的變量值。不同的賦值語(yǔ)句可將常量分配給整個(gè)陣列。原代碼200中的冗余可存在于相同的數(shù)值沿著與原代碼200相關(guān)聯(lián)的控制流程圖中的路徑而被計(jì)算不止一次的時(shí)候。完全冗余存在于要被計(jì)算的數(shù)值已經(jīng)被預(yù)先肯定計(jì)算的時(shí)候。部分冗余出現(xiàn)在要被計(jì)算的數(shù)值可能已經(jīng)被預(yù)先計(jì)算的時(shí)候。
圖3依照本發(fā)明的實(shí)施例,描述保留冗余移去的運(yùn)行時(shí)間行為機(jī)制210的范例內(nèi)部高層框圖。保留冗余移去的運(yùn)行時(shí)間行為機(jī)制210包含臨界邊斷開機(jī)制(a critical edge breaking mechanism)310、編號(hào)機(jī)制320、數(shù)據(jù)流分析器330、完全冗余移去機(jī)制340,以及部分冗余移去機(jī)制350。
保留冗余移去的運(yùn)行時(shí)間行為機(jī)制210的操作可依照原代碼200的控制流程圖而被說明。一個(gè)范例控制流程圖在圖1(a)中闡明了。在控制流程圖中,存在節(jié)點(diǎn)和邊。每個(gè)節(jié)點(diǎn)可代表一條或多條指令、語(yǔ)句或子例程調(diào)用。有向邊是尾節(jié)點(diǎn)和頭節(jié)點(diǎn)之間的鏈接,其表示從尾節(jié)點(diǎn)到頭節(jié)點(diǎn)的流程。邊可以是有關(guān)基本節(jié)點(diǎn)的流入邊或流出邊。流入邊表示進(jìn)入基本節(jié)點(diǎn)的流程。例如,圖1(a)中節(jié)點(diǎn)2和節(jié)點(diǎn)9之間的邊是有關(guān)節(jié)點(diǎn)9的流入邊,其表示從節(jié)點(diǎn)2到節(jié)點(diǎn)9的計(jì)算流程。
控制流程圖中的節(jié)點(diǎn)可具有不止一個(gè)與其相關(guān)聯(lián)的邊。例如,節(jié)點(diǎn)可既具有流入邊,又具有流出邊。節(jié)點(diǎn)2具有流入邊和流出邊。節(jié)點(diǎn)也可具有不止一個(gè)流入邊或不止一個(gè)流出邊。如可在圖1(a)中看到的,節(jié)點(diǎn)1具有兩個(gè)流出邊,其表示在節(jié)點(diǎn)1之后的流程有不止一條路徑。例如,若節(jié)點(diǎn)1代表雙分支條件語(yǔ)句(如IF…ELSE語(yǔ)句),則其具有相應(yīng)于兩個(gè)輸出邊的兩個(gè)結(jié)果。同樣的,圖1(a)中的節(jié)點(diǎn)9具有大于兩條的流入邊,其表示流程進(jìn)入節(jié)點(diǎn)9存在不止一條路徑。例如,一條路徑相應(yīng)于沿著由開始于節(jié)點(diǎn)1處語(yǔ)句IF部分的路徑的計(jì)算序列,另一條路徑相應(yīng)于開始于節(jié)點(diǎn)1處語(yǔ)句ELSE部分的路徑。
臨界邊斷開機(jī)制310標(biāo)識(shí)控制流程圖中的臨界邊,并且通過插入新節(jié)點(diǎn)而斷開每個(gè)這樣的臨界邊。若初始節(jié)點(diǎn)具有多個(gè)流出邊且結(jié)束節(jié)點(diǎn)具有多個(gè)流入邊,則該邊就被定義為臨界邊。通過在初始節(jié)點(diǎn)和結(jié)束節(jié)點(diǎn)之間插入新的節(jié)點(diǎn)而“斷開”臨界邊。例如,在圖1(a)中,節(jié)點(diǎn)2和節(jié)點(diǎn)8是預(yù)先存在于節(jié)點(diǎn)1和節(jié)點(diǎn)9之間以及存在于節(jié)點(diǎn)7和節(jié)點(diǎn)9之間的臨界邊上這樣被插入的新節(jié)點(diǎn)。
編號(hào)機(jī)制320負(fù)責(zé)執(zhí)行數(shù)值編號(hào)。這樣的數(shù)值編號(hào)將符號(hào)名分配給所有或者計(jì)算相同數(shù)值或者顯示諸如拋出相同異常或不能終止這樣的相同運(yùn)行時(shí)間行為的定義。例如,兩條定義”x=5/a”和”y=5/b”可被分配相同的數(shù)值編號(hào),若”a”和”b”的變量數(shù)值具有相同的數(shù)值編號(hào)的話。在這種情況下,當(dāng)“a”和“b”相等時(shí),商在兩種情形下也是相等的,且這兩種情況均會(huì)在“a”和“b”均是零的時(shí)候拋出“被零除”的異常。
定義是計(jì)算表達(dá)式值并將已計(jì)算的值分配給目的文件(destination)的指令或語(yǔ)句。最好的結(jié)果是,或者表達(dá)式或者目的文件(或者兩者)應(yīng)當(dāng)為本地?zé)o地址變量(a local non-address-taken variable)。進(jìn)一步,表達(dá)式應(yīng)該不比可能組成想要移去的部分冗余工作的最小單元復(fù)雜。在定義更加復(fù)雜的情況下,其可能通過引入新的變量或新的賦值語(yǔ)句而被分解為令人滿意的形式。例如,”b[i]=h(a[i])”可被分解為”s=a[i];t=h(s);b[i]=t”,或者甚至更進(jìn)一步分解(若允許取地址“&”算子和取內(nèi)容“*”算子”s=a[i];t=h(s);u=&b[i];*u=t”。)。
數(shù)值編號(hào)機(jī)制320確保若兩個(gè)定義的行為相同(包括在正常條件下以及在異常條件下),則它們被賦予相同的數(shù)值編號(hào)。任何本領(lǐng)域已知的數(shù)值編號(hào)技術(shù)可用來實(shí)現(xiàn)編號(hào)機(jī)制320。在一個(gè)較佳實(shí)施例中,采用漸進(jìn)數(shù)值編號(hào)算法(aggressive value numbering algorithm)。通過使用漸進(jìn)編號(hào)算法,既可處理函數(shù)調(diào)用定義,又可處理非函數(shù)調(diào)用定義。在處理功能調(diào)用定義中,對(duì)函數(shù)調(diào)用的輸出相應(yīng)于被調(diào)用函數(shù)可讀取的所有位置集合。這樣的位置組成一函數(shù)的讀取集合。假定對(duì)相同函數(shù)有兩個(gè)不同調(diào)用,則讀取集合沒有在調(diào)用之間被修改的證明保證這兩個(gè)調(diào)用將具有相同的行為。也就是說,它們將計(jì)算相同的數(shù)值、寫相同的數(shù)值,并拋出相同的異常。這甚至對(duì)間接(虛擬)調(diào)用也是真實(shí)的,依照它們的目標(biāo)具有相同的值號(hào)碼。
數(shù)據(jù)流分析器330根據(jù)控制流程圖來執(zhí)行流分析,那里所有的定義都是已編號(hào)的數(shù)值。對(duì)每個(gè)獨(dú)特的值號(hào)碼而言(其可相應(yīng)于多個(gè)定義實(shí)例),數(shù)據(jù)流分析器330掃描通過整個(gè)基礎(chǔ)控制流程圖,以識(shí)別有關(guān)每個(gè)定義實(shí)例的其可用性狀態(tài)和預(yù)期狀態(tài)。特定指令(如k)的定義可用性狀態(tài)(如相應(yīng)值號(hào)碼n)(如在特定的節(jié)點(diǎn),這包括被臨界邊斷開機(jī)制310新近添加的節(jié)點(diǎn))可被表示為AVAIL(k,n)。這個(gè)AVAIL(k,n)值表明指令k中具有值號(hào)碼n的定義數(shù)值是否可用在評(píng)估點(diǎn)處。
同樣的,指令k具有值號(hào)碼n的定義預(yù)期狀態(tài)可被表示為ANTIC(k,n)。ANTIC(k,n)的數(shù)值表明指令k中具有值號(hào)碼n的定義數(shù)值是否需要或在評(píng)估點(diǎn)后使用,以及該定義是否可在這個(gè)點(diǎn)處被計(jì)算。有關(guān)確立這些狀態(tài)數(shù)值的更詳細(xì)的討論參考圖4-5被給出。
基于與控制流程圖中每個(gè)節(jié)點(diǎn)處的每個(gè)定義相關(guān)聯(lián)的已檢測(cè)可用性狀態(tài)信息(AVAIL),完全冗余移去機(jī)制340標(biāo)識(shí)現(xiàn)有的完全冗余,并隨后移去這樣標(biāo)識(shí)的完全冗余。部分冗余移去機(jī)制350根據(jù)AVAIL和ANTIC狀態(tài)來標(biāo)識(shí)現(xiàn)有的部分冗余,并隨后移去已標(biāo)識(shí)的部分冗余。
圖4根據(jù)本發(fā)明的實(shí)施例,示出在計(jì)算涉及數(shù)值編號(hào)定義的狀態(tài)信息時(shí)數(shù)據(jù)流分析器330的范例內(nèi)部結(jié)構(gòu)。數(shù)據(jù)流分析器330包含前進(jìn)流分析器410和后退流分析器420。前者執(zhí)行有關(guān)基礎(chǔ)控制流程圖的前進(jìn)方向的流分析,以生成可用性狀態(tài)信息AVAIL。后者執(zhí)行后退方向的流分析,以生成預(yù)期狀態(tài)ANTIC。
AVAIL和ANTIC均具有表明基礎(chǔ)狀態(tài)的數(shù)值。AVAIL表明特定節(jié)點(diǎn)處定義數(shù)值的可用性。也就是說,其表明該定義的數(shù)值是否已經(jīng)可用于該節(jié)點(diǎn)之前。可能的不同狀態(tài)可包括“不可用”、“可能可用”、“必須可用”或者“不關(guān)心”。另一個(gè)方面,特定節(jié)點(diǎn)處定義的預(yù)期狀態(tài)表明基礎(chǔ)定義的值是否需要或用于這個(gè)特定節(jié)點(diǎn)以外。同樣的,不同的狀態(tài)信息可包括“沒有使用”、“可能使用”、“必須使用”以及“不能確定”。圖5(a)闡明包含那四個(gè)提到值的四點(diǎn)金剛石格點(diǎn),那里“頂端”意味著“不關(guān)心”。有關(guān)格點(diǎn)值的交操作符∩表示“最壞情形”。下面是做出定義的表格
在前進(jìn)流分析階段,前進(jìn)流分析器410(圖4)可開始于控制流程圖中的第一(頂端)節(jié)點(diǎn)(如圖1(a)中的節(jié)點(diǎn)1)并順著邊方向而遍歷整個(gè)控制流程圖。在前進(jìn)流分析中,在每個(gè)節(jié)點(diǎn)處,執(zhí)行兩個(gè)可用性評(píng)估。一個(gè)是在節(jié)點(diǎn)的入口點(diǎn)處,或者沿著節(jié)點(diǎn)的流入邊。這是用AVAILin來表示的。另一個(gè)是在節(jié)點(diǎn)的出口點(diǎn)處,或者沿著節(jié)點(diǎn)的流出邊。這是用AVAILout來表示的。AVAILin和AVAILout分別表示進(jìn)入節(jié)點(diǎn)時(shí)和離開節(jié)點(diǎn)時(shí)相關(guān)定義值的可用性。
節(jié)點(diǎn)的AVAILout可由該節(jié)點(diǎn)的AVAILin以及在該節(jié)點(diǎn)中執(zhí)行何種計(jì)算來確定。例如,若基礎(chǔ)定義的值在該節(jié)點(diǎn)處沒有變化(即在這個(gè)節(jié)點(diǎn)處沒有計(jì)算該值,而且在這個(gè)節(jié)點(diǎn)處影響該值計(jì)算的位置沒有發(fā)生變化),則AVAILout簡(jiǎn)單地繼承AVAILin的值。當(dāng)節(jié)點(diǎn)具有單個(gè)流入邊時(shí),AVAILin的數(shù)值與前導(dǎo)節(jié)點(diǎn)(即流入邊的初始節(jié)點(diǎn))的AVAILout相同。當(dāng)節(jié)點(diǎn)具有多個(gè)引入邊時(shí),AVAILin的值可根據(jù)來自所有前任節(jié)點(diǎn)的AVAILout的值而被確定。在一個(gè)較佳實(shí)施例中,特定節(jié)點(diǎn)處的AVAILin和AVAILout的值均可被定義為 若指令k是進(jìn)入指令(如圖1(a)中的節(jié)點(diǎn)1),則AVAILin(k,n)的數(shù)值是“否”。若節(jié)點(diǎn)k不是進(jìn)入指令,則AVAILin(k,n)的值被計(jì)算為所有前導(dǎo)節(jié)點(diǎn)的所有AVAILout值的“交”(如操作符∩)。
若基礎(chǔ)定義用指令k來計(jì)算(在節(jié)點(diǎn)處)并且該計(jì)算不改變用于計(jì)算該定義的輸入,則AVAILout的值是“必須”。也就是說,在這種情況下,我們確切的知道該值是可用的。若用于計(jì)算定義的輸入被改變(ALTERED(k,n)=true),則AVAILout的值是“否”。否則,AVAILout的數(shù)值簡(jiǎn)單繼承相同節(jié)點(diǎn)AVAILin(k,n)的值,這是因?yàn)闆]有對(duì)此節(jié)點(diǎn)進(jìn)行任何操作已改變了該值的可用性。
當(dāng)后退流分析器420執(zhí)行后退流分析時(shí),其開始于控制流程圖的最后節(jié)點(diǎn)(如圖1(a)中的節(jié)點(diǎn)10)并順著該邊的相反方向而遍歷整個(gè)控制流程圖。在后退流分析中,在每個(gè)節(jié)點(diǎn)處,執(zhí)行兩個(gè)預(yù)期評(píng)估。一個(gè)是在節(jié)點(diǎn)的退出點(diǎn)處,或者沿著節(jié)點(diǎn)的流出邊。這是用ANTICout來表示的。另一個(gè)是在節(jié)點(diǎn)的入口點(diǎn)處,或者沿著節(jié)點(diǎn)的流入邊。這是用ANTICin來表示的。ANTICin和ANTICout分別表示有關(guān)進(jìn)入節(jié)點(diǎn)時(shí)和離開節(jié)點(diǎn)時(shí)節(jié)點(diǎn)處相關(guān)定義值的預(yù)期需要。在一個(gè)較佳實(shí)施例中,ANTICin和ANTICout的數(shù)值可被計(jì)算為 若指令k計(jì)算定義,則ANTICin(k,n)的值是“必須”,這是因?yàn)槠湟欢ㄓ锌赡茉谠摴?jié)點(diǎn)處計(jì)算。若指令k不計(jì)算定義并改變用于計(jì)算定義的輸入,則ANTICin(k,n)的值是“否”,這是因?yàn)樵诠?jié)點(diǎn)前計(jì)算的值可能在影響其計(jì)算的輸入改變的作用下變成過時(shí)狀態(tài)。否則,ANTICin(k,n)的值就是ANTICout(k,n)的值。若指令k是退出指令,則ANTICin(k,n)的值是“否”。否則,ANTICin(k,n)的值被計(jì)算為所有后繼節(jié)點(diǎn)的所有ANTICin值的“交”(如操作符∩)。
前進(jìn)流分析和后退流分析產(chǎn)生四個(gè)狀態(tài)值(AVAILin(k,n)、AVAILout(k,n)、ANTICout(k,n)、ANTICout(k,n)),其關(guān)于具有每個(gè)節(jié)點(diǎn)處每條指令k的值號(hào)碼n的每個(gè)定義。這樣的評(píng)估狀態(tài)既用于標(biāo)識(shí)冗余(完全和部分),又用于已標(biāo)識(shí)冗余的移去。
圖5(b)闡明關(guān)于范例控制流程圖中每個(gè)節(jié)點(diǎn)的AVAILin、AVAILout、ANTICin以及ANTICout的計(jì)算值。
圖6根據(jù)本發(fā)明的實(shí)施例,示出完全冗余移去機(jī)制340的范例內(nèi)部結(jié)構(gòu)。該完全冗余移去機(jī)制340包含完全冗余標(biāo)識(shí)器610和完全冗余移去器620。前者是要標(biāo)識(shí)完全冗余的位置,而后者是要將完全冗余從這樣標(biāo)識(shí)的位置中移去。在一個(gè)較佳實(shí)施例中,完全冗余標(biāo)識(shí)器610使用準(zhǔn)則AVAILin(k,n)=”Must”來識(shí)別完全冗余。也就是說,若具有值號(hào)碼n的定義值在流進(jìn)入節(jié)點(diǎn)k的時(shí)候確??捎茫瑒t完全冗余存在于節(jié)點(diǎn)k處。有關(guān)移去完全冗余的細(xì)節(jié)參考圖9來討論。
圖7根據(jù)本發(fā)明的實(shí)施例,描述部分冗余移去機(jī)制620的范例內(nèi)部結(jié)構(gòu)。部分冗余移去機(jī)制350包含部分冗余標(biāo)識(shí)器710、標(biāo)志插入機(jī)制720以及保護(hù)插入機(jī)制730。部分冗余標(biāo)識(shí)器710負(fù)責(zé)根據(jù)有關(guān)每個(gè)節(jié)點(diǎn)處每條指令中的每個(gè)定義的可用性和預(yù)期狀態(tài)而對(duì)部分冗余進(jìn)行定位。
標(biāo)志插入機(jī)制720負(fù)責(zé)初始化在適當(dāng)節(jié)點(diǎn)處插入的必要標(biāo)志數(shù)值,以表示部分冗余已經(jīng)被檢測(cè)到的定義值的可用性。保護(hù)插入機(jī)制730負(fù)責(zé)在部分冗余被檢測(cè)到的節(jié)點(diǎn)處插入與插入標(biāo)志相關(guān)聯(lián)的保護(hù)指令。涉及部分冗余檢測(cè)的細(xì)節(jié)參考圖10來討論。
圖8是根據(jù)本發(fā)明實(shí)施例的范例進(jìn)程的流程圖,其中代碼中的冗余以保留運(yùn)行時(shí)間行為的方式而被移去。首先在動(dòng)作810處,根據(jù)關(guān)于要執(zhí)行冗余移去的原代碼而構(gòu)造控制流程圖。在動(dòng)作820處,控制流程圖中的臨界邊通過插入添加的節(jié)點(diǎn)而被標(biāo)識(shí)并被斷開。這就創(chuàng)建已更新的控制流程圖。
然后在動(dòng)作830處執(zhí)行值編號(hào)。在動(dòng)作840和850處,關(guān)于每條指令中的每個(gè)獨(dú)特的值號(hào)碼,根據(jù)值號(hào)碼來執(zhí)行前進(jìn)流分析和后退流分析。這就產(chǎn)生相應(yīng)于每條指令中每個(gè)定義值的可用性和預(yù)期用途的四個(gè)狀態(tài)值,其在基礎(chǔ)節(jié)點(diǎn)的登錄和退出點(diǎn)處均被評(píng)估。根據(jù)這些可用性和預(yù)期使用狀態(tài)信息,完全冗余在動(dòng)作860處被移去,并且部分冗余在動(dòng)作870處被移去。涉及移去完全和部分冗余的細(xì)節(jié)在下面參考圖9和圖10來討論。
圖9是根據(jù)本發(fā)明實(shí)施例的范例進(jìn)程的流程圖,其中節(jié)點(diǎn)處的完全冗余被標(biāo)識(shí)并被移去。對(duì)每個(gè)指令而言(或者在控制流程圖的每個(gè)節(jié)點(diǎn)處),具有值號(hào)碼n的定義d首先在動(dòng)作910處被標(biāo)識(shí)。然后,在動(dòng)作920處決定,當(dāng)前節(jié)點(diǎn)處定義d的計(jì)算根據(jù)上述準(zhǔn)則是否是完全冗余的。若其不是完全冗余的,則在動(dòng)作960處決定,在這個(gè)節(jié)點(diǎn)處是否有其它需要檢查有關(guān)完全冗余的定義。若至少剩余一個(gè)定義,則處理返回到動(dòng)作910處,以檢查下一個(gè)定義。否則,有關(guān)當(dāng)前節(jié)點(diǎn)的處理在動(dòng)作970處終止。該處理可前進(jìn)到下一個(gè)節(jié)點(diǎn)(未示出)。
若定義d的計(jì)算被標(biāo)識(shí)為完全冗余,則執(zhí)行一系列操作,以移去該冗余。在動(dòng)作930處,臨時(shí)變量t(n)被用來替換具有值號(hào)碼n的定義d。然后,在動(dòng)作940處,插入指令,其將t(n)的值復(fù)制到定義d的初始目的文件。最后,在動(dòng)作950處,通過使用臨時(shí)變量t(n),定義d(具有值號(hào)碼n)的每個(gè)使用都被替換了。移去完全冗余的一個(gè)例子在圖11中闡明了。圖1(a)示出初始控制流程圖。在這個(gè)例子中沒有臨界邊。在節(jié)點(diǎn)7處計(jì)算的定義h(x)被標(biāo)識(shí)為完全冗余。不是在節(jié)點(diǎn)7處再次計(jì)算h(x),而是在節(jié)點(diǎn)4或節(jié)點(diǎn)5處計(jì)算的h(x)被復(fù)制到臨時(shí)變量t中。然后,在節(jié)點(diǎn)7處,h(x)的計(jì)算參考臨時(shí)變量t而被替換。
圖10是根據(jù)本發(fā)明實(shí)施例的范例進(jìn)程的流程圖,其中給出原代碼中的部分冗余被標(biāo)識(shí)并被移去。首先在動(dòng)作1010處標(biāo)識(shí)合并點(diǎn)(a merge point)之前的指令k。合并點(diǎn)是具有不止一個(gè)流入邊的節(jié)點(diǎn)。例如,圖1(a)中所示控制流程圖中的節(jié)點(diǎn)9是合并點(diǎn)處的節(jié)點(diǎn)。用j表示的第一指令也在動(dòng)作1015處被標(biāo)識(shí)。這個(gè)合并點(diǎn)之前的指令可為節(jié)點(diǎn)1處或節(jié)點(diǎn)7處的指令(節(jié)點(diǎn)2和8是被添加的節(jié)點(diǎn))。相關(guān)指令k,具有值號(hào)碼n的定義d在動(dòng)作1020處被標(biāo)識(shí)。
在動(dòng)作1025處確定指令k中具有值號(hào)碼n的定義d是否為部分冗余。用來做出該判決的準(zhǔn)則包括兩部分。一部分是AVAILin(j,n)的值是“可能”,這意味著合并點(diǎn)處第一指令j處的定義d可能是可用的。另一部分是指令k處定義d的預(yù)期需要或者為“可能”或者為“必須”。當(dāng)兩個(gè)條件都滿足時(shí),存在要移去的有用部分冗余。僅當(dāng)?shù)谝粭l件被滿足時(shí),存在部分冗余,但是表達(dá)式是“無用”,并且其通常通過編譯器內(nèi)的其它優(yōu)化而被移去。僅當(dāng)?shù)诙l件符合時(shí),就不存在冗余。
若沒有關(guān)于與指令k相關(guān)聯(lián)的定義d的部分冗余,則處理前進(jìn)到動(dòng)作1050,以確定是否有另一個(gè)要被檢查部分冗余的相關(guān)指令k的定義。若有的話,則處理返回到動(dòng)作1020,以標(biāo)識(shí)下一個(gè)定義。若所有與指令k相關(guān)聯(lián)的定義都已經(jīng)被檢查過,則處理前進(jìn)到下一條指令,若有的話。當(dāng)還有指令的時(shí)候,處理返回到動(dòng)作1010,以標(biāo)識(shí)合并點(diǎn)之前的下一條指令。
當(dāng)存在部分冗余時(shí),標(biāo)志被插入,其具有初始化值。由于合并點(diǎn)處的節(jié)點(diǎn)具有不止一個(gè)流入邊,其依據(jù)可用性狀態(tài)AVAILout(k,n),標(biāo)志的值可被不同地設(shè)置。圖5(b)和11共同闡明該點(diǎn)。節(jié)點(diǎn)2處AVAILout(k,n)的值是“否”,其在動(dòng)作1030處被確定,這表明定義d的值是不可用的。在這種情況下,標(biāo)志在節(jié)點(diǎn)2處被插入(一添加節(jié)點(diǎn)),其具有初始值零,這代表定義d的值還沒有被計(jì)算的事實(shí)。這在動(dòng)作1035處執(zhí)行。另一方面,節(jié)點(diǎn)8處AVAILout(k,n)的值是“必須”,其在動(dòng)作1040處被確定,這表明定義d值的可用性被確保為可用。在這樣的情況下,標(biāo)志在節(jié)點(diǎn)8處被插入(一添加節(jié)點(diǎn)),其具有初始值一,其在動(dòng)作1045處被執(zhí)行。
當(dāng)處理所有指令中的所有定義,用于檢測(cè)部分冗余并插入標(biāo)志之后,保護(hù)插入機(jī)制730進(jìn)一步將防護(hù)插入到部分冗余存在的每個(gè)合并點(diǎn)處。對(duì)每個(gè)合并點(diǎn)而言,指令(如指令k)在動(dòng)作1060處標(biāo)識(shí)。然后對(duì)合并點(diǎn)處相關(guān)指令k的每個(gè)定義(如定義d)而言,若具有值號(hào)碼n的定義d的值的可用性不確定(即AVAILin(k,n)=“可能”),其在動(dòng)作1065處被確定,則保護(hù)插入機(jī)制730在動(dòng)作1075處插入有關(guān)定義d的保護(hù)。
有關(guān)定義d的保護(hù)根據(jù)沿著合并點(diǎn)之前不同流入分支而插入的標(biāo)志被設(shè)置。這在圖11中闡明,其中標(biāo)志在節(jié)點(diǎn)2和節(jié)點(diǎn)8處被初始化(即f=0且f=1)。在合并節(jié)點(diǎn)9處,根據(jù)插入標(biāo)志f來構(gòu)造保護(hù)?!癷f”條件指令被插入(在圖11中的新節(jié)點(diǎn)9a處),其檢查標(biāo)志的值(即“if f=0”)。若f的值是一,則其表明定義d的值(如h(x)=d)已經(jīng)被計(jì)算并可確保用于這個(gè)點(diǎn)處。在這種情況下,對(duì)指令k中定義d的參考被變量t(n)替換(在第二添加新節(jié)點(diǎn)9c處)。
若f的值是零,則其表明定義d的值還沒有被計(jì)算,且其不可用于這個(gè)點(diǎn)。在這樣的情況下,h(x)被在第三添加新節(jié)點(diǎn)9b處計(jì)算。在這個(gè)例子中,由于沒有循環(huán),所以標(biāo)志f的值就沒有被重新設(shè)置為一。在本發(fā)明的其它實(shí)施例中,標(biāo)志f的值可在定義d是循環(huán)中的循環(huán)不變量時(shí)被重新設(shè)置。圖12和圖13說明在包括循環(huán)不變量定義的情況下的備選保護(hù)構(gòu)造。保護(hù)插入機(jī)制730(在動(dòng)作1085處)迭代每條指令的每個(gè)定義(動(dòng)作1080處),并在動(dòng)作1090處終止該處理。
圖12(a)-(c)依照本發(fā)明的實(shí)施例,闡明移去相關(guān)循環(huán)中循環(huán)不變量的部分冗余的范例。圖12(a)示出初始控制流程圖,其中控制流h(x)是循環(huán)不變量,而其在每次迭代中被重新計(jì)算。這是部分冗余,原因是第一次計(jì)算是需要的,但其余計(jì)算不是需要的。圖2(b)根據(jù)一個(gè)實(shí)施例,示出用于移去部分冗余的一個(gè)解決方案。標(biāo)志f在具有初始值為零的循環(huán)入口之前被插入。現(xiàn)有領(lǐng)域解決方案將循環(huán)不變量提升到循環(huán)外。這樣解決方案中的h(x)的向上運(yùn)動(dòng)改變運(yùn)行時(shí)間異?;蚪K止行為。
在圖12(b)中,一保護(hù)包圍在節(jié)點(diǎn)2周圍,那里h(x)以保留h(x)運(yùn)行時(shí)間異常以及終止行為的方式(上述)而被計(jì)算。然而,附加指令被插入,其將標(biāo)志f的值設(shè)置為1,其表明h(x)已經(jīng)被計(jì)算了。這里,標(biāo)志在保護(hù)外被重新設(shè)置。使用這個(gè)重新設(shè)置的標(biāo)志值,在后續(xù)重復(fù)中,h(x)將不被重新計(jì)算。通過這個(gè)解決方案,標(biāo)志可在每個(gè)后續(xù)迭代中被設(shè)置。圖12(c)中示出不同的備選方案,以移動(dòng)將標(biāo)志重新設(shè)置到保護(hù)內(nèi)部的指令。這就避免設(shè)置標(biāo)志不止一次。通過這個(gè)備選方案,標(biāo)志f的活動(dòng)范圍可增加。
某些循環(huán)可具有零個(gè)迭代。這在圖13(a)中被闡明。雖然節(jié)點(diǎn)2和節(jié)點(diǎn)3形成循環(huán),但是循環(huán)可能從不迭代超過第一行程。傳統(tǒng)的解決方案將在循環(huán)之前推理計(jì)算h(x),將h(x)的計(jì)算值賦給臨時(shí)變量,并然后用臨時(shí)變量來替換對(duì)h(x)的參考。這就改變了運(yùn)行異常以及終止行為。如圖13(b)所示,本發(fā)明的一個(gè)實(shí)施例通過推理在循環(huán)之前設(shè)置標(biāo)志(f=0),并然后用保護(hù)圍繞定義h(x)。一旦定義h(x)已經(jīng)被計(jì)算,則標(biāo)志在保護(hù)外部被重新設(shè)置(f=1)。在圖13(c)所示的另一個(gè)實(shí)施例中,標(biāo)志在保護(hù)內(nèi)部被重新設(shè)置,以避免重復(fù)重新設(shè)置。同樣的,這可增加標(biāo)志f的活動(dòng)范圍。
圖14根據(jù)本發(fā)明的實(shí)施例,描述使用運(yùn)行時(shí)間行為的框架,其保留冗余移去機(jī)制,以導(dǎo)出最優(yōu)化可執(zhí)行代碼。原代碼200由運(yùn)行時(shí)間行為處理,其保留冗余移去機(jī)制210,以產(chǎn)生最優(yōu)化代碼220。編譯器1410對(duì)最優(yōu)化代碼220進(jìn)行編譯,以產(chǎn)生可執(zhí)行最優(yōu)化代碼1420。代碼執(zhí)行機(jī)制1430執(zhí)行可執(zhí)行最優(yōu)化代碼1420。
雖然已經(jīng)參考特定的已闡明實(shí)施例而說明了本發(fā)明,但是已經(jīng)在這里使用的文字是描述性文字,并非限制性文字。在不背離本發(fā)明各方面范疇和主旨的前提下,可在附加權(quán)利要求書的范圍內(nèi)進(jìn)行變化。盡管這里已經(jīng)參考特定的結(jié)構(gòu)、動(dòng)作和材料來說明了本發(fā)明,但是本發(fā)明并不被限制在說明的細(xì)節(jié),而是其可體現(xiàn)為多種形式,某些形式可能與說明的實(shí)施例大不相同,并且其可擴(kuò)展到附加權(quán)利要求書范圍內(nèi)的所有等效結(jié)構(gòu)、動(dòng)作以及材料等。
權(quán)利要求
1.一種方法包含接收原代碼;執(zhí)行保留關(guān)于所述原代碼的冗余移去的運(yùn)行時(shí)間行為,以產(chǎn)生最優(yōu)化代碼,其中所述最優(yōu)化代碼是在從所述原代碼中移去冗余之后導(dǎo)出的,這是通過以所述最優(yōu)化代碼的所述運(yùn)行時(shí)間行為與所述原代碼的所述運(yùn)行時(shí)間行為相同的方式進(jìn)行的,以及所述移去冗余包括在運(yùn)行時(shí)間移去可能拋出一異常或不能終止的指令。
2.如權(quán)利要求1所述的方法,其特征在于所述執(zhí)行保留冗余移去的運(yùn)行時(shí)間行為包含將標(biāo)志設(shè)置為表明所述原代碼定義的所述可用性的值;以及將一保護(hù)插入到定義實(shí)例周圍,其中所述保護(hù)能夠根據(jù)所述標(biāo)志的所述值來指引處理。
3.如權(quán)利要求2所述的方法,進(jìn)一步包含對(duì)基于所述原代碼確立的控制流程圖中的節(jié)點(diǎn)相關(guān)聯(lián)的指令中的每個(gè)定義進(jìn)行編號(hào),以產(chǎn)生編號(hào)定義;執(zhí)行有關(guān)所述控制流程圖的流分析,以關(guān)于所述控制流程圖中的節(jié)點(diǎn)相關(guān)聯(lián)的指令中的每個(gè)編號(hào)定義而產(chǎn)生第一對(duì)值和第二對(duì)值;根據(jù)所述第一對(duì)值和所述第二對(duì)值來移去所述原代碼中的冗余。
4.如權(quán)利要求3所述的方法,其特征在于所述移去冗余包含使用所述第一和第二對(duì)值來移去部分冗余,其中所述第一對(duì)值對(duì)應(yīng)于AVAILin和AVAILout,其表明分別在所述指令執(zhí)行之前和之后所述已編號(hào)定義的所述值的所述可用性,并且第二對(duì)值對(duì)應(yīng)于ANTICin和ANTICout,其表明所述已編號(hào)定義的所述值是否可分別在執(zhí)行所述指令之前和之后被預(yù)期到,以及AVAILin、AVAILout、ANTICin和ANTICout的所述值包括頂端、必須、無,以及可能。
5.如權(quán)利要求4所述的方法,其特征在于所述移去部分冗余包含對(duì)每個(gè)已編號(hào)定義而言,標(biāo)識(shí)具有多個(gè)流入分支的合并點(diǎn),其中所述合并點(diǎn)處所述已編號(hào)定義的所述AVAILin的所述值表明所述合并點(diǎn)處所述已編號(hào)定義的所述值的所述可用性是不確定的;若關(guān)于所述已編號(hào)定義的AVAILout的所述值表明所述已編號(hào)定義不可用,則設(shè)置所述標(biāo)志的第一數(shù)值;若關(guān)于所述已編號(hào)定義的AVAILout的所述值表明所述已編號(hào)定義可用,則設(shè)置所述標(biāo)志的第二數(shù)值;以及放置對(duì)于所述已編號(hào)定義的所述合并點(diǎn)處的所述保護(hù),其中所述保護(hù)根據(jù)所述標(biāo)志的所述值來指引處理。
6.如權(quán)利要求4所述的方法,進(jìn)一步包含根據(jù)所述第一對(duì)值來移去所述原代碼中的完全冗余。
7.一種關(guān)于保留冗余移去的運(yùn)行時(shí)間行為的方法包含在根據(jù)原代碼構(gòu)造的控制流程圖中的每個(gè)節(jié)點(diǎn)處對(duì)指令中的每個(gè)定義進(jìn)行編號(hào),以產(chǎn)生已編號(hào)的定義;以及移去所述原代碼中的冗余,使得所述原代碼的所述運(yùn)行時(shí)間行為被保留,其中所述冗余移去包括移去所述原代碼中的指令,其在運(yùn)行時(shí)可能拋出異?;蛘邿o法終止。
8.如權(quán)利要求7所述的方法,其特征在于所述移去冗余包含設(shè)置具有表明所述原代碼定義的所述可用性值的標(biāo)志;以及將保護(hù)插入到所述定義的實(shí)例周圍,其中所述保護(hù)能夠根據(jù)所述標(biāo)志的所述值來指引處理。
9.如權(quán)利要求8所述的方法,進(jìn)一步包含執(zhí)行流分析,以產(chǎn)生關(guān)于相關(guān)所述控制流程圖中節(jié)點(diǎn)的指令中的每個(gè)已編號(hào)定義的第一對(duì)值和第二對(duì)值,其中所述第一對(duì)值,其生成于前進(jìn)流分析中,相應(yīng)于AVAILin和AVAILout,這表明分別在執(zhí)行所述指令之前和之后所述已編號(hào)定義的所述值的所述可用性,所述第二對(duì)值,其生成于后退流分析中,相應(yīng)于ANTICin和ANTICout,這表明所述已編號(hào)定義的所述值是否可分別在執(zhí)行所述指令之前和之后被預(yù)期到,以及AVAILin、AVAILout、ANTICin和ANTICout的所述值包括頂端、必須、無,以及可能。
10.如權(quán)利要求9所述的方法,其特征在于所述移去冗余包含根據(jù)所述第一對(duì)和所述第二對(duì)值來移去部分冗余。
11.如權(quán)利要求10所述的方法,其特征在于所述移去部分冗余包含對(duì)每個(gè)已編號(hào)定義而言,標(biāo)識(shí)具有多個(gè)流入合并分支的合并點(diǎn),其中在所述合并點(diǎn)處所述已編號(hào)定義的所述AVAILin的所述值表明在所述合并點(diǎn)處所述已編號(hào)定義的所述值的所述可用性是不確定的;若關(guān)于所述已編號(hào)定義的AVAILout的所述值表明所述已編號(hào)定義不可用,則設(shè)置所述標(biāo)志的第一數(shù)值;若關(guān)于所述已編號(hào)定義的AVAILout的所述值表明所述已編號(hào)定義可用,則設(shè)置所述標(biāo)志的第二數(shù)值;以及在對(duì)于所述已編號(hào)定義的所述合并點(diǎn)處放置所述保護(hù),其中所述保護(hù)根據(jù)所述標(biāo)志的所述值來指引處理。
12.如權(quán)利要求9所述的方法,進(jìn)一步包含移去完全冗余,其中所述移去完全冗余包括標(biāo)識(shí)與指令相關(guān)聯(lián)的已編號(hào)定義是完全冗余的節(jié)點(diǎn);用臨時(shí)變量來替換所述已編號(hào)的定義;插入指令,其中所述插入的指令將所述臨時(shí)變量的所述值復(fù)制到所述已編號(hào)定義的所述目的地;以及用所述臨時(shí)變量的所述值來替換所述已編號(hào)定義的每個(gè)使用。
13.一系統(tǒng)包含編號(hào)機(jī)制,其能夠?qū)Ω鶕?jù)原代碼確立的控制流程圖的每個(gè)節(jié)點(diǎn)相關(guān)聯(lián)的指令中的每個(gè)定義進(jìn)行編號(hào);數(shù)據(jù)流分析器,其能夠執(zhí)行有關(guān)所述控制流程圖的流分析,以產(chǎn)生相關(guān)每個(gè)節(jié)點(diǎn)的每個(gè)已編號(hào)定義的第一對(duì)值和第二對(duì)值;冗余移去機(jī)制,其能夠根據(jù)與每個(gè)節(jié)點(diǎn)相關(guān)聯(lián)的所述第一對(duì)值和所述第二對(duì)值來移去所述原代碼中的冗余,以產(chǎn)生最優(yōu)化代碼。
14.如權(quán)利要求13所述的系統(tǒng),其特征在于所述數(shù)據(jù)流分析器包含前進(jìn)流分析器,其能夠執(zhí)行前進(jìn)流分析,以產(chǎn)生關(guān)于與指令相關(guān)聯(lián)的每個(gè)已編號(hào)定義的所述第一對(duì)值;以及后退流分析器,其能夠執(zhí)行后退流分析,以產(chǎn)生關(guān)于與指令相關(guān)聯(lián)的每個(gè)已編號(hào)定義的所述第二對(duì)值;其中所述第一對(duì)值對(duì)應(yīng)于AVAILin和AVAILout,其表明分別在執(zhí)行所述指令之前和之后所述已編號(hào)定義的所述值的所述可用性,所述第二對(duì)值對(duì)應(yīng)于ANTICin和ANTICout,其表明所述已編號(hào)定義的所述值是否可分別在執(zhí)行所述指令之前和之后被預(yù)期到,以及AVAILin、AVAILout、ANTICin和ANTICout的所述值包括頂端、必須、無,以及可能。
15.如權(quán)利要求14所述的系統(tǒng),其特征在于所述冗余移去機(jī)制包含部分冗余移去機(jī)制,其能夠根據(jù)所述第一對(duì)和所述第二對(duì)值來移去所述原代碼中的部分冗余。
16.如權(quán)利要求15所述的系統(tǒng),其特征在于所述部分冗余移去機(jī)制包含部分冗余標(biāo)識(shí)器,其能夠關(guān)于已編號(hào)定義來標(biāo)識(shí)具有多個(gè)流入合并分支的合并點(diǎn),其中所述合并點(diǎn)處所述已編號(hào)定義的所述AVAILin的所述值是“否”,這表明所述合并點(diǎn)處所述已編號(hào)定義的所述值是不可用的;標(biāo)志插入機(jī)制,其能夠在兩個(gè)分支處插入標(biāo)志并設(shè)置所述標(biāo)志的值;以及保護(hù)插入機(jī)制,其能夠在關(guān)于已編號(hào)定義的所述合并點(diǎn)處插入保護(hù)開關(guān),其中所述保護(hù)開關(guān)根據(jù)所述標(biāo)志的所述值來指引處理,其中所述標(biāo)志被沿著第一合并分支設(shè)置為第一數(shù)值,若關(guān)于所述第一合并分支處的所述已編號(hào)定義的AVAILout的所述值表明所述已編號(hào)定義不可用的話,以及所述標(biāo)志被沿著第二合并分支設(shè)置為第二數(shù)值,若關(guān)于所述第二合并分支處的所述已編號(hào)定義的AVAILout的所述值表明所述已編號(hào)定義可用的話。
17.如權(quán)利要求15所述的系統(tǒng),進(jìn)一步包含完全冗余移去機(jī)制,其能夠根據(jù)所述第一對(duì)值來移去所述原代碼中的完全冗余。
18.如權(quán)利要求17所述的系統(tǒng),其特征在于所述完全冗余移去機(jī)制包含完全冗余標(biāo)識(shí)器,其能夠標(biāo)識(shí)與一指令相關(guān)聯(lián)的已編號(hào)定義是完全冗余的節(jié)點(diǎn);以及完全冗余移去器,其能夠移去所述節(jié)點(diǎn)處所述已編號(hào)定義的所述已標(biāo)識(shí)的完全冗余,這通過將所述已編號(hào)定義的所述值賦給臨時(shí)變量,插入指令,其中所述插入指令將所述臨時(shí)變量的所述值復(fù)制到所述已編號(hào)定義的所述目的地,以及用所述臨時(shí)變量的所述值來替換所述已編號(hào)定義的每個(gè)使用。
19.如權(quán)利要求13所述的系統(tǒng),進(jìn)一步包含編譯器,其能夠編譯所述最優(yōu)化代碼,以生成可執(zhí)行最優(yōu)化代碼;以及執(zhí)行機(jī)制,其能夠執(zhí)行所述可執(zhí)行最優(yōu)化代碼。
20.一種包含具有保存于其上指令的存儲(chǔ)介質(zhì)的制品,當(dāng)由機(jī)器執(zhí)行時(shí),會(huì)產(chǎn)生如下情況接收原代碼;執(zhí)行保留有關(guān)所述原代碼的冗余移去的運(yùn)行時(shí)間行為,以產(chǎn)生最優(yōu)化代碼,其中所述最優(yōu)化代碼是在從所述原代碼中移去冗余之后導(dǎo)出的,這是通過以所述最優(yōu)化代碼的所述運(yùn)行時(shí)間行為與所述原代碼的所述運(yùn)行時(shí)間行為相同的方式進(jìn)行的,以及所述移去冗余包括在運(yùn)行時(shí)間移去可能拋出異?;虿荒芙K止的指令。
21.如權(quán)利要求20所述的制品,其特征在于所述執(zhí)行保留冗余移去的運(yùn)行時(shí)間行為包含設(shè)置具有表明所述原代碼定義的所述可用性的值的標(biāo)志;以及將保護(hù)插入到所述定義實(shí)例的周圍,其中所述保護(hù)能夠根據(jù)所述標(biāo)志的所述值來指引處理。
22.如權(quán)利要求21所述的制品,所述指令當(dāng)由機(jī)器執(zhí)行時(shí),進(jìn)一步產(chǎn)生對(duì)根據(jù)所述原代碼確立的控制流程圖中的與節(jié)點(diǎn)相關(guān)聯(lián)的指令中的每個(gè)定義進(jìn)行編號(hào),以產(chǎn)生編號(hào)定義;執(zhí)行有關(guān)所述控制流程圖的流分析,以關(guān)于所述控制流程圖中的與節(jié)點(diǎn)相關(guān)聯(lián)的指令中的每個(gè)編號(hào)的定義而產(chǎn)生第一對(duì)值和第二對(duì)值;根據(jù)所述第一對(duì)值和所述第二對(duì)值來移去所述原代碼中的冗余,其中所述第一對(duì)值對(duì)應(yīng)于AVAILin和AVAILout,其表明分別在執(zhí)行所述指令之前和之后所述已編號(hào)定義的所述值的所述可用性,以及所述第二對(duì)值對(duì)應(yīng)于ANTICin和ANTICout,其表明所述已編號(hào)定義的所述值是否可分別在執(zhí)行所述指令之前和之后被預(yù)期到,以及AVAILin、AVAILout、ANTICin和ANTICout的所述值包括頂端、必須、無,以及可能。
23.如權(quán)利要求22所述的制品,其特征在于所述移去冗余包含使用所述第一和第二對(duì)值來移去部分冗余,所述移去部分冗余包括對(duì)于每個(gè)已編號(hào)定義而言,標(biāo)識(shí)具有多個(gè)流入分支的合并點(diǎn),其中所述合并點(diǎn)處所述已編號(hào)定義的所述AVAILin的所述值表明所述合并點(diǎn)處所述已編號(hào)定義的所述值的所述可用性是不確定的;若關(guān)于所述已編號(hào)定義的AVAILout的所述值表明所述已編號(hào)定義不可用,則設(shè)置所述標(biāo)志的第一數(shù)值;若關(guān)于所述已編號(hào)定義的AVAILout的所述值表明所述已編號(hào)定義可用,則設(shè)置所述標(biāo)志的第二數(shù)值;以及放置有關(guān)所述已編號(hào)定義的所述合并點(diǎn)處的所述保護(hù),其中所述保護(hù)根據(jù)所述標(biāo)志的所述值來指引處理。
24.如權(quán)利要求22所述的制品,所述指令,當(dāng)由機(jī)器執(zhí)行時(shí),進(jìn)一步根據(jù)所述第一對(duì)值而產(chǎn)生移去所述原代碼中的完全冗余。
25.一種包含具有保存于其上有關(guān)運(yùn)行時(shí)間行為冗余移去的指令的存儲(chǔ)介質(zhì)的制品,當(dāng)由機(jī)器執(zhí)行時(shí),產(chǎn)生下面情況對(duì)根據(jù)原代碼而構(gòu)造的控制流程圖的每個(gè)節(jié)點(diǎn)處指令中的每個(gè)定義進(jìn)行編號(hào),以產(chǎn)生已編號(hào)的定義;以及移去所述原代碼中的冗余,使得所述原代碼的所述運(yùn)行時(shí)間行為被保留,其中所述冗余移去包括移去所述原代碼中的指令,這在運(yùn)行時(shí)間可能會(huì)拋出異?;驘o法終止。
26.如權(quán)利要求25所述的制品,其特征在于所述移去冗余包含設(shè)置具有表明所述原代碼定義的所述可用性值的標(biāo)志;以及將保護(hù)插入到所述定義的周圍,其中所述保護(hù)能夠根據(jù)所述標(biāo)志的所述值來指引處理。
27.如權(quán)利要求26所述的制品,當(dāng)由機(jī)器執(zhí)行時(shí),進(jìn)一步產(chǎn)生執(zhí)行流分析,以產(chǎn)生關(guān)于與所述控制流程圖中的節(jié)點(diǎn)相關(guān)聯(lián)的指令中的每個(gè)已編號(hào)定義的第一對(duì)值和第二對(duì)值,其中所述第一對(duì)值,其生成于前進(jìn)流分析中,相應(yīng)于AVAILin和AVAILout,這表明分別在執(zhí)行所述指令之前和之后所述已編號(hào)定義的所述值的所述可用性,所述第二對(duì)值,其生成于后退流分析中,相應(yīng)于ANTICin和ANTICout,這表明所述已編號(hào)定義的所述值是否可分別在執(zhí)行所述指令之前和之后被預(yù)期到,以及AVAILin、AVAILout、ANTICin和ANTICout的所述值包括頂端、必須、無,以及可能。
28.如權(quán)利要求27所述的制品,其特征在于所述移去冗余包含根據(jù)所述第一對(duì)和所述第二對(duì)值來移去部分冗余,所述移去部分冗余包括對(duì)于每個(gè)已編號(hào)定義,標(biāo)識(shí)具有多個(gè)流入合并分支的合并點(diǎn),其中所述合并點(diǎn)處所述已編號(hào)定義的所述AVAILin的所述值表明所述合并點(diǎn)處所述已編號(hào)定義的所述值的所述可用性是不確定的;若關(guān)于所述已編號(hào)定義的AVAILout的所述值表明所述已編號(hào)定義不可用,則設(shè)置所述標(biāo)志的第一數(shù)值;若關(guān)于所述已編號(hào)定義的AVAILout的所述值表明所述已編號(hào)定義可用,則設(shè)置所述標(biāo)志的第二數(shù)值;以及放置有關(guān)所述已編號(hào)定義的所述合并點(diǎn)處的所述保護(hù),其中所述保護(hù)根據(jù)所述標(biāo)志的所述值來指引處理。
29.如權(quán)利要求26所述的制品,所述指令當(dāng)由機(jī)器執(zhí)行時(shí),進(jìn)一步產(chǎn)生移去完全冗余,其中所述移去完全冗余包含標(biāo)識(shí)與指令相關(guān)聯(lián)的已編號(hào)定義是完全冗余的節(jié)點(diǎn);用臨時(shí)變量來替換所述已編號(hào)的定義;插入一指令,其中所述插入的指令將所述臨時(shí)變量的所述值復(fù)制到所述已編號(hào)定義的所述目的地;以及用所述臨時(shí)變量的所述值來替換所述已編號(hào)定義的每個(gè)使用。
全文摘要
提供用于移去部分冗余的布置。處理原代碼,以執(zhí)行保留冗余移去的運(yùn)行時(shí)間特性。部分冗余以原代碼的運(yùn)行時(shí)間行為被保留的方式而被移去。
文檔編號(hào)G06F9/44GK1906577SQ200380107712
公開日2007年1月31日 申請(qǐng)日期2003年12月11日 優(yōu)先權(quán)日2002年12月31日
發(fā)明者A·洛賓森 申請(qǐng)人:英特爾公司