專利名稱::在數(shù)據(jù)處理系統(tǒng)中對計(jì)算機(jī)指令執(zhí)行排序的方法和裝置的制作方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及用于微處理器的編譯程序和簡化程序技術(shù),特別是涉及對最佳數(shù)據(jù)處理器執(zhí)行的指令排序。圖1說明用于計(jì)算機(jī)程序的控制流程圖。在圖1的控制流程圖中,有十個計(jì)算機(jī)指令或十個代碼段(也稱為計(jì)算機(jī)代碼的基本程序塊)在有向圖中表示為節(jié)點(diǎn)″a″-″j″。圖1的十個節(jié)點(diǎn)標(biāo)為″a″至″j″并對應(yīng)于計(jì)算機(jī)代碼的十個不同基本程序塊。在圖1的控制流程圖中,在計(jì)算機(jī)程序的執(zhí)行路徑中首先按時執(zhí)行基本程序塊a中的計(jì)算機(jī)指令。由于基本程序塊″a″是從基本程序塊″j″回到基本程序塊″a″的反饋路徑或循環(huán)徑路的端點(diǎn),基本程序塊a可以包含,例如一個while型循環(huán)指令、一個for型循環(huán)指令、一個重復(fù)指令、一個do循環(huán)指令、或類似的循環(huán)結(jié)構(gòu),或基本程序塊″j″可包含具有作為起始端的基本程序塊″a″的目的地址的轉(zhuǎn)移指令。執(zhí)行完基本程序塊″a″后,按序執(zhí)行使得每當(dāng)執(zhí)行基本程序塊″a″后執(zhí)行基本程序塊″b″,如圖1的控制流程圖所示。依據(jù)軟件條件,執(zhí)行基本程序塊″b″之后,執(zhí)行流程將分裂到兩個方向之一。因此,基本程序塊″b″包含一個“如果-則-否則”指令或一個包括向下轉(zhuǎn)移到兩個相異和不同執(zhí)行流程路徑的類似流程結(jié)構(gòu)。如果在基本程序塊″b″中檢測到一個條件或限定集合,則執(zhí)行基本程序塊c。如果確定基本程序塊″b″中存在另一個條件或限定集合,則執(zhí)行基本程序塊d。在任何一種情況下,如圖1所示,每當(dāng)執(zhí)行完″b″之后執(zhí)行″c″或″d″之一?;境绦驂K″c″和″d″以與如果-則-否則流程控制相似的方式匯合回到基本程序塊″e″。換句話說,執(zhí)行完″c″或″d″之一后,將執(zhí)行基本程序塊″e″中包含的代碼。執(zhí)行流程從圖1的有向圖中的基本程序塊″e″或節(jié)點(diǎn)″e″繼續(xù),以便執(zhí)行基本程序塊″f″。圖1的基本程序塊″f″、″g″、″h″和″i″與上面討論的基本程序塊″b″、″c″、″d″和″e″的結(jié)構(gòu)非常相似,并因此以相似或相同的執(zhí)行流程方式執(zhí)行這兩組基本程序塊。一旦作為如上所討論的循環(huán)結(jié)束點(diǎn)的基本程序塊″j″通過圖1的節(jié)點(diǎn)確定不再需要進(jìn)行循環(huán),計(jì)算機(jī)程序的執(zhí)行流程則從節(jié)點(diǎn)″j″經(jīng)出口路徑退出圖1的結(jié)構(gòu)??煞治鰣D1計(jì)算機(jī)程序的執(zhí)行流程以確定計(jì)算機(jī)基本程序塊在存儲器中的有效重排,以便以有效方式執(zhí)行軟件。為此,圖2說明執(zhí)行一執(zhí)行跟蹤程序以收集來自圖1中圖示說明的計(jì)算機(jī)程序執(zhí)行的數(shù)據(jù)。該跟蹤處理在存儲器中生成一個跟蹤數(shù)據(jù)文件。圖2所示的跟蹤數(shù)據(jù)文件記錄圖示說明的計(jì)算機(jī)程序按時間順序的執(zhí)行流程作為如圖1中代碼的基本程序塊。跟蹤數(shù)據(jù)按時間順序方式存儲程序塊執(zhí)行次序。在圖2中使用空格(“”)以便將循環(huán)a-j的不同執(zhí)行通路相互分開。因此,為生成圖2中的跟蹤文件,首先生成一個空跟蹤數(shù)據(jù)文件并開始執(zhí)行基本程序塊a-j。在自基本程序塊a至j的第一循環(huán)中按時間順序的次序執(zhí)行的基本程序塊為abcefgij。因此,在第一循環(huán)中,圖2左手側(cè)記錄的是采用圖1中的b-c通路和采用圖1中的f-g通路,從而形成按時間順序的次序執(zhí)行程序塊abcefgij。基本程序塊″j″將執(zhí)行流程指回到基本程序塊″a″,圖2中的第二循環(huán)順序?yàn)閍bcefgij。因此,經(jīng)從基本程序塊″j″到基本程序塊″a″的循環(huán)按時間順序連續(xù)將從左到右為abcefgij的同一指令順序執(zhí)行兩次。該按時間順序的執(zhí)行流程被連續(xù)記錄一個周期的時間并存儲在跟蹤數(shù)據(jù)文件中,以便以后的時間進(jìn)一步分析。然后計(jì)算機(jī)通過分析圖2的跟蹤數(shù)據(jù)能夠圖解地模擬如圖3所示的計(jì)算機(jī)軟件。指出在首先執(zhí)行包含程序塊a-j的計(jì)算機(jī)程序以生成圖2中的跟蹤數(shù)據(jù)文件時,計(jì)算機(jī)不知道如圖1所示軟件的執(zhí)行流程是很重要的。分析圖2的跟蹤文件以獲得與圖1包含相同信息的圖3的執(zhí)行流程結(jié)構(gòu)。通過從左到右掃描圖2中的跟蹤數(shù)據(jù)并分析在時間上相互相鄰的基本程序塊對構(gòu)成圖3的有向圖。最初,在算法開始時(在開始狀態(tài)圖3為空白)不出現(xiàn)數(shù)據(jù)結(jié)構(gòu)。然后該算法采取圖2中第一對基本程序塊,即ab對。在圖3中,生成節(jié)點(diǎn)″a″、生成節(jié)點(diǎn)″b″,并通過1的加權(quán)或計(jì)數(shù)生成從節(jié)點(diǎn)″a″到節(jié)點(diǎn)″b″的邊緣″ab″。接著,存取圖2的數(shù)據(jù),接下來分析″bc″對。由于圖3中已預(yù)先生成節(jié)點(diǎn)″b″,該計(jì)算機(jī)通過1的加權(quán)簡單地生成一個節(jié)點(diǎn)″c″和從″b″到″c″的邊緣″bc″。隨著進(jìn)一步遇到節(jié)點(diǎn)對,針對圖2所示整個數(shù)據(jù)段繼續(xù)節(jié)點(diǎn)和邊緣的互連和/或生成以及節(jié)點(diǎn)之間的邊緣加權(quán)的增加,以產(chǎn)生圖3所示的完整數(shù)據(jù)結(jié)構(gòu)。正如從對圖3所示連接節(jié)點(diǎn)″a″和″b″的邊緣″ab″以及連接節(jié)點(diǎn)″b″和″c″的邊緣加權(quán)所了解的,如圖3所示,圖2中基本程序塊b有九次跟在基本程序塊a之后,而圖2中基本程序塊c僅有五次跟在基本程序塊b之后。一旦從圖2的跟蹤文件生成圖3的數(shù)據(jù)結(jié)構(gòu),可執(zhí)行圖4的流程圖中說明的方法,以分析圖3的數(shù)據(jù)結(jié)構(gòu),確定在存儲器中排序基本程序塊的有效方式,以便改善高速緩存性能,并使流水線充溢(pipelineflushing)最小,從而改善處理器性能。圖5中說明基本程序塊的有效輸出次序(從圖4的方法獲得的輸出文件)。為討論圖4現(xiàn)有技術(shù)的重構(gòu)方法,參考圖5,即圖4方法的輸出很重要。首先,通過準(zhǔn)備順序鏈信息或重排指令的基本程序塊的初始化步驟開始圖4的方法。在步驟102,選擇圖3中至此仍未被選擇的具有最高出口路徑/邊緣值的節(jié)點(diǎn)。圖3中,節(jié)點(diǎn)″a″、″e″和″i″與最高路徑值的數(shù)值相配,圖3中該路徑/邊緣值是9。圖3中的最大邊緣值是9。在該聯(lián)系情況下,任意選擇執(zhí)行流程中的第一節(jié)點(diǎn),這種情況下是節(jié)點(diǎn)a。然后將基本程序塊a放置在如圖5步驟1中說明的重構(gòu)計(jì)算機(jī)文件中。通過將鏈的起始端設(shè)定到步驟102中確定的節(jié)點(diǎn)(在此情況下是節(jié)點(diǎn)″a″)而生成一個執(zhí)行鏈(基本程序塊的順序表)。因此,步驟106將鏈的起始端設(shè)定到圖3中的節(jié)點(diǎn)a。步驟108用來確定在圖3中從節(jié)點(diǎn)″a″可到達(dá)節(jié)點(diǎn)a-j中的哪一個。從節(jié)點(diǎn)″a″僅可到達(dá)一個節(jié)點(diǎn),該節(jié)點(diǎn)是圖3中的節(jié)點(diǎn)b。因此,步驟108(第一循環(huán)中)產(chǎn)生一個唯一節(jié)點(diǎn),即節(jié)點(diǎn)″b″。然后在步驟110分析節(jié)點(diǎn)″b″,由于最后執(zhí)行的步驟108確定的節(jié)點(diǎn)集合僅包含節(jié)點(diǎn)″b″,在步驟110中選擇節(jié)點(diǎn)″b″作為具有最高路徑值的節(jié)點(diǎn),然后將節(jié)點(diǎn)″b″插入如圖5步驟2中說明的圖5的重構(gòu)計(jì)算機(jī)文件中。重構(gòu)的計(jì)算機(jī)文件現(xiàn)在包含指令鏈或序列″ab″。然后步驟108確定從如圖3所說明的節(jié)點(diǎn)″b″可到達(dá)節(jié)點(diǎn)″c″和″d″。步驟110分析″c″和″d″并確定節(jié)點(diǎn)″c″的路徑值為5,節(jié)點(diǎn)″d″的路徑值為4。因此,圖4中的步驟108和110在程序塊″b″之后將基本程序塊″c″插入到圖5的重構(gòu)數(shù)據(jù)文件,圖5的步驟3說明忽略節(jié)點(diǎn)″d″,并由于節(jié)點(diǎn)″d″不具有最高加權(quán)值,此刻不將其插入到圖5的鏈中。從節(jié)點(diǎn)″c″繼續(xù),使用圖4的算法在圖5的步驟4插入基本程序塊″e″(由圖3中的節(jié)點(diǎn)″e″表示)。然后使用圖4敘述的處理將步驟″f″插入圖5的步驟5中。在圖3的節(jié)點(diǎn)″h″和″g″之間,步驟108-110將確定從節(jié)點(diǎn)″f″起節(jié)點(diǎn)″h″具有比節(jié)點(diǎn)″g″更大的路徑值,并在基本程序塊″f″之后將基本程序塊″h″插入到圖5的步驟6中。通過圖5的步驟7插入由節(jié)點(diǎn)″i″表示的代碼,并通過圖5的步驟8插入″j″。一旦節(jié)點(diǎn)″j″插入到步驟8中,由于已分析了節(jié)點(diǎn)″a″并在圖5的步驟1中插入到圖5中,圖3中不再有可從步驟″j″到達(dá)的未選擇節(jié)點(diǎn)。因此,步驟108將圖4的控制返回到步驟102,步驟102找出具有最高加權(quán)值的新未選擇節(jié)點(diǎn)??傊?,到圖5左半部分的步驟8,程序塊鏈abcefhij通過圖5左半部分所示的區(qū)域70如圖解所示現(xiàn)在完全順序地插入重構(gòu)計(jì)算機(jī)文件中。返回到步驟102-106,圖3中僅剩的未選擇節(jié)點(diǎn)是具有相等邊緣加權(quán)值的″d″和″g″,經(jīng)缺省通過圖4的處理選擇較前的節(jié)點(diǎn)″d″。通過圖5的步驟9插入節(jié)點(diǎn)″d″。由于在圖3中從節(jié)點(diǎn)″d″可到達(dá)節(jié)點(diǎn)″e″,但已經(jīng)預(yù)先選擇節(jié)點(diǎn)″e″(見圖5的步驟4)并放置在圖5文件中的,步驟108確定從節(jié)點(diǎn)″d″后不再進(jìn)行處理并再次執(zhí)行步驟102。僅剩的節(jié)點(diǎn)是節(jié)點(diǎn)″g″,圖5的步驟10確定應(yīng)將節(jié)點(diǎn)″g″插入圖5的步驟10中。因此,當(dāng)一個編譯程序正在排序圖3中說明的程序流程的基本程序塊時,是以試圖改善處理器性能為目的,如圖5的步驟10中所示在存儲器中進(jìn)行指令或基本程序塊的最終排序。然而,圖1-5中說明的現(xiàn)有技術(shù)的方法存在缺陷。通過觀察圖2可很容易地確定,如果采用路徑bc,很有可能也采用與路徑bc有關(guān)的路徑fg。也可確定,如果采用路徑bd,也很可能采用通路fh。換句話說,路徑bc與路徑fg之間的關(guān)聯(lián)程度較高,而路徑bd與路徑fh之間的關(guān)聯(lián)程度較高。因此,圖5的步驟10中基本程序塊的最有效組織是在某些序號次序中將路徑bc與fg耦合或在某些序號次序中將徑路bd與fh耦合。然而,通過圖4和5現(xiàn)有技術(shù)說明的算法導(dǎo)致路徑bc與路徑fh耦合并串行配置(見圖5右半部分中的圖解說明)。由于圖4的現(xiàn)有技術(shù)算法不會預(yù)見到圖3的數(shù)據(jù)結(jié)構(gòu)中更遠(yuǎn)距離的節(jié)點(diǎn)和路徑,而只能考慮圖3中直接相鄰的基本程序塊或節(jié)點(diǎn)對,選擇錯誤的配對會對CPU的執(zhí)行性能造成損害。其結(jié)果是圖4和5的現(xiàn)有技術(shù)以獲得有限性能利益的有限方式進(jìn)行基本程序塊重構(gòu)。因此,設(shè)計(jì)一種識別更遠(yuǎn)距離路徑之間的這些相關(guān)性和執(zhí)行改進(jìn)的指令順序的基本程序塊重構(gòu)處理有利于達(dá)到更少的高速緩存差錯、更少的外部存儲存取、更少的頁差錯、更少的流水線充溢和/或阻塞,并提高程序執(zhí)行速度。圖1以控制流程圖的形式說明現(xiàn)有技術(shù)中已知的軟件程序段的執(zhí)行流程控制。圖2以文本表示說明從圖1的圖解說明的軟件代碼執(zhí)行得到的跟蹤數(shù)據(jù)文件。圖3說明現(xiàn)有技術(shù)通過分析圖1和2的信息生成的加權(quán)流程控制圖。圖4說明使用圖3的示意圖以已知現(xiàn)有技術(shù)方式重構(gòu)代碼的方法。圖5說明通過圖4方法所示的現(xiàn)有技術(shù)中重構(gòu)數(shù)據(jù)文件的形式。圖6說明根據(jù)本發(fā)明的計(jì)算機(jī)處理器系統(tǒng)。圖7說明在允許由中央處理單元執(zhí)行高級計(jì)算機(jī)指令排序的圖6的計(jì)算機(jī)系統(tǒng)中執(zhí)行的軟件程序的代碼分布。圖8說明根據(jù)本發(fā)明經(jīng)過一個跟蹤數(shù)據(jù)文件構(gòu)成一抽點(diǎn)(snapshot)示意圖的方法。圖9在一文本表中說明根據(jù)本發(fā)明以圖8的方法操作跟蹤數(shù)據(jù)文件的方式。圖10說明根據(jù)本發(fā)明使用圖8至9所述處理形成的抽點(diǎn)示意圖。圖11說明經(jīng)過一抽點(diǎn)示意圖以便有效地排序中央處理單元執(zhí)行的計(jì)算機(jī)指令的方法。圖12說明根據(jù)本發(fā)明設(shè)定由中央處理單元執(zhí)行的已重構(gòu)的改進(jìn)和有效執(zhí)行程序的順序指令。圖13說明根據(jù)本發(fā)明編譯程序代碼,然后使用該編譯程序生成的計(jì)數(shù)重構(gòu)計(jì)算機(jī)指令的實(shí)施例。圖14是說明強(qiáng)連接流程的控制流程圖的示意圖。圖15是說明非強(qiáng)連接流程的控制流程圖的示意圖。圖16是說明單進(jìn)單出(SESE)區(qū)的控制流程圖的示意圖。圖17是說明單進(jìn)零出(SEZE)區(qū)的控制流程圖的示意圖。圖18是說明應(yīng)用節(jié)點(diǎn)分裂的控制流程圖的示意圖。圖19是說明節(jié)點(diǎn)分裂功能和結(jié)果的控制流程圖示意圖。圖20至26是說明流程圖變換功能的控制流程圖段。圖27是經(jīng)變換的控制流程圖。圖28說明所應(yīng)用方法的步驟順序以及按該方法進(jìn)程構(gòu)成的結(jié)構(gòu)。圖29表示用于節(jié)點(diǎn)分裂的有向深度優(yōu)先搜索(DFS)。圖30表示一旦已執(zhí)行圖11的DFS如何進(jìn)行節(jié)點(diǎn)分裂。圖31表示如何用無向DFS從無向圖構(gòu)成DFST。圖32表示如何向每個邊緣賦予等級,圖15說明如何由有向DFS構(gòu)成簡化流程圖(RFG)。圖33說明如何由有向深度優(yōu)先搜索(DFS)構(gòu)成簡化流程圖(RFG)。圖34說明根據(jù)本發(fā)明帶有SESE區(qū)域的控制流程圖。圖35說明圖34的控制流程圖根據(jù)本發(fā)明的簡化流程圖(RFG)。圖36是根據(jù)本發(fā)明向程序代碼中插入編譯程序的方法的流程圖。圖37說明使用圖36的流程圖構(gòu)成的經(jīng)編譯的程序。圖38說明根據(jù)從由圖36所示方法編譯的程序得出的計(jì)數(shù)構(gòu)成更好代碼分布流程圖。圖39說明根據(jù)本發(fā)明的尋找最佳路徑過程的流程圖。圖40說明根據(jù)本發(fā)明的DFS尋找出路徑過程的流程圖。圖41說明根據(jù)本發(fā)明的DFS尋找其它路徑過程的流程圖。圖42說明根據(jù)本發(fā)明使用復(fù)制方法改進(jìn)控制流程圖的流程圖。圖43說明根據(jù)本發(fā)明復(fù)制的基本程序塊。通常,本發(fā)明提供計(jì)算機(jī)程序中三個或更多指令組或指令基本程序塊之間的相關(guān)和從屬性更詳細(xì)的分析。這種更詳細(xì)的分析優(yōu)于現(xiàn)有技術(shù)僅分析相鄰指令對之間的相關(guān)性和從屬性的方法(見圖1-5)。分析三個或更多組緊靠另一個指令執(zhí)行的指令將允許中央處理單元(CPU)以更有效的代碼次序執(zhí)行。因此,設(shè)計(jì)一種以檢測節(jié)點(diǎn)b-c和f-g對(見圖1)執(zhí)行程序之間復(fù)雜從屬性,和節(jié)點(diǎn)b-d和f-h對(見圖1)之間從屬性的方式分析三個或更多基本程序塊從屬性的基本程序塊重構(gòu)處理更有助于生成比圖5所得到的更好的重構(gòu)次序。在此所講的高級重構(gòu)將導(dǎo)致更少的高速緩存差錯、更少的外部存儲存取、更少的頁差錯、更少的CPU流水線充溢情況,并提高程序執(zhí)行速度。參考圖6-40可進(jìn)一步理解本發(fā)明。圖6示出通用計(jì)算機(jī)20的方框圖。通用計(jì)算機(jī)20具有一個計(jì)算機(jī)處理器22、和一個由總線26連接的存儲器24(包括在此所講的所有計(jì)算機(jī)軟件和數(shù)據(jù))。通常,總線26包括一個地址總線部分、一個數(shù)據(jù)總線部分、和一個控制信號總線部分。諸如硬盤驅(qū)動器30、外部存儲裝置32之類的二級存儲設(shè)備、監(jiān)視器34、鍵盤(帶鼠標(biāo))36、和打印機(jī)38(任選)也連接到總線。外部存儲設(shè)備32可以是軟盤、磁帶、CD-ROM、網(wǎng)絡(luò)連接器、或甚至是另一臺計(jì)算機(jī)。應(yīng)指出,可從外部存儲設(shè)備32讀取諸如編譯程序、連接程序、和用戶程序之類的可執(zhí)行版本的計(jì)算機(jī)軟件33并將執(zhí)行程序直接裝載到存儲器34,或在裝載到存儲器34之前存儲在二級存儲設(shè)備30上并執(zhí)行。圖6的計(jì)算機(jī)可用于執(zhí)行在此所講的任何軟件。圖7說明在計(jì)算機(jī)程序中排序或排列計(jì)算機(jī)指令的基本程序塊(其中每個基本程序塊可包括一個或多個計(jì)算機(jī)指令)以使執(zhí)行流程最佳,從而改善高速緩存性能,改善流水線性能,和提高所有數(shù)據(jù)處理系統(tǒng)的執(zhí)行速度。圖7的方法通過提供源代碼124開始。源代碼124可以是任何高級語言或需要編譯和/或連接生成可執(zhí)行文件的計(jì)算機(jī)語言。因此,在一種形式中,源代碼124可以是C代碼、C++代碼、Pascal、FORTRAN、Lisp、或需要匯編和/或編譯的任何語言。然后通過如圖7所示步驟120編譯和連接源代碼124。在編譯和連接源代碼124的處理期間的任何時侯,用步驟120將編譯代碼插入所編譯或連接的代碼,以便允許在跟蹤數(shù)據(jù)文件中正確收集跟蹤數(shù)據(jù)。換句話說,當(dāng)執(zhí)行經(jīng)編譯的程序時將可執(zhí)行指令插入源代碼以允許動態(tài)地形成跟蹤數(shù)據(jù)文件。另外,步驟120和122將生成如圖1說明的控制流程圖(CFG)。步驟120和122之后,在圖7的處理中生成一個包含可執(zhí)行代碼的目標(biāo)模塊126。然后用圖7的步驟130執(zhí)行目標(biāo)模塊126,在該步驟中,目標(biāo)模塊126中的編譯代碼被用來以與圖2說明的相似方式形成跟蹤數(shù)據(jù)文件。通過其它步驟130至139,圖7的方法明顯不同于圖1至5中的方法。在步驟130中,用子步驟132構(gòu)成抽點(diǎn)圖,其中在圖8中進(jìn)一步說明構(gòu)成抽點(diǎn)圖的處理。通常,通過分析跟蹤數(shù)據(jù)文件生成抽點(diǎn)圖,圖2中說明了跟蹤數(shù)據(jù)文件的樣本。在步驟132中使用一個包含多于兩個元素的較大窗口尺寸構(gòu)成抽點(diǎn)圖,而不是采用僅分析如圖1至5說明的跟蹤數(shù)據(jù)文件中相鄰元素的現(xiàn)有技術(shù)。包含數(shù)個分析元素的較大窗口將允許不僅根據(jù)相鄰指令之間執(zhí)行流程的相關(guān)性而且根據(jù)實(shí)際的執(zhí)行流程和更遠(yuǎn)距離的指令之間的相關(guān)性有效地排序計(jì)算機(jī)指令。簡言之,通過采用同時可分析跟蹤數(shù)據(jù)文件中大于兩個元素的較大窗口尺寸校正通過此處作為本發(fā)明背景的現(xiàn)有技術(shù)中提到的缺點(diǎn),以生成更完整的數(shù)據(jù)庫并理解各種指令之間的內(nèi)在關(guān)系,即使執(zhí)行時它們相互之間可能不直接相鄰。圖7中,抽點(diǎn)圖134是步驟130和132的輸出結(jié)果。再一次指出,圖8將更詳細(xì)地說明生成該抽點(diǎn)圖的方法,而圖10中具體說明該抽點(diǎn)圖。通過步驟136存取和分析在步驟122生成并在圖1中說明的控制流程圖、抽點(diǎn)圖134、和源代碼124。通過存取由圖7中步驟122形成的控制流程圖和圖7中的抽點(diǎn)圖134,軟件子程序可確定應(yīng)將哪個指令按順序放置在存儲器中,以便在數(shù)據(jù)處理器中允許高效排序的執(zhí)行流程,以使流水線執(zhí)行單元和數(shù)據(jù)處理器中的高速緩存單元的效果最佳。因此,圖7中的步驟138將重排目標(biāo)模塊126中的指令或計(jì)算機(jī)指令的基本程序塊,步驟136將重新編譯和重新連接該重新構(gòu)成的源代碼,以提供一個將在數(shù)據(jù)處理系統(tǒng)中以更有效方式執(zhí)行的重排序可執(zhí)行目標(biāo)模塊139。通過圖11中的流程圖進(jìn)一步說明在目標(biāo)模塊126中用來以有效方式選擇和排序基本程序塊的方法。圖8說明構(gòu)成如圖7的步驟132中首先介紹的抽點(diǎn)圖。通過同時參考圖9可進(jìn)一步理解圖8,圖9采用具有尺寸大于兩個的窗口說明圖8如何對來自圖9說明的跟蹤數(shù)據(jù)文件的信息進(jìn)行分析和語法分析。此外,執(zhí)行圖8的流程時將動態(tài)地生成圖10的最終抽點(diǎn)圖。因此,描述圖8時有時可能需要參考圖10,以便對圖7的步驟132得到全面地理解。借助于圖8中的啟動步驟230開始構(gòu)成抽點(diǎn)圖的方法。首先,在步驟232中,將變量″第一″設(shè)定為值1。因此,步驟232將變量“第一”初始化成跟蹤文件的第一元素,即圖9步驟1中所示的最左邊的元素a。然后,在圖8的步驟234將變量″最后″設(shè)定成變量“第一”加窗口尺寸值減1。圖9中,所示窗口尺寸的值為4,并可將其設(shè)定為任何值。應(yīng)指出,由有經(jīng)驗(yàn)的軟件工程師確定窗口尺寸是很重要的,窗口值太小可能會丟失各種相關(guān)性,窗口值太大可能會導(dǎo)致大而麻煩并且無意義的抽點(diǎn)圖。因此,在圖9所示實(shí)例中,針對從屬性分析許多指令的相關(guān)性,而不是如圖1至5的現(xiàn)有技術(shù)中所講的僅查找相鄰指令,以便正確地組織或排序數(shù)據(jù)處理器所執(zhí)行的指令。一般來說,將現(xiàn)有技術(shù)與圖9說明的方法相比較類似于將僅看下一步棋的下棋人與向前看許多步棋的下棋人相比較。向前看許多步棋的下棋人要比僅向前看一步棋的下棋人下得好。該類比有助于更好地準(zhǔn)確理解圖8公開的本發(fā)明如何工作。因此,步驟234借助如圖9所示的窗口尺寸4將變量“最后”的值設(shè)定為4,以便借助圖8的步驟232和234定義圖9的步驟1中包含元素abce的窗口。用步驟236確定是否已到跟蹤數(shù)據(jù)文件的結(jié)尾。如果已處理了數(shù)據(jù)文件中的所有跟蹤數(shù)據(jù),步驟236將進(jìn)展到執(zhí)行步驟238,在此完成圖8的算法。如果跟蹤數(shù)據(jù)文件中殘存有數(shù)據(jù)或跟蹤數(shù)據(jù)文件中留有待分析的元素,則通過步驟240至258分析借助步驟232和234選擇的窗口中的元素。一般來說,圖8中的步驟240至258用來確定圖9步驟1中定義的窗口內(nèi)的所有對或兩個元素的組合在跟蹤數(shù)據(jù)文件中是否相互相鄰。圖9步驟1的右手部分說明針對圖9步驟1中的窗口找到這些對。來自圖9步驟1的窗口的這些對是ab、ac、ae、bc、be和ce。通常,對于每個窗口尺寸大?。絯s來說,對的數(shù)量=ws(ws-1)/2。因此,一般來說,圖8的步驟240至258用來識別如圖9右手側(cè)說明的窗口尺寸中元素的所有組合。在圖8的詳細(xì)的討論中,步驟240向作為圖9步驟1中的元素a的窗口的第一元素設(shè)定一個尾指針。步驟242向緊接尾指針的元素設(shè)定一個頭指針。因此,步驟242中的頭指針將指向圖9步驟1的窗口中的元素b。在步驟244中,如果頭指針大于由圖9步驟1中的元素e指示的窗口的結(jié)尾,則執(zhí)行步驟246和248。然而,由于來自步驟242的頭指針現(xiàn)在被設(shè)定到圖9步驟1的窗口中的元素b,后跟從步驟244退出的″否″路徑。在步驟252,存取尾和頭指向的元素。換句話說,由于這些元素是由尾和頭的值指示的元素,存取元素a和b。步驟252查找抽點(diǎn)圖并確定是否已預(yù)先生成a和b的節(jié)點(diǎn),以及a和b之間是否存在邊緣或路徑。由于這是從跟蹤數(shù)據(jù)文件存取的第一對元素,不存在節(jié)點(diǎn)或邊緣,并且仍未開始構(gòu)成抽點(diǎn)圖部分。因此,將由步驟254生成圖10的節(jié)點(diǎn)50(表示基本程序塊a的節(jié)點(diǎn))和圖10的節(jié)點(diǎn)52(表示基本程序塊b的節(jié)點(diǎn)),并借助此時值為1的邊緣將這兩個節(jié)點(diǎn)連在一起。圖10中,節(jié)點(diǎn)50和52之間的邊緣表示為具有結(jié)束值17。因此,當(dāng)借助執(zhí)行步驟238完成圖8的整個算法時,圖10中節(jié)點(diǎn)50和52之間的邊緣將由步驟256增加多16倍,在圖10的節(jié)點(diǎn)50和52之間形成最終加權(quán)值17。指出可用圖8的方法生成或從圖1中說明的控制流程圖提供節(jié)點(diǎn)50和52以及其它節(jié)點(diǎn)54至68是很重要的。因此,在另一實(shí)施例中,節(jié)點(diǎn)50至68可以是已生成的,圖8僅需要生成邊緣或使邊緣遞增以生成圖10的抽點(diǎn)圖。在圖8步驟254中生成元素50和52之間加權(quán)值為1的邊緣之后,當(dāng)前指向圖9步驟1的窗口中的元素b的頭指針經(jīng)步驟258遞增到圖9步驟1的窗口的元素c。此刻,圖9步驟1的右手部分指示已處理邊緣ab。然后執(zhí)行步驟244,其中頭指針指向圖9步驟1的窗口中的元素c,而尾指針仍指向圖9步驟1中的元素a。因此,執(zhí)行圖8中的步驟252和254,以提供圖10的節(jié)點(diǎn)50和節(jié)點(diǎn)54(表示基本程序塊c的節(jié)點(diǎn))之間的邊緣。在圖8的步驟254中,該節(jié)點(diǎn)被初始化設(shè)定為值1。然而,如圖10所示,當(dāng)圖8的步驟238中已分析完整個跟蹤數(shù)據(jù)文件時節(jié)點(diǎn)50和54之間的該邊緣值將為終值5。現(xiàn)在很重要的是在圖10的實(shí)邊緣線和圖10的虛邊緣線之間進(jìn)行辨別。實(shí)邊緣線表示節(jié)點(diǎn)之間的實(shí)際控制流程,而虛邊緣線表示與隨圖8所述抽點(diǎn)圖構(gòu)成方法而定的加權(quán)有關(guān)的附加非控制流程邊緣。例如,在圖10中,控制流程可直接從節(jié)點(diǎn)a到節(jié)點(diǎn)b(實(shí)線邊緣),而不能從節(jié)點(diǎn)a直接到節(jié)點(diǎn)c(虛邊緣線)。圖10的抽點(diǎn)圖和圖3現(xiàn)有技術(shù)的加權(quán)控制流程圖之間的主要區(qū)別在于抽點(diǎn)圖包含加權(quán)控制流程圖中未出現(xiàn)的附加相關(guān)信息。圖11中的算法使用該附加信息確定更好的基本程序塊次序;詳細(xì)討論圖11之后該處理將更清楚。經(jīng)圖8的步驟254生成節(jié)點(diǎn)50和54之間的邊緣后,遞增頭指針指向圖9步驟1中所示窗口中的元素e。然后執(zhí)行步驟244至254以生成圖10中節(jié)點(diǎn)50和節(jié)點(diǎn)56(表示基本程序塊e)之間的邊緣,該邊緣初始值為1。此刻,步驟258將遞增圖9步驟1中所示窗口邊界(由值″最后″定義)外部的頭指針。因此,步驟244將導(dǎo)致執(zhí)行步驟242和248,由此借助步驟242改變尾指針指向元素b和改變頭指針指向元素c。然后如前所述重復(fù)步驟242至258直到圖9步驟1中所示窗口中的所有組合用盡。對于窗口尺寸等于4(ws=4),如圖9所說明的組合數(shù)量為4(3)/2=6。圖9步驟1右手側(cè)上說明了圖9步驟1的所有六種可能的組合并已在圖10的抽點(diǎn)圖中確定和正確地識別。經(jīng)圖1的步驟242至258處理步驟1中整個窗口之后,步驟250用來開始經(jīng)圖9步驟2生成待分析的下一個窗口。在步驟250中,將第一指針遞增被稱為″間隔″的值。在圖9中,該間隔被表示為值2。因此,間隔值不必等于窗口值,并且當(dāng)間隔小于窗口尺寸時總是不相等的值,以使圖9每個步驟中的窗口將至少部分地相互重疊,如圖9清楚表明的。例如,在一個實(shí)施例中,可通過間隔值3確定窗口尺寸值8,以使每個窗口將相互重疊5個元素。因此,當(dāng)處理第一窗口之后執(zhí)行步驟250和234時將導(dǎo)致第一和最后指針被設(shè)定到元素c和g,以生成如圖9步驟2中所示的窗口。然后執(zhí)行cefg窗口的處理,以使用步驟240和258尋找如圖9所示cefg中的所有六對。按所要求的多個窗口繼續(xù)圖8的該處理以完全處理整個跟蹤數(shù)據(jù)文件,獲得如圖10的最終抽點(diǎn)圖所示的所有對和所有邊緣。應(yīng)指出,不必真寫出整個跟蹤文件以構(gòu)成抽點(diǎn)圖。使用足夠大的緩沖器包含至少最后的ws基本程序塊并在使用該緩沖器執(zhí)行已編譯的程序期間構(gòu)成該圖而使存儲空間更有效。其原因是跟蹤文件的總尺寸與每個基本程序塊執(zhí)行計(jì)數(shù)之和成正比,而抽點(diǎn)圖的總尺寸與邊緣數(shù)量成正比,該邊緣由與每個邊緣被遞增的次數(shù)無關(guān)的數(shù)量定界。圖11說明經(jīng)過圖10的抽點(diǎn)圖以確定如圖2跟蹤文件中執(zhí)行的計(jì)算機(jī)指令a至j的有效順序或次序方法。圖11說明步驟260至272。步驟260表示在存儲器中生成新文件,其中該文件將包含從圖11的處理輸出的經(jīng)重排序的代碼。該文件將是一個重構(gòu)的可執(zhí)行文件,并在圖12中再次說明。在步驟262,從圖10的示意圖選擇前面仍未被選擇且具有最高實(shí)輸出加權(quán)值的節(jié)點(diǎn)以開始重排序算法。由于在專門路徑上節(jié)點(diǎn)a、e和i包含的實(shí)輸出加權(quán)都為17,在步驟262的第一次執(zhí)行中選擇指令a、e或i之一。通常,當(dāng)有如該aei情況所示的雙向或多向連接時,在抽點(diǎn)圖中遇到的第一個節(jié)點(diǎn)進(jìn)入重構(gòu)的可執(zhí)行文件。因此,在圖12步驟1說明選擇指令a或基本程序塊a并將其放入重構(gòu)文件。在步驟266,設(shè)定指令的當(dāng)前鏈,以便開始在步驟262選擇節(jié)點(diǎn)a。在步驟268,由于僅有一條實(shí)線退出圖10的節(jié)點(diǎn)a,在圖10的抽點(diǎn)圖中節(jié)點(diǎn)a之后僅可執(zhí)行節(jié)點(diǎn)b。因此,步驟268表明經(jīng)圖10的結(jié)構(gòu)從步驟a僅可選擇步驟b。由于步驟268中只選擇一個節(jié)點(diǎn),步驟270中出現(xiàn)的等級并不重要。由于該鏈中僅有一個節(jié)點(diǎn),在步驟272選擇圖10的節(jié)點(diǎn)b作為該鏈中最高等級的節(jié)點(diǎn)。因此,圖12的步驟清楚地表明在基本程序塊或指令a后將基本程序塊b加到重構(gòu)的可執(zhí)行文件。然后,通過步驟268選擇程序塊b作為指令鏈中待分析的下一個節(jié)點(diǎn)。從圖10中的節(jié)點(diǎn)b,從標(biāo)為節(jié)點(diǎn)b的節(jié)點(diǎn)52通過實(shí)線可到達(dá)標(biāo)為節(jié)點(diǎn)54和56的兩個節(jié)點(diǎn)c和d。因此,步驟268從圖10選擇節(jié)點(diǎn)c和d作為從圖10中節(jié)點(diǎn)52可到達(dá)的節(jié)點(diǎn)。然后,步驟270確定接下來應(yīng)將圖10的節(jié)點(diǎn)54和56中的哪一個插入到圖12說明的可執(zhí)行文件。一般來說,如果鏈中有n個候選節(jié)點(diǎn)和k個在先節(jié)點(diǎn),則從抽點(diǎn)圖直接構(gòu)成矩陣Wij,其中i從1延續(xù)到k并表示一個在先節(jié)點(diǎn),j從1延續(xù)到n并表示一個候選節(jié)點(diǎn),Wij是從特定在先節(jié)點(diǎn)i到特定候選節(jié)點(diǎn)j的邊緣在抽點(diǎn)圖中的邊緣計(jì)數(shù)。矩陣Wij包含用來排序候選節(jié)點(diǎn)并選擇插入重構(gòu)的可執(zhí)行文件的特定節(jié)點(diǎn)的抽點(diǎn)圖中收集的所有信息。可采用許多中直觀推斷法進(jìn)行排序和選擇,下文描述其中幾種方法。在扇出法中,借助下面的公式技術(shù)每個候選節(jié)點(diǎn)j的等級值rjrj=∑(Wij/扇出(i))其中,和是全部在先節(jié)點(diǎn)i之和,扇出(i)是離開在先節(jié)點(diǎn)i的實(shí)邊緣的數(shù)量。在上面的實(shí)例中采用不除以扇出的更簡單方法則其效果略差。所選節(jié)點(diǎn)是具有最高等級值的節(jié)點(diǎn),以任意方式切斷其聯(lián)系??上喈?dāng)好地執(zhí)行該方法。通過考慮用矩陣Wij的i行中的元素之和除以矩陣Wij的i行中的每個元素并減去1/n構(gòu)成的矩陣Pij可做出更好的排列。在Wij的i行中所有元素為0的情況下,Pij的i行中的每個元素為0。正值Pij表示在先節(jié)點(diǎn)i和候選節(jié)點(diǎn)j之間的正相關(guān)性,而負(fù)值表示負(fù)相關(guān)性。Pij的i行中至少將有一個元素為非負(fù)值。使用概率幫助補(bǔ)償因循環(huán)迭代中窗口尺寸造成的Wij中可能不可預(yù)測的絕對值并改變在先節(jié)點(diǎn)的執(zhí)行計(jì)數(shù)。每個候選節(jié)點(diǎn)j的等級rj確定如下rj=∑Pij系數(shù)(i)其中總和是整個i行之和,系數(shù)(i)是施加到i行的加權(quán)系數(shù)。可選擇的系數(shù)(i)包括但不限于(a)系數(shù)(i)=1;所有相關(guān)被同等處理,(b)系數(shù)(i)=Pij的i行中的最大元素;較強(qiáng)的相關(guān)被更重地加權(quán),(c)如果根據(jù)i行中的最大元素Pij存儲這些行則基于行i將具有的行號選擇系數(shù)(i);隨已排序的行號降低的系數(shù)也更重地加強(qiáng)較強(qiáng)的相關(guān)(僅在該行具有最大元素時考慮極端情況)。在大多數(shù)程序中,這些不同的系數(shù)選擇將導(dǎo)致非常相似的性能改善。在該具體說明中將使用方法(b)。通過以任意方式切斷的連接最終選擇具有最大等級的候選節(jié)點(diǎn)。通過構(gòu)成矩陣Wij(k=2,n=2)確定圖12步驟2中在程序塊b之后插入的基本程序塊候選節(jié)點(diǎn)在先節(jié)點(diǎn)cda54b54如上所述構(gòu)成矩陣Pij,給出候選節(jié)點(diǎn)現(xiàn)有節(jié)點(diǎn)cda(5/9-1/2)=.056(4/9-1/2)=-.056b(5/9-1/2)=.056(4/9-1/2)=-.056a行的系數(shù)是.056,b行的系數(shù)也是.056在步驟270,候選c的等級是(.056)(.056)+(.056)(.056)=.006,而候選d的等級是(.056)(-.056)+(.056)(-.056)=-.006。因此,在步驟272,由于候選c具有最高等級,故選擇候選c并將其加到當(dāng)前鏈。然后,由于圖10的包含基本程序塊e的節(jié)點(diǎn)58是包含基本程序塊c的節(jié)點(diǎn)54之后可執(zhí)行的唯一節(jié)點(diǎn),因此以普通方式執(zhí)行步驟268和272。因此,圖12的步驟4表示將節(jié)點(diǎn)e插在代碼段程序塊c之后。通過在圖12的步驟5中向可執(zhí)行文件加入基本程序塊f,步驟268至272以相似普通方式繼續(xù)該指令鏈。此刻,步驟268確定基本程序塊g和h是基本程序塊f之后的候選節(jié)點(diǎn)。這時,有k=3個在先節(jié)點(diǎn)c、e和f,和n=2個候選節(jié)點(diǎn)g和h。在步驟272,矩陣Wij構(gòu)成為候選節(jié)點(diǎn)在先節(jié)點(diǎn)ghc41e45f810Pij表示如下候選節(jié)點(diǎn)在先節(jié)點(diǎn)ghc(4/5-1/2)=.3(1/5-1/2)=-.3e(4/9-1/2=)-.056(5/9-1/2)=.056f(8/18-1/2)=-.056(10/18-1/2)=.056節(jié)點(diǎn)g的等級是(.3)(.3)+(.056)(-.056)+(.056)(-.056)=.084,而節(jié)點(diǎn)h的等級是(.3)(-.3)+(.056)(.056)+(.056)(.056)=-.084。因此,在步驟272,節(jié)點(diǎn)g將作為加到當(dāng)前鏈的下一個節(jié)點(diǎn),如圖12的步驟6所示。然后,步驟268至272以普通方式插入基本程序塊i和j,如圖12步驟7和8所示。一旦步驟272表明節(jié)點(diǎn)68或基本程序塊j將作為所選節(jié)點(diǎn),由于在圖12步驟1中已預(yù)先選擇了節(jié)點(diǎn)a并插入,現(xiàn)在沒有可從節(jié)點(diǎn)j到達(dá)的未選擇節(jié)點(diǎn)。因此,現(xiàn)在執(zhí)行步驟262,現(xiàn)在圖10的示意圖中只有節(jié)點(diǎn)d和h是未選節(jié)點(diǎn)。在步驟262選擇節(jié)點(diǎn)d并由于從圖10的步驟56后沒有未被選擇和可到達(dá)的節(jié)點(diǎn)(圖12步驟4中已預(yù)先選擇并插入節(jié)點(diǎn)e),步驟268至272將插入d,并且由于步驟268未發(fā)現(xiàn)未被選擇的節(jié)點(diǎn),重新執(zhí)行步驟262。此時,選擇并插入作為節(jié)點(diǎn)64(表示基本程序塊h)的圖10中的剩余節(jié)點(diǎn),如圖12步驟10所示。因此,圖12清楚地表明了通過由圖6至12所講方法檢測邊緣b與c以及邊緣f和g之間的相關(guān)性,而圖1至5的現(xiàn)有技術(shù)不檢測該相關(guān)性。因此,通過圖6至12所講的方法可比已知的現(xiàn)有技術(shù)提供一種更好的解決辦法和更有效的計(jì)算機(jī)指令排序算法。由于圖12將產(chǎn)生比圖5的現(xiàn)有技術(shù)所示的次序更好的高速緩存性能、更少的流水線充溢以及更好的一般性能,因此圖12的結(jié)構(gòu)優(yōu)于圖5的結(jié)構(gòu)。通過表示跟蹤數(shù)據(jù)文件中不只是密切相鄰的指令對之間相關(guān)性的圖10的抽點(diǎn)圖使得這種優(yōu)越的重排成為可能。編譯處理的分析步驟期間,分析的是代碼的程序流程結(jié)構(gòu)而不是代碼本身,以便確實(shí)改善程序的所有運(yùn)算方面。任何編譯程序最優(yōu)化技術(shù)中的基本步驟是對程序中控制流程的分析??稍诳刂屏鞒虉D(CFG)中表示程序的控制流程結(jié)構(gòu),并簡化成基本程序塊或基本流程結(jié)構(gòu)。通過以等級方式編排這些基本結(jié)構(gòu),通過對基本結(jié)構(gòu)進(jìn)行組合分析可經(jīng)常簡化整個程序分析和提高其速度。在編譯程序應(yīng)用中,該流程圖通常來自用戶源代碼的原始語法分析成為抽象語法樹。然而,也可以以這種形式分析其中流程圖提供表示任何數(shù)量流程的有用方法的任何任務(wù)。可舉出調(diào)度物理量或信息的實(shí)例。在分析編譯程序功能的步驟中,需要將程序流程分解,即轉(zhuǎn)換成單進(jìn)單出(SESE)區(qū)或基本程序塊,該區(qū)或基本程序塊允許以程序優(yōu)化為目的研究和分析該基本程序塊。過去,該分解僅能在所謂的″強(qiáng)連接″圖,即可在程序流程結(jié)構(gòu)中從任何一個程序塊到任何其它程序塊跟蹤流程的圖中進(jìn)行。然而,由于多種原因該技術(shù)并不理想。首先,必須應(yīng)用通過附加邊緣擴(kuò)充原始流程圖邊緣的標(biāo)準(zhǔn)方法,以便更可能地前連接原始控制流程圖。通常,該擴(kuò)充降低了找到SESE區(qū)的機(jī)會。其次,擴(kuò)充原始流程的標(biāo)準(zhǔn)方法不能總是生成強(qiáng)連接流程圖并且不能應(yīng)用該技術(shù)。這表明其不能對所有源程序進(jìn)行優(yōu)化。非常需要有一種技術(shù),只需要較少擴(kuò)充原始流程圖,可處理SESE和單進(jìn)零出(SEZE)兩個區(qū),并且不管是否強(qiáng)連接都可運(yùn)用于所有流程圖。另外,在編譯程序操作的分析步驟中,要求以等級表達(dá)法或格式表示程序。作為最低要求,表達(dá)法應(yīng)示出SESE區(qū)的嵌套特性,理想情況下,該程序表達(dá)法本身應(yīng)帶有全部控制流程信息。當(dāng)表示成程序結(jié)構(gòu)樹(PST)時,僅在強(qiáng)連接(直接)的控制流程圖中識別和定義所有規(guī)范SESE區(qū)的所有等級次序,并且雖然PST帶有嵌套信息,它不能帶有全部控制流程。此外,由于真正的流程圖不需要強(qiáng)連接,需要一種能夠分析包括非強(qiáng)連接程序的一般程序,并能帶有嵌套信息以及全部控制流程信息的編譯程序。初始意義的一個重要方面是根據(jù)規(guī)范單進(jìn)單出或SESE區(qū)和規(guī)范單進(jìn)零出(SEZE)區(qū)將一般(直接)流程圖分解或轉(zhuǎn)換等級結(jié)構(gòu)。SESE區(qū)是僅可經(jīng)該圖的一個邊緣進(jìn)入并僅可經(jīng)該圖的另一個邊緣退出的有向流程圖的子圖。SEZE區(qū)是僅可經(jīng)該圖的一個邊緣進(jìn)入而不能從該圖退出的有向流程圖的子圖。規(guī)范SESE區(qū)是不能進(jìn)一步分解成SESE或SEZE區(qū)的區(qū)域。最簡單的SESE區(qū)是一個基本程序塊控制通過第一邊緣進(jìn)入該基本程序塊并通過第二邊緣離開。其它SESE示范區(qū)包括SESE區(qū)序列、″如果-則-否則區(qū)、單循環(huán)區(qū)和單進(jìn)多出循環(huán)區(qū)。另外,如果原始節(jié)點(diǎn)被分成兩部分,可將一個流程圖分解成更規(guī)范和更簡單的SESE。分離控制流程圖中的一個節(jié)點(diǎn)可增加規(guī)范SESE或SEZE區(qū)的數(shù)量和增加編譯程序的容量以執(zhí)行最優(yōu)化。通過改善流程圖到其最簡單的SESE區(qū)的分解增強(qiáng)了編譯程序?qū)α鞒痰姆治鏊健в械燃壟帕行畔⒁约皩?shí)際控制結(jié)構(gòu)的等級表達(dá)法的結(jié)構(gòu)在快速分析流程圖中非常有用。理想情況是,當(dāng)對流程圖進(jìn)行變換時,該表達(dá)法比原始控制流程更容易運(yùn)算。在等級表達(dá)法中進(jìn)行變換之后,可構(gòu)成一個新控制流程圖。例如,在編譯程序的上下文中,可在分層結(jié)構(gòu)實(shí)現(xiàn)無用代碼消除和循環(huán)變換。當(dāng)已在分層結(jié)構(gòu)執(zhí)行所有變換時,可生成一個適和于編譯程序后端的粗流程。所公開的用于分析程序控制流程的方法任意包括例如一種有向圖的深度優(yōu)先搜索,以實(shí)現(xiàn)節(jié)點(diǎn)分離。該構(gòu)思是將一個節(jié)點(diǎn)分成第一部分和帶有從第一部分到第二部分的邊緣的第二部分。原始節(jié)點(diǎn)的輸出邊緣作為第二部分的輸出邊緣,而原始節(jié)點(diǎn)的進(jìn)入邊緣被分成兩類。那些僅能在原始節(jié)點(diǎn)已被使用之后采用的進(jìn)入原始節(jié)點(diǎn)的邊緣是返回邊緣并連接到第二部分。剩余邊緣連接到第一部分。如果連接到第一部分的邊緣數(shù)量大于1,可促進(jìn)該分離。當(dāng)編譯分析程序不識別任何SESE程序塊的結(jié)構(gòu)時,在分析方法中可在任何時候?qū)崿F(xiàn)該節(jié)點(diǎn)分離步驟。如果對該圖分離部分的數(shù)量加1來切斷邊緣,該邊緣則″可簡化成1″。如果對該圖分離部分的數(shù)量加1將不″可簡化成1″的一對邊緣的兩個邊緣都切斷,該對邊緣則是″可簡化成2″的等同物。對于深度優(yōu)先搜索的任何選擇,可用樹結(jié)構(gòu)表示可簡化成1邊緣。一個等量級別將包含作為可簡化成2的等同物的所有可簡化成2的邊緣或來自樹結(jié)構(gòu)的可簡化成1的邊緣的子集。對于強(qiáng)連接圖,不存在可簡化成1的邊緣并且可簡化成2的等同邊緣也是循環(huán)等同。所公開的方法也應(yīng)用于非強(qiáng)連接圖和強(qiáng)連接圖。對于這類圖,可出現(xiàn)可簡化成1的邊緣,而可簡化成2的等量與循環(huán)等量不同。接下來,通過從原始流程圖卸下有向信息獲得的無向多圖形進(jìn)行深度優(yōu)先搜索。得到的結(jié)構(gòu)比從對有向流程圖進(jìn)行深度優(yōu)先搜索獲得的結(jié)構(gòu)簡單。從該圖的開始節(jié)點(diǎn)初始化深度優(yōu)先搜索。接下來,所公開的方法為每個邊緣找出唯一的等量級別描述符。對于可簡化成1的邊緣,如果搜索樹中沒有更低的可簡化成1的邊緣或描述符已給予搜索樹中更低的可簡化成1的邊緣,這將是一個新描述符。對于可簡化成2的邊緣,采用階層集合(bracket-set)方法學(xué)確定該描述符。根據(jù)所公開的方法,應(yīng)指出,對于無向多圖形中循環(huán)等同邊緣的任何集合,在原始有向圖中最多有兩個支配邊緣鏈。對于強(qiáng)連接圖,實(shí)際有一個鏈。下一步驟包括執(zhí)行原始流程圖新類別的深度有線搜索,以便在原始流程圖每個支配鏈中找出邊緣次序。該步驟將導(dǎo)致找出原始有向圖中所有SESE和SEZE區(qū)。一般來說,要求以等級表達(dá)法表示這些支配鏈。在所公開的方法中,用每個支配鏈中邊緣的次序構(gòu)成簡化流程圖(RFG)。通過用通用流程圖邊緣(FGE)替換原始有向控制流程圖(CFG)中的每個SESE,從最深嵌套SESE向外構(gòu)成RFG。一般來說,F(xiàn)GE表示一個裸邊緣,或一個SESE或SEZE區(qū)。如果FGE不僅使指針指向其連接的節(jié)點(diǎn),而且指向其所連接節(jié)點(diǎn)的入口或出口,可以每邊緣固定時間進(jìn)行替換。與FGE有關(guān)的附加信息是表示邊緣是否為裸邊緣、任何預(yù)定的結(jié)構(gòu)集合,或上面二者都不是的類型。后一情況下,依據(jù)子圖的FGE通過完整的流程子圖表示FGE。最終表示作為唯一的FGE。表達(dá)法也利用″流程圖節(jié)點(diǎn)″(FGN)。由于節(jié)點(diǎn)分離,因而可增加FGN數(shù)量超過節(jié)點(diǎn)的原始數(shù)量。由于是以從底向上方式進(jìn)行替換,大大簡化了對SESE結(jié)構(gòu)分級的任務(wù)。這樣可減少需要檢查的″所感興趣″區(qū)的數(shù)量,以及需要檢查它們的時間。一個重要的實(shí)例是單進(jìn)多出循環(huán)。如果其包含的所有SESE區(qū)已由唯一邊緣替換,則較容易識別這種結(jié)構(gòu)。對于大多數(shù)重要類型的FGE,流程結(jié)構(gòu)是不明顯的,而不是較容易進(jìn)行運(yùn)算的明確結(jié)構(gòu)。對于″上面都不是″的子圖,仍可獲得全部控制流程。在任何時候,RFG的步調(diào)可重新協(xié)商一個完整的流程圖??稍诖丝踢M(jìn)行節(jié)點(diǎn)分裂,而不是在如前所述的前端進(jìn)行。其優(yōu)點(diǎn)是可對圖中更小部分進(jìn)行節(jié)點(diǎn)分離。在開始進(jìn)行節(jié)點(diǎn)分離的優(yōu)點(diǎn)是僅需進(jìn)行一次分離??杀环蛛x的節(jié)點(diǎn)是在有向圖表達(dá)法中有指向所考慮節(jié)點(diǎn)的多個正向邊緣的那些節(jié)點(diǎn)。根據(jù)在此公開的方法和裝置,可以在簡化流程圖中按其等級形式表示流程結(jié)構(gòu),該流程結(jié)構(gòu)帶有SESE嵌套特性以及原始控制流程信息。該表達(dá)法很適合于在編譯程序應(yīng)用中進(jìn)行諸如無用代碼消除或循環(huán)變換之類的最優(yōu)化。進(jìn)行完變換之后,該表達(dá)式攜帶足夠的信息以便重構(gòu)一個包括節(jié)點(diǎn)分離和流程重排效果的新流程圖。將在下面描述的附圖中說明上面討論的方法和裝置更詳細(xì)的說明。雖然所公開的方法包括許多步驟,即使不采用所有步驟也可獲得一些優(yōu)點(diǎn)。例如,(I)增加節(jié)點(diǎn)分離可改善非強(qiáng)連接圖的性能;(ii)公開的不帶節(jié)點(diǎn)分離的方法將正確地處理非強(qiáng)連接圖;(iii)可簡化用來生成簡化流程圖的附加步驟,以生成一個程序結(jié)構(gòu)樹。由所公開方法引入的這組新改進(jìn)是用于下列目的的各個方法,(I)節(jié)點(diǎn)分離;(ii)在不需強(qiáng)連接的圖中尋找可簡化成1和可簡化成2的邊緣的等同級別,(iii)在不需強(qiáng)連接的圖中尋找使用可簡化成1和可簡化成2的邊緣的等同級別的支配鏈,和(iv)以簡化流程圖的形式構(gòu)成等級表達(dá)式。圖13說明可用來重排計(jì)算機(jī)代碼的方法。圖13類似于圖7。在圖13中,以與圖7相似的方式提供源代碼124。存取源代碼以構(gòu)成簡化流程圖(RFG)結(jié)構(gòu)(如后面圖14-32所講)。在步驟142,將用來在跟蹤數(shù)據(jù)文件中捕獲跟蹤信息的編序(instrumentation)代碼插入該代碼。在步驟140,將源代碼與所插入的編序跟蹤代碼一起編譯,以生成一個目標(biāo)模塊文件146。經(jīng)步驟148執(zhí)行該目標(biāo)模塊以生成一個包含代碼基本程序塊之間相關(guān)信息的″計(jì)數(shù)″文件150。編譯程序158在步驟152檢查是否復(fù)制代碼。如果在步驟152請求復(fù)制,則在步驟154執(zhí)行。(見圖43的復(fù)制實(shí)例)。然后編譯程序158在步驟156重排代碼,并以與圖7相同的方式生成另一個目標(biāo)模塊159。應(yīng)指出,雖然示出源代碼144的重排,該方式也可工作于目標(biāo)代碼。在圖14中,所示控制流程圖包括一個所謂的″泡″201,該″泡″經(jīng)″邊緣″203通向另一個″泡″205。在控制流程圖中,泡表示由程序或子程序在例如圖6所示計(jì)算機(jī)系統(tǒng)中各種詳細(xì)層次執(zhí)行的一個或多個連續(xù)運(yùn)算。在此公開中,術(shù)語″泡″可用來與包括但不限于術(shù)語″基本程序塊″和可由″代碼語句″、″程序″、″子程序″、″函數(shù)調(diào)用″等組成的連續(xù)運(yùn)算互換?!暹吘墶灞硎驹谟?jì)算化運(yùn)算控制流程中向另一個泡或基本程序塊的有向轉(zhuǎn)移??刂屏鞒虉D說明由程序而不是由具體運(yùn)算本身執(zhí)行運(yùn)算組的順序。編譯程序使用該圖的各種形式以使由這些圖表示的程序結(jié)構(gòu)最優(yōu)化。如圖所示,泡205經(jīng)邊緣206連到泡207,泡207再經(jīng)邊緣208連到泡209,在此,邊緣211提供一個循環(huán)結(jié)構(gòu)。泡209經(jīng)邊緣213進(jìn)一步連到泡215,然后,泡215經(jīng)邊緣219連到泡221。泡205也經(jīng)邊緣217連到泡215,泡221經(jīng)邊緣223循環(huán)回連到泡201。示出圖14說明″強(qiáng)連接″控制流程圖的定義,即,該圖上每個基準(zhǔn)點(diǎn)或節(jié)點(diǎn)經(jīng)至少一個明確的路徑連接到圖上所有其它節(jié)點(diǎn),包括基準(zhǔn)節(jié)點(diǎn)或點(diǎn)本身。例如,從泡207通過由邊緣208、泡209、邊緣213、泡215、邊緣219、泡221、邊緣223、泡201和邊緣203組成的路徑到達(dá)泡205。圖15說明非″強(qiáng)連接″的控制流程圖。圖15中,泡301經(jīng)邊緣303連到泡305,泡305又經(jīng)邊緣306連到泡307,再經(jīng)邊緣308連到泡309,在此,邊緣311提供一個循環(huán)結(jié)構(gòu)。泡305也經(jīng)邊緣317連到泡315,泡315經(jīng)邊緣313連到泡309。泡315也經(jīng)邊緣319連到泡321,從此處經(jīng)邊緣323回到泡301。對于所說明的圖,從泡307可到達(dá)的唯一泡是泡309,因此,該圖是非強(qiáng)連接并且現(xiàn)有過程不能用來分析其控制流程。因此,圖15所示控制流程定義為″非強(qiáng)連接″。在本公開之前,由于分析該圖的SESE和SEZE結(jié)構(gòu)的有效方式是非強(qiáng)連接,并用該分析法相對于結(jié)構(gòu)、內(nèi)容和速度進(jìn)行最優(yōu)化,“強(qiáng)連接”和“非強(qiáng)連接”控制流程圖之間的區(qū)別較明顯。本發(fā)明提供一種方法和裝置,對如上面提出的被認(rèn)為是″非強(qiáng)連接″的大多數(shù)程序進(jìn)行編譯最優(yōu)化。在執(zhí)行所述分析前,通常將擴(kuò)充控制流程圖。該擴(kuò)充通常包括(I)將帶有邊緣的START節(jié)點(diǎn)引入到進(jìn)入函數(shù)的所有入口,(ii)引入帶有從函數(shù)所有返回邊緣的END節(jié)點(diǎn),和(iii)從END節(jié)點(diǎn)到START節(jié)點(diǎn)的邊緣。為使用所述方法,不需要結(jié)束節(jié)點(diǎn)和從其到來的邊緣。如果進(jìn)行最后兩個擴(kuò)充,該方法將起作用,但在許多情況下,如果不進(jìn)行擴(kuò)充,可給出更好的結(jié)構(gòu)分析。在圖16所示的控制流程圖中,開始節(jié)點(diǎn)經(jīng)邊緣403連到泡407。然后,泡407經(jīng)邊緣409和419分別連到泡413和423。泡423經(jīng)邊緣425連到泡427,泡427經(jīng)邊緣429循環(huán)回到泡423。泡427和413經(jīng)分開的路徑或邊緣431和415分別連到泡417。泡417經(jīng)邊緣433指向結(jié)束節(jié)點(diǎn)435。圖16說明了在控制流程圖中定義或識別單進(jìn)單出(SESE)區(qū)的處理。具體地說,區(qū)411是SESE區(qū)是由于僅有一條路徑進(jìn)入該區(qū)和一條路徑退出該區(qū)。如果單獨(dú)取出,由于有兩條路徑進(jìn)入泡423并有一條路徑退出,泡423不構(gòu)成SESE區(qū)。然而,如果將泡423和泡427作為一體而言,該組合確實(shí)定義了一個SESE區(qū)421,包括一個唯一入口(即邊緣419)和一個唯一的出口(即邊緣431)。同樣,如果開始節(jié)點(diǎn)401和結(jié)束節(jié)點(diǎn)435之間的所有泡和邊緣作為一體,可以識別或定義另一個SESE區(qū)405。應(yīng)指出,控制流程圖中存在的非SESE區(qū)的區(qū)域使這類圖的編譯分析和最優(yōu)化很難進(jìn)行并且復(fù)雜化。然而,所公開的方法是通過將該圖斷開成用于更直接的編譯分析和最優(yōu)化的SESE區(qū)實(shí)施的。在圖17中,開始節(jié)點(diǎn)501經(jīng)邊緣503指向泡507,而泡507又經(jīng)邊緣509指向泡511。泡511經(jīng)邊緣513連到泡515。泡511包括一個循環(huán)519。泡511還經(jīng)邊緣521指向泡523。泡523經(jīng)邊緣521和525分別指向泡529和507。雖然在向下流程示出結(jié)束節(jié)點(diǎn)531好象跟隨泡529,但結(jié)束節(jié)點(diǎn)531未連到任何其它節(jié)點(diǎn)。圖17說明了有一個進(jìn)入邊緣和零退出邊緣的單進(jìn)零出(SEZE)區(qū)517和528。這些SEZE區(qū)517和528包括在例如與SESE區(qū)505和510相同的圖中。還要說明的是″嵌套″SEZE區(qū)517在SESE區(qū)510內(nèi)。圖18和19說明″節(jié)點(diǎn)分離″功能。在圖18中,示出應(yīng)用節(jié)點(diǎn)分離功能之前的控制流程圖部分。邊緣601通往泡605,泡605又分別經(jīng)邊緣607和611指向泡609和613。泡609經(jīng)邊緣615指向泡613。泡613包括一個循環(huán)617并且還經(jīng)邊緣619連到泡621。邊緣623通往泡621之外。邊緣601和623之間的區(qū)構(gòu)成一個SESE區(qū)。應(yīng)指出,如圖18所示的節(jié)點(diǎn)或泡613,由于除內(nèi)部循環(huán)返回617之外,泡613還有兩條進(jìn)入邊緣611和615以及一條出邊緣619,泡613代表一個對編譯分析和最優(yōu)化極端困難的節(jié)點(diǎn)。如圖19所示,可實(shí)施一個″節(jié)點(diǎn)分離″功能,以便進(jìn)一步簡化該圖并便于其分析和最優(yōu)化。圖19示出對圖18的圖進(jìn)行″節(jié)點(diǎn)分離″之后的情況。邊緣701指向泡705,泡605又分別經(jīng)邊緣707和711指向泡709和713。泡709也經(jīng)邊緣715連到泡713。泡713經(jīng)邊緣714指向泡716。泡716包括一個循環(huán)717并且經(jīng)邊緣720連到泡721。從邊緣723通往該圖中未示出的其它部分。圖19包括SESE區(qū)703和718。應(yīng)指出,在實(shí)施節(jié)點(diǎn)分離功能時,已加入了一個″空″節(jié)點(diǎn)或泡。該空節(jié)點(diǎn)713不包含與其有關(guān)的信息,增加它的目的是為生成SESE區(qū)718,以便于使圖18所示控制流程表示的程序編譯最優(yōu)化。在圖20中,開始節(jié)點(diǎn)801經(jīng)邊緣″g″指向泡805,而泡805又經(jīng)邊緣″h″指向泡809。泡809包括一個循環(huán)邊緣811。泡805被確定為一個SESE區(qū)803,包括循環(huán)811的泡809被確定為SESE區(qū)807。開始節(jié)點(diǎn)801還經(jīng)邊緣″d″指向泡815。氣泡815經(jīng)邊緣″e″指向泡819,泡819又經(jīng)邊緣″b″和″a″分別指向泡823和825。泡823經(jīng)邊緣″c″指向泡825,然后泡825經(jīng)邊緣826指向泡827。泡827經(jīng)邊緣829循環(huán)回泡815,并經(jīng)邊緣″f″指向泡831。雖然未示出結(jié)束節(jié)點(diǎn)833連到任何節(jié)點(diǎn),結(jié)束節(jié)點(diǎn)833在該圖底部。SEZE區(qū)803包括泡805,SESE區(qū)807包括泡809和循環(huán)811。SESE區(qū)813包括邊緣″d″和″f″之間的所有泡和邊緣。SESE區(qū)821表示另一個SESE區(qū)817內(nèi)的嵌套SESE區(qū),SESE區(qū)817本身表示SESE區(qū)813內(nèi)的一個嵌套。另外,由于SEZE區(qū)821是這類區(qū)中最小的區(qū)并且不能分解成任何其它更小的SESE區(qū),因此SESE區(qū)821是所謂的″規(guī)范″SESE區(qū)。例如,SESE區(qū)817是一個SESE區(qū),但由于可將其分解成SESE區(qū)821,因此它不是一個規(guī)范SESE區(qū)。圖20說明具有所定義的SESE區(qū)的控制流程圖,圖8B至8G說明″變換″步驟,為便于程序循環(huán)結(jié)構(gòu)的分析和最優(yōu)化的目的利用該變換步驟更進(jìn)一步簡化該圖和簡化成“簡化流程圖”(RFG)。通過用描述該結(jié)構(gòu)的單個邊緣替換原始流程圖中的每個SESE區(qū)獲得簡化流程圖結(jié)構(gòu)。該結(jié)構(gòu)的實(shí)例是″裸邊緣″、″單節(jié)點(diǎn)″、″如果-則-否則程序塊″、″單進(jìn)多出循環(huán)″、″DAG″(即有向非循環(huán)圖)等??刹煌ㄟ^流程圖隱含地表示所有簡化結(jié)構(gòu)。這樣使得諸如內(nèi)循環(huán)變換之類的運(yùn)算更簡單。進(jìn)行變換之后,可用RFG生成新控制流程圖。圖21中,示出圖20包含泡819、823和825以及邊緣″a″、″b″和″c″的控制流程圖部分被變換成僅包括與邊緣″a″和新邊緣″b連接的泡835和837的更簡單的表示。如圖22具體所示,邊緣″b已代替泡823和原始邊緣″b″和″c″??梢钥闯?,圖21中的新表達(dá)法更簡單并且更便于為編譯最優(yōu)化函數(shù)的目的工作。圖23示出進(jìn)一步變換,其中泡819和825以及邊緣″e″、″a″和″b變換成表示為″e的單個邊緣。另外,在圖24中,泡815和827以及邊緣″d″和″e,包括循環(huán)829被變換成新邊緣″d。圖25示出從泡805和邊緣″g″和″h″變換成新邊緣″g,圖26示出從泡809和循環(huán)邊緣811變換成表示為″h的單個新邊緣表達(dá)法。通過所示變換,可將圖20所示原始控制流程圖簡化和表示成圖27所示的簡化控制流程圖,圖27所示的簡化控制流程圖包括開始節(jié)點(diǎn)901和帶有包含圖20最初存在的信息的標(biāo)志文件905和911的邊緣903和907。節(jié)點(diǎn)和邊緣數(shù)據(jù)結(jié)構(gòu)表示控制流程圖的基本成分。其字段包括如下項(xiàng)目成分節(jié)點(diǎn)后繼邊緣原有邊緣樹節(jié)點(diǎn)邊緣節(jié)點(diǎn)(來自)節(jié)點(diǎn)(到)級別標(biāo)記流程圖1000由節(jié)點(diǎn)和邊緣組成。每個節(jié)點(diǎn)具有多個離去邊緣。每個邊緣從一個節(jié)點(diǎn)到另一個節(jié)點(diǎn)。有向流程圖1015正如原始流程圖1000一樣具有節(jié)點(diǎn)和邊緣。因擴(kuò)充步驟1005或節(jié)點(diǎn)分離步驟1010使其可具有更多節(jié)點(diǎn)和邊緣。這是一種節(jié)點(diǎn)和邊緣數(shù)量可不保持為常數(shù)的情況。圖28說明應(yīng)用該方法步驟的順序以及按方法進(jìn)程構(gòu)成的結(jié)構(gòu)。一般來說,圖28中的矩形框表示結(jié)構(gòu)信息,橢圓形泡表示方法的應(yīng)用。框1000表示初始控制流程圖或任何其它有向圖。該方法將為該圖確定SESE/SEZE鏈的最大集合。另外,該方法還生成表示原始控制流程圖的簡化流程圖。在步驟1005,如果框1000的原始有向圖具有多個入口,則向原始控制流程圖加入新″開始″節(jié)點(diǎn)。該″開始″節(jié)點(diǎn)具有一個指向框1000控制圖的每個原始入口的邊緣。如果原始控制流程圖僅有一個入口。則不需要該擴(kuò)充,可以采取″開始″節(jié)點(diǎn)以簡化框1000控制圖的唯一入口。在步驟1010,對從步驟1005得到的擴(kuò)充圖進(jìn)行任選節(jié)點(diǎn)分離操作。該步驟的目的是改進(jìn)控制流程圖,以便為找出SESE/SEZE區(qū)展現(xiàn)出更大的可能性。圖11和13更詳細(xì)地說明執(zhí)行該步驟的方法。不必進(jìn)行該操作,但如果在該階段應(yīng)用一次該步驟或無論何時確定SESE/SEZE區(qū)時可能應(yīng)用多次,對許多流程圖的分析將會更好。該步驟的結(jié)果是由框1015表示的有向控制流程圖。步驟1020將框1015表示的有向圖轉(zhuǎn)向框1025表示的無向圖。在普通表達(dá)式中,有向圖中的每個節(jié)點(diǎn)有到有向圖中其它節(jié)點(diǎn)的邊緣的集合。該集合通常由陣列結(jié)構(gòu)或列表結(jié)構(gòu)表示。如果邊緣數(shù)量保持常數(shù),陣列結(jié)構(gòu)更有效,如果正在施加控制流程分析的應(yīng)用中可改變邊緣數(shù)量,列表結(jié)構(gòu)更有效。在無向圖中,每個節(jié)點(diǎn)必須有到或來自其它節(jié)點(diǎn)的邊緣集合。該集合可由一個或兩個陣列或列表結(jié)構(gòu)表示。通過經(jīng)過有向圖中每個節(jié)點(diǎn)和將其每個離去邊緣作為一個進(jìn)入邊緣加入到其所去的節(jié)點(diǎn)可很容易地確定進(jìn)入一個節(jié)點(diǎn)的邊緣集合。在步驟1030,在″開始″節(jié)點(diǎn)開始的無向深度優(yōu)先搜索(DFS)被用來確定無向圖1025的深度優(yōu)先次序1040和無向圖的深度優(yōu)先搜索樹圖(DFST)表達(dá)法1035。在該樹圖表示中,圖1025的每個邊緣分成″正向″邊緣或″返回″邊緣。圖31更詳細(xì)地描述執(zhí)行步驟1030的方法。對于大多數(shù)圖,與深度優(yōu)先搜索有關(guān)的任意選擇表明沒有與無向圖1025有關(guān)的唯一DFST。任何這些合理的選擇都是可接受的。在步驟1045,″階層集合″方法用來尋找可簡化成1和可簡化成2的邊緣并構(gòu)成邊緣的等同級別。圖32說明步驟1045的詳細(xì)內(nèi)容。階層集合方法提供幾種新方面。該方法成功地處理具有可簡化成1的邊緣的圖,而現(xiàn)有技術(shù)的方法卻不能。另外,階層集合方法以比現(xiàn)有技術(shù)處理更少的限制目標(biāo)處理。新方法尋找更一般的等同級別的集合。如果兩個邊緣循環(huán)相等,則由新方法賦給它們等同級別。然而,新方法還向可簡化成2的等同物的兩個邊緣賦予相同的等同級別。可簡化成1的邊緣形成從″開始″節(jié)點(diǎn)開始的樹結(jié)構(gòu),新方法還將借助其它可簡化成1的邊緣向盡可能多對可簡化成1的邊緣賦予等同級別。步驟1045的結(jié)果是賦給無向流程圖1025中每個邊緣一個級別。該賦值由框1050表示。由于這些邊緣是與有向流程圖1015中相同的邊緣,它還表明賦給有向流程圖1015中每個邊緣一個級別。在步驟1055,有向流程圖1015和每個邊緣1050的級別賦值用來做出以有向流程圖的″開始″節(jié)點(diǎn)開始的有向DFS,找出邊緣的鏈,其中鏈中的每個邊緣支配鏈中該邊緣之后的邊緣。該處理產(chǎn)生簡化流程圖1060。圖33說明步驟1055的詳細(xì)內(nèi)容。與現(xiàn)有技術(shù)相反,即使有可簡化成1和其它級別的邊緣不循環(huán)相等,新方法也正確地工作。事實(shí)上,新方法正確地構(gòu)成包括包含不循環(huán)相等或可簡化成1的邊緣鏈的SESE鏈的最大集合。圖15給出包括不循環(huán)相等但可簡化程的等同物的邊緣鏈的實(shí)例。邊緣306和308為可簡化成2的等同物,但不循環(huán)相等。所公開的方法正確地推論節(jié)點(diǎn)307以及邊緣306和308組合一個SESE區(qū)。結(jié)果是,新方法處理非強(qiáng)連接的原始控制流程圖1000。對于強(qiáng)連接圖,現(xiàn)有技術(shù)的方法構(gòu)成表明所找出的SESE區(qū)嵌套特性的程序結(jié)構(gòu)樹。該新方法很容易用來構(gòu)成程序結(jié)構(gòu)樹,但圖33示出如何構(gòu)成一個新結(jié)構(gòu),即簡化流程圖(RFG),其中SESE/SEZE區(qū)的每個鏈被RFG中的單個邊緣代替。該替換從底向上進(jìn)行,以使得到的RFG可具有懸擺邊緣,但沒有明顯的SESE/SEZE區(qū)。除表示一個SESE區(qū)在另一個SESE區(qū)內(nèi)的等級規(guī)模作為程序結(jié)構(gòu)樹外,新表示法還帶有原始流程圖1000的完整控制流程。無向流程圖1025也有節(jié)點(diǎn)和邊緣。然而,現(xiàn)在無向流程圖1025具有進(jìn)入和離開兩個邊緣。選擇一種表示法很方便,以便用同一結(jié)構(gòu)表示框1015和框1025兩個框。例如,每個節(jié)點(diǎn)可與由后跟有進(jìn)入邊緣的離去邊緣組成的邊緣陣列有關(guān),每個離去邊緣有許多進(jìn)入邊緣。這樣對無向和有向深度優(yōu)先搜索二者都方便。使邊緣具有表明其是否被使用的標(biāo)記也很有用,以便在無向DFS中每個邊緣僅被經(jīng)過一次。在執(zhí)行無向DFS1030中,建立DFST結(jié)構(gòu)并保持返回邊緣很有用。由于一旦構(gòu)成RFG則不需要該信息,生成一個分開的″樹節(jié)點(diǎn)″結(jié)構(gòu)很方便。樹節(jié)點(diǎn)節(jié)點(diǎn)邊緣子表(樹節(jié)點(diǎn))進(jìn)入表(InList)(返回邊緣)BS表(返回邊緣)Z級別(一種級別)每當(dāng)?shù)谝淮芜M(jìn)入無向DFS中的一個節(jié)點(diǎn)時生成樹節(jié)點(diǎn)結(jié)構(gòu)。樹節(jié)點(diǎn)指向節(jié)點(diǎn)、用來進(jìn)入該節(jié)點(diǎn)的邊緣、從樹節(jié)點(diǎn)直接到達(dá)的樹節(jié)點(diǎn)子表、指向樹節(jié)點(diǎn)的DFST中的返回邊緣的進(jìn)入表,離開樹節(jié)點(diǎn)的DFST中的返回邊緣的″BS表″和識別與進(jìn)入樹節(jié)點(diǎn)的邊緣有關(guān)的可簡化成1的級別的″Z級別″。本返回邊緣結(jié)構(gòu)是表示″階層集合″的結(jié)構(gòu)。返回邊緣邊緣計(jì)數(shù)舊級別舊計(jì)數(shù)最早的級別SESE鏈將其實(shí)施為雙鏈接表中的元素,以便可將其從返回邊緣表快速刪除。在返回邊緣結(jié)構(gòu)中需要一些其它結(jié)構(gòu)用于表示″階層集合″,但這些結(jié)構(gòu)的值僅對BS表中的第一元素重要。一般來說,一個″階層集合″以作為其第一元素的返回邊緣和表中的項(xiàng)數(shù)為特征。這表明返回邊緣包含一計(jì)數(shù)結(jié)構(gòu)。當(dāng)返回邊緣較早,如果肯定是BS表中的第一元素時,還包含表示最后等同級別的″舊級別″和″舊計(jì)數(shù)″字段以及″階層集合″的項(xiàng)數(shù)。它還包含最早的、由BS表中任何返回邊緣到達(dá)的最早構(gòu)成的樹節(jié)點(diǎn)的深度。最后,將一個級別賦值給每個邊緣,因此每個邊緣需要一個級別成分。另外,在步驟1055中,每個級別需要一個將用于尋找SESE/SEZE區(qū)和簡化流程圖的SESE鏈成分。圖29表示用于節(jié)點(diǎn)分離的有向DFS。其目的是產(chǎn)生有向DFS和為每個節(jié)點(diǎn)辨別從正向進(jìn)入該節(jié)點(diǎn)的返回邊緣或進(jìn)入該節(jié)點(diǎn)的跨越邊緣。產(chǎn)生DFS時,將節(jié)點(diǎn)放置在指令棧上。從節(jié)點(diǎn)N到節(jié)點(diǎn)M的邊緣被認(rèn)為是返回邊緣,如果考慮該邊緣的化,節(jié)點(diǎn)M在棧上。DFS在步驟1100開始。在步驟1105將節(jié)點(diǎn)″n″初始化成″開始″節(jié)點(diǎn),在步驟1110,將節(jié)點(diǎn)″n″推上棧。在步驟1115,將節(jié)點(diǎn)″n″復(fù)位到棧頂上的節(jié)點(diǎn)。在步驟1120,把邊緣″e″作為仍未從節(jié)點(diǎn)″n″訪問的下一個邊緣。如果在仍未嘗試的節(jié)點(diǎn)″n″之外不存在邊緣,步驟1125使節(jié)點(diǎn)″n″離開該棧。如果棧不空,以步驟1115重新開始該方法。節(jié)點(diǎn)″n″彈出棧之后如果該??眨瑒t在步驟1130完成DFS。然后,如圖30步驟1200所述進(jìn)行節(jié)點(diǎn)分離。如果步驟1200找到另一個邊緣″e″,步驟1135檢查由邊緣″e″到達(dá)的節(jié)點(diǎn)″n″。如果仍未訪問節(jié)點(diǎn)″n″,則在步驟1140將邊緣″e″加到進(jìn)入節(jié)點(diǎn)″n″的正向邊緣表。然后,在步驟1145將節(jié)點(diǎn)″n″設(shè)定成節(jié)點(diǎn)″n并在步驟1110繼續(xù)該方法。如果已訪問節(jié)點(diǎn)″n,步驟1150判斷節(jié)點(diǎn)″n″是否在棧上。如果不在,在步驟1155將邊緣″e″加到進(jìn)入節(jié)點(diǎn)″n的正向邊緣表,并且該方法繼續(xù)在步驟1120嘗試下一個邊緣。如果在棧上,在步驟1160將邊緣″e″加到進(jìn)入節(jié)點(diǎn)″n的返回邊緣表,并且該方法在步驟1120繼續(xù)到下一個候選邊緣。一種判斷節(jié)點(diǎn)″n是否在棧上的簡單方法是當(dāng)其被推動時標(biāo)記每個節(jié)點(diǎn)為″在棧上″并當(dāng)其被″彈出?!鍟r不標(biāo)記節(jié)點(diǎn)。這是一個普通過程。圖30示出一旦執(zhí)行圖29的DFS時如何進(jìn)行節(jié)點(diǎn)分離。在步驟1200開始節(jié)點(diǎn)分裂。可認(rèn)為這些節(jié)點(diǎn)處在任何適當(dāng)次序。在步驟1205,選擇節(jié)點(diǎn)″n″作為下一個節(jié)點(diǎn)。如果不存在節(jié)點(diǎn),則在步驟1210結(jié)束節(jié)點(diǎn)分離。否則,在步驟1215查看是否有多于一個正向邊緣進(jìn)入節(jié)點(diǎn)″n″或進(jìn)入節(jié)點(diǎn)″n″的返回邊緣數(shù)量大于0和離開節(jié)點(diǎn)″n″的邊緣數(shù)量大于1。如果否定,該方法以下一個節(jié)點(diǎn)在步驟1205重新開始。如果肯定,將進(jìn)行節(jié)點(diǎn)分離。在步驟1220和1225,生成兩個新節(jié)點(diǎn)″m″和″k″。在步驟1230移動用來進(jìn)入節(jié)點(diǎn)″n″的正向邊緣以便進(jìn)入節(jié)點(diǎn)″m″。在步驟1235增加從節(jié)點(diǎn)″m″到節(jié)點(diǎn)″k″的唯一邊緣。在步驟1240移動用來進(jìn)入節(jié)點(diǎn)″n″的返回邊緣以便進(jìn)入節(jié)點(diǎn)″n″。最后,在步驟1245切換用來離開節(jié)點(diǎn)″n″的邊緣以便被切換到離開節(jié)點(diǎn)″k″。該過程在步驟1205以下一個節(jié)點(diǎn)重新開始。從語義學(xué)上來說,不對步驟1220引入的新節(jié)點(diǎn)″m″進(jìn)行操作。由原始節(jié)點(diǎn)″h″執(zhí)行的任何操作由步驟1225引入的新節(jié)點(diǎn)″k″執(zhí)行。圖31示出如何用無向DFS從無向圖構(gòu)成一個DFST。還要建立將在圖32中使用以尋找與每個邊緣有關(guān)的級別的子表、進(jìn)入表、BS表結(jié)構(gòu)。無向DFS在步驟1305開始。在步驟1310初始化設(shè)定邊緣″e″為空,深度優(yōu)先搜索數(shù)量″dfs″的值為0,父樹節(jié)點(diǎn)″p″為空,Node為″開始″節(jié)點(diǎn),樹節(jié)點(diǎn)″鏈″的表為空表。在步驟1315,從節(jié)點(diǎn)″n″構(gòu)成新樹節(jié)點(diǎn)″t″。將其賦值為其dfs的數(shù)值,即“dfs”值,然后將“dfs”加1。使″t″和″n″相互指向。另外,樹節(jié)點(diǎn)指向邊緣″e″。在步驟1320,如果″p″不空,將樹節(jié)點(diǎn)″t″加到樹節(jié)點(diǎn)″p″的子表。另外,樹節(jié)點(diǎn)″t″附加到″鏈″前。在步驟1325,將樹節(jié)點(diǎn)″t″推上棧。在步驟1330,將樹節(jié)點(diǎn)″p″設(shè)定成棧頂?shù)闹?。在步驟1335,設(shè)定″e″為從由″p″指向的節(jié)點(diǎn)出來的下一個邊緣。如果未為該節(jié)點(diǎn)留下邊緣,在步驟1340將″p″彈出棧。如果留下非空棧,控制在步驟1330繼續(xù)。如果留下空棧,在步驟1345產(chǎn)生DFS,并可發(fā)現(xiàn)如圖32所示的等同級別。在步驟1350,設(shè)定節(jié)點(diǎn)″n″為跟隨邊緣″e″到達(dá)的節(jié)點(diǎn)。如果仍未訪問該節(jié)點(diǎn),以步驟1315繼續(xù)方法,否則,在步驟1355設(shè)定樹節(jié)點(diǎn)″t″為與節(jié)點(diǎn)″n″有關(guān)的樹節(jié)點(diǎn)。在步驟1360,生成新返回邊緣″b″。將除邊緣外的所有成分初始化為零值。在步驟1365加到″t″的進(jìn)入表。還在步驟1370將其鏈接到″p″的BS表前,保持計(jì)數(shù)正確。另外,保持BS表最早的字段。然后以步驟1335繼續(xù)該方法。圖32示出如何將級別賦值給每個邊緣。在步驟1400開始向邊緣的級別賦值。在步驟1403,從樹節(jié)點(diǎn)″鏈″的表除去樹節(jié)點(diǎn)″p″。通過圖31描述的方法生成該表。如果該表為空,則在步驟1406結(jié)束賦值,可如圖33所示繼續(xù)構(gòu)成RFG。否則,通過將″BS″初始化成為圖31中的樹節(jié)點(diǎn)″p″構(gòu)成的BS表在步驟1409開始為該樹節(jié)點(diǎn)構(gòu)成階層集合″BS″,將變量“最低”設(shè)定成“BS表(p)”的“最早”值,變量“次最低”設(shè)定為零。一般來說,通過形成表Cap、BS表(p)、″p″的子BS表,和從該表刪除進(jìn)入表(p)中的邊緣獲得樹節(jié)點(diǎn)″p″的BS表。在步驟1409-1445對此進(jìn)行描述。一般來說,可由樹結(jié)構(gòu)歸類等同的SEZE邊緣。在樹中分支的變更中選擇SELECT(zc、z級別(t))。一個簡單的規(guī)則是如果其不為零則選擇zc,否則選擇z級別(t)。當(dāng)可提供實(shí)際邊緣計(jì)數(shù)時,當(dāng)控制流程圖來自編序代碼時可能就是這種情況,較好的選擇是選擇具有較高邊緣計(jì)數(shù)的非零替換。如果兩者都為零,則選擇零。在步驟1412,將級別″zc″初始化為零。此后的步驟累積DFST中樹節(jié)點(diǎn)″p″的子階層集合。步驟1415至1421將子BS表加到″BS″。在步驟1415,采用(并取消)樹節(jié)點(diǎn)″t″作為″p″的子表中的下一個樹節(jié)點(diǎn)。如果該表中不再有節(jié)點(diǎn),該方法則以步驟1424繼續(xù)。否則,將″t″的BS表附加到″BS″的返回,并在步驟1418更新″BS″的計(jì)數(shù)。如果″t″的BS表最早的值涉及比最低早的樹節(jié)點(diǎn),則將次最低設(shè)定為最低并將最低設(shè)定成該最早值。否則,如果″t″的BS表最早的值涉及比次最低早的樹節(jié)點(diǎn),則將次最低設(shè)定成該最早值。在步驟1421,如果″zc″為零,則將其設(shè)定成″t″的Z級別的值。在步驟1415針對″p″的子表的下一個元素重新開始該方法。步驟1424至1436從階層集合取消″p″的進(jìn)入表中的返回邊緣。在步驟1424,″b″是來自″p″的進(jìn)入表的下一個返回邊緣。當(dāng)未留下任何內(nèi)容時,以步驟1439繼續(xù)該方法。否則,在步驟1427,將″b″從″BS″解脫,并適當(dāng)?shù)卣{(diào)節(jié)″BS″的(可能是新的)第一元素。在步驟1430,采用″e″作為與返回邊緣″b″有關(guān)的邊緣。如果其為零,以步驟1424繼續(xù)該方法,否則,采用″c″作為與邊緣″e″有關(guān)的級別。如果其不是零,該邊緣已經(jīng)具有與其有關(guān)的級別并以步驟1424繼續(xù)該方法。否則,步驟1436生成一個新級別并將其賦值給邊緣″e″。再次以步驟1424繼續(xù)該方法。如果需要,步驟1439至1445增加Cap邊緣。在步驟1439,如果次最低不是零則需要Cap邊緣。Cap邊緣是一個將節(jié)點(diǎn)″t″連到由次最低指向的樹節(jié)點(diǎn)的返回邊緣,并應(yīng)放在表″BS″的開始處。如果需要一個Cap邊緣,步驟1442構(gòu)成一個新返回邊緣″b″,步驟1445將其附加到″BS″之前,并以步驟1448重新開始該方法。否則,該方法越過步驟1448。在步驟1448,進(jìn)行查看″BS″是否為零。如果通向″p″的邊緣為可被簡化成1則發(fā)生。如果如此,以步驟1481繼續(xù)該方法。否則,步驟1451檢查″BS″的第一元素″b″。步驟1454設(shè)定″c″為″b″的舊級別。如果″c″為零,該方法則以步驟1463繼續(xù)。否則步驟1460查看″b″的舊計(jì)數(shù)是否等于″BS″的計(jì)數(shù)。如果不是,以步驟1463繼續(xù)該方法。否則,以步驟1466繼續(xù)該方法。在步驟1463,將″c″和舊級別(″b″)二者設(shè)定為新級別值。這是″b″仍未與以前的階層集合相關(guān)或結(jié)果是″b″已與具有不同計(jì)數(shù)的階層集合有關(guān)的結(jié)果。在步驟1466,查看″BS″是否僅有一個返回邊緣。如果肯定,在步驟1469將″e″設(shè)定到與返回邊緣有關(guān)的邊緣,在步驟1472將″e″的級別設(shè)定到″c″。然后以步驟1475繼續(xù)該方法。如果″BS″無元素則到達(dá)步驟1481。在步驟1481查看″zc″是否為零。如果不是,以步驟1475繼續(xù)該方法。否則,將″c″和″zc″設(shè)定成與進(jìn)入″p″的可簡化成1的邊緣有關(guān)的新級別值。在步驟1475,查看″p″是否為零。如果不是,將″p″的邊緣的級別設(shè)定成″c″和將″p″的Z級別設(shè)定成″zc″。在步驟1403針對″鏈″的下一個元素繼續(xù)方法。否則,在步驟1403以″鏈″的下一個元素繼續(xù)該方法。圖33說明如何通過有向DFS進(jìn)行RFG的構(gòu)成。在步驟1500開始構(gòu)造。在步驟1503初始化,將節(jié)點(diǎn)″n″設(shè)定成″開始″節(jié)點(diǎn)。在步驟1506,將節(jié)點(diǎn)″n″推上棧。在步驟1509,讀出節(jié)點(diǎn)′n″作為該棧頂上的值,在步驟1512,確定邊緣″e″為作為節(jié)點(diǎn)″n″的下一個離開邊緣,以便檢查。如果不再剩有離開邊緣,以步驟1539繼續(xù)該方法。否則,如果″e″為零,以步驟1512重新開始該方法。否則,在步驟1515將″c″賦值給邊緣″e″的級別。在步驟1518。將″s″設(shè)定成″c″的SESE鏈。如果某些其它邊緣目前在級別″c″中有效,這樣將為非零。如果″s″為零,步驟1521設(shè)定″c″的SESE鏈以″e″開始;否則,在步驟1524將″e″附加到″s″的尾端。在任意一種情況下,步驟1527將″n設(shè)定成邊緣″e″到達(dá)的節(jié)點(diǎn)。如果仍未訪問″n,則將″n″設(shè)定成″n,并以步驟1506重新開始該方法。否則,已訪問″n并在步驟1533查看″s″是否為零。如果是這樣,由于多于一個邊緣的SESE鏈將不由″e″形成,將″c″的SESE鏈設(shè)定回零。然后,或者如果其不是零,以步驟1512重新開始該步驟。在步驟1539,節(jié)點(diǎn)″n″從棧退出。如果棧是空的,則在步驟1542完成該構(gòu)成。如果不是,則在步驟1545將節(jié)點(diǎn)″n″設(shè)定成棧頂上的新元素。在步驟1548,設(shè)″e″作為隨后進(jìn)入節(jié)點(diǎn)″n″的邊緣。步驟1551設(shè)″c″為″e″的級別,步驟1554設(shè)″s″為″c″的SESE鏈。如果″e″不是″s″中的第一元素,將在以后簡化該SESE鏈,以步驟1512繼續(xù)控制。如果″e″是″s″中的第一元素,由于以后能為同一級別構(gòu)成新SESE鏈,在步驟1560設(shè)定″c″的SESE鏈為零。雖然在分析并不重要,可以表明,為給定的級別最多建立兩個SESE鏈。在步驟1563,查看″s″是否僅有一個元素。如果肯定,除非″e″是可簡化為1的邊緣,否則不產(chǎn)生其SESE鏈;在步驟1566進(jìn)行該判斷。如果″e″不能簡化成1,以步驟1512繼續(xù)控制。如果是,則在步驟1569進(jìn)行以″s″為特征的整個邊緣集合的簡化。通過從原始上下文解開第一和最后邊緣,構(gòu)成插入到原始上下文中的新邊緣可實(shí)現(xiàn)該目的。新邊緣用″s″表示。以步驟1512繼續(xù)該控制。最終,在步驟1563確定″s″具有多于一個元素,該方法再次沿步驟1569進(jìn)行。上述方法和裝置的應(yīng)用對過程內(nèi)控制流程分析和過程間控制流程兩者都有用,構(gòu)造函數(shù)作為SESE塊以使基于SESE塊的等級結(jié)構(gòu)適用于兩類問題。兩種情況之間的區(qū)別在于在過程內(nèi)控制流程分析的情況下,該圖總是向有限深度擴(kuò)展。這些方法適用于有控制流程或數(shù)據(jù)流程的任何問題。對出現(xiàn)循環(huán)或其它返回流程的那些問題也有用。對可用等級方式表示控制流程圖的有效分?jǐn)?shù)的那些問題特別有用。已結(jié)合在此公開的優(yōu)選實(shí)施例描述了本發(fā)明的方法和裝置。雖然在此已結(jié)合其特定變化詳細(xì)示出和描述了本發(fā)明的實(shí)施例,本領(lǐng)域的技術(shù)人員結(jié)合本發(fā)明的說明可很容易構(gòu)成許多其它改進(jìn)的實(shí)施例。因此,本發(fā)明不局限于在此所述的具體形式,反之,其意圖是覆蓋可合理地包括在本發(fā)明精神和范圍內(nèi)的替換、改進(jìn)和等同。圖34是說明從圖1的控制流程圖分為SESE和SEZE區(qū)的控制圖。區(qū)82是一個包含圖1中所有控制流程節(jié)點(diǎn)的單進(jìn)/單出(SESE)區(qū)。單進(jìn)在x和節(jié)點(diǎn)″a″52之間的邊緣1上。單出在節(jié)點(diǎn)″j″68和″y″之間的邊緣13上。SESE區(qū)82包含兩個內(nèi)部SESE區(qū)78和80。SESE區(qū)78包含節(jié)點(diǎn)″b″52、″c″54、″d″56、和″e″58。進(jìn)入SESE區(qū)78的入口在節(jié)點(diǎn)″a″50和節(jié)點(diǎn)″b″52之間的邊緣2上。從SESE區(qū)78的出口在節(jié)點(diǎn)″e″58和節(jié)點(diǎn)″f″60之間的邊緣7上。SESE區(qū)78包含包括節(jié)點(diǎn)″c″54的SESE區(qū)70和包括節(jié)點(diǎn)″d″56的SESE區(qū)72。邊緣3將節(jié)點(diǎn)″b″52連到節(jié)點(diǎn)″c″54。邊緣4將節(jié)點(diǎn)″b″52連到節(jié)點(diǎn)″d″56。邊緣5將節(jié)點(diǎn)″c″54連到節(jié)點(diǎn)″e″58。邊緣6將節(jié)點(diǎn)″d″56連到節(jié)點(diǎn)″e″58。SESE區(qū)80包含節(jié)點(diǎn)″f″60、″g″62、″h″64、和″i″66。進(jìn)入SESE區(qū)80的入口在節(jié)點(diǎn)″e″58和節(jié)點(diǎn)″f″60之間的邊緣7上。從SESE區(qū)80的出口在節(jié)點(diǎn)″i″66和節(jié)點(diǎn)″j″68之間的邊緣12上。SESE區(qū)80包含包括節(jié)點(diǎn)″g″62的SESE區(qū)74和包括節(jié)點(diǎn)″h″64的SESE區(qū)76。邊緣8將節(jié)點(diǎn)″f″60連到節(jié)點(diǎn)″g″62。邊緣9將節(jié)點(diǎn)″f″60連到節(jié)點(diǎn)″h″64。邊緣10將節(jié)點(diǎn)″g″62連到節(jié)點(diǎn)″i″66。邊緣11將節(jié)點(diǎn)″h″64連到節(jié)點(diǎn)″i″66。圖35說明用簡化流程圖(RFG)確定在何處加工由圖34中說明的控制流程圖表示的代碼??刂屏鞒虉D的初始超邊緣82在邊緣1和13之間(表示為″113″)。它簡化成到節(jié)點(diǎn)″a″50的輸入邊緣1、從節(jié)點(diǎn)″a″50到節(jié)點(diǎn)″j″68的超邊緣[27;712]84,從節(jié)點(diǎn)″j″68返回節(jié)點(diǎn)″a″50的返回邊緣14,和從節(jié)點(diǎn)″j″68的輸出邊緣13。超邊緣[27;712]84由兩個結(jié)合的分量,即超邊緣[27]78,和超邊緣[712]80組成。超邊緣[27]78由進(jìn)入節(jié)點(diǎn)″b″52的輸入邊緣2、節(jié)點(diǎn)″b″52和節(jié)點(diǎn)″e″58之間的超邊緣[35]70和[46]72、以及離開邊緣7組成。超邊緣[712]80由進(jìn)入節(jié)點(diǎn)″f″60的輸入邊緣7、節(jié)點(diǎn)″f″60和節(jié)點(diǎn)″i″66之間的超邊緣[810]74和[911]76、以及離開邊緣12組成。超邊緣[35]70由進(jìn)入節(jié)點(diǎn)″c″54的輸入邊緣3和離開該節(jié)點(diǎn)的離開邊緣5組成。超邊緣[46]72由進(jìn)入節(jié)點(diǎn)″d″56的輸入邊緣4和離開該節(jié)點(diǎn)的離開邊緣6組成。超邊緣[810]74由進(jìn)入節(jié)點(diǎn)″g″62的輸入邊緣8和離開該節(jié)點(diǎn)的離開邊緣10組成。超邊緣[911]76由進(jìn)入節(jié)點(diǎn)″h″64的輸入邊緣9和離開該節(jié)點(diǎn)的離開邊緣11組成。圖36是將編序插入由圖34中的控制流程圖表示的代碼的流程圖。在步驟1750進(jìn)入該程序并在步驟1752檢查裸邊緣。如果步驟1752存在裸邊緣,該程序在步驟1754退出作為循環(huán)。否則,在步驟1756針對一個鏈中的每個鏈接″L″進(jìn)入一個循環(huán)。在步驟1758進(jìn)入內(nèi)部循環(huán),對于步驟1758″L″中的每個邊緣″e″,在步驟1760遞歸地編序″e″。只要存在下一個邊緣″e″,則在步驟1762重復(fù)該過程。否則,在步驟1764,在內(nèi)部循環(huán)結(jié)尾,為返回邊緣入口檢查″L″的第一節(jié)點(diǎn)。如果在步驟1764未發(fā)現(xiàn)返回邊緣入口,步驟1768為其鏈中的鏈接L賦值新索引尺寸,在步驟1770由代碼擴(kuò)充離開L第一節(jié)點(diǎn)的每個邊緣,以向其索引賦值。在任何情況下,步驟1766檢查鏈中的下一個鏈接L,如果存在下一個鏈接L則重復(fù)外部循環(huán)。否則,當(dāng)不再留有鏈接時從該鏈進(jìn)行處理,步驟1772在SESE鏈的結(jié)尾插入計(jì)數(shù)器增量,在步驟1774完成并退出該程序。圖37是說明圖1所示的控制流程圖加入編序代碼的示意圖。由于節(jié)點(diǎn)″a″50有返回邊緣14作為輸入邊緣,不編序超邊緣[113]82。由于沒有返回邊緣進(jìn)入其第一節(jié)點(diǎn),編序超邊緣[27;712]84。超邊緣[27;712]84由所連接的超邊緣[27]78和超邊緣[712]80組成。回來參考圖36,鏈L包含兩個超邊緣[27]78和超邊緣[712]80。在步驟1764,二者都沒有輸入返回邊緣,因此在步驟1768為鏈中兩個鏈接的每一個賦給新索引尺度。索引X1賦值給超邊緣[27]78,索引X2賦值給超邊緣[712]80。超邊緣[27]78包括節(jié)點(diǎn)″b″52和節(jié)點(diǎn)″e″58之間的超邊緣[35]70和[46]72。離開超邊緣[35]70中節(jié)點(diǎn)″b″52的第一邊緣是進(jìn)入節(jié)點(diǎn)″c″54的邊緣3。步驟1770向邊緣3插入向索引X1賦零(0)值的賦值語句55。離開超邊緣[46]72中節(jié)點(diǎn)″b″52的第一邊緣是進(jìn)入節(jié)點(diǎn)″d″56的邊緣4。在步驟1770向邊緣4插入向索引X1賦一(1)值的賦值語句57。由于所有較低等級的邊緣完全由″裸邊緣″組成,在步驟1752不再將編序插入超邊緣[27]78。類似地編序超邊緣[712]80,使向索引X2賦零(0)值的賦值語句63插入邊緣8,向索引X2賦一(1)值的賦值語句65插入邊緣9。在步驟1766當(dāng)鏈中不再有鏈接時,步驟1774,在SESE鏈結(jié)尾插入計(jì)數(shù)器增量。這種情況下,隨著其離開超邊緣[712]80中的最后節(jié)點(diǎn)將計(jì)數(shù)器增量指令67插入邊緣12。該語句在計(jì)數(shù)器(″CRT″)二維矩陣中的計(jì)數(shù)器入口增加(CRT[X1X2++),該計(jì)數(shù)器由步驟1768賦值的兩個索引來索引。應(yīng)該理解,上述編序是針對易于公開的兩個雙向″分支和結(jié)合″情況實(shí)施的。其對應(yīng)于下列形式的C代碼if(exp1){<node″c″54statements>}else{<node″d″56statements>}if(exp2){<node″g″62statements>}else{<node″h″64statements>}圖36所示流程圖即不限于兩個SESE部分,也不限于雙向″分支和連接″代碼。在編序大于兩個代碼部分的情況下,在步驟1768對附加索引變量X3和X4等賦值,并在步驟1772用作計(jì)數(shù)器陣列索引。在超邊緣分解成大于兩個路徑的情況下,可在步驟1770賦予索引變量附加值。這將是對應(yīng)于選擇語句的許多情況。另外,在圖37中的67增加計(jì)數(shù)器的二維陣列。通過可提供的用于將二、三、四等維數(shù)的數(shù)組基準(zhǔn)轉(zhuǎn)換成一維向量基準(zhǔn)的已知計(jì)算機(jī)科學(xué)技術(shù)對其再次說明。第二,示出編序的單窗口。多個索引X1和X2等的使用允許實(shí)施編序的移動窗口。例如,可由索引變量X1、X2和X3索引CNTR1,可由索引變量X2,X3和X4等索引CNTR2。由于在關(guān)聯(lián)非相鄰執(zhí)行路徑中經(jīng)常來到減返點(diǎn),這是有用的。對于圖1中以圖2描述的特定執(zhí)行順序表示的流程圖,圖37中描述的編序代碼將使這些值賦給分配在圖35中標(biāo)為項(xiàng)84的SESE鏈27;712的四個計(jì)數(shù)器,如下面的表T-1另外,假設(shè)圖37中未示出的附加編序生成表T-2所示的下列附加計(jì)數(shù)</tables>編序和計(jì)數(shù)這些簡單的邊緣計(jì)數(shù)(與相關(guān)邊緣計(jì)數(shù)CTR[i][j]相對)的各種方法在現(xiàn)有技術(shù)中很好理解。通過生成相關(guān)計(jì)數(shù)的編序,下一步驟是用該信息生成更好的目標(biāo)代碼布局。圖38描述如何使用該分布,而圖42描述如何使用復(fù)制以改進(jìn)可使用圖38描述的方法布置的控制流程圖。原始程序的整個控制流程圖已表示為簡化流程圖(RFG),圖38描述的分布方法遞歸地分析該流程圖以尋找在SESE/SEZE鏈中布置基本程序塊的方式。SESE/SEZE鏈包括一個或多個鏈接,每個鏈接是一個SESE區(qū)(除SEZE鏈中的最后一個將是SEZE區(qū))。在RFG中,每個超邊緣或者是一個原始邊緣或是一個SESE/SEZE鏈。圖38所述分布方法的目的是針對每個SESE/SEZE鏈構(gòu)成基本程序塊的一個主節(jié)點(diǎn)鏈P,該主節(jié)點(diǎn)鏈P從入口節(jié)點(diǎn)通往出口節(jié)點(diǎn)(SESE鏈)或從入口節(jié)點(diǎn)到不能進(jìn)一步加入任何東西的點(diǎn)(SESE鏈),并設(shè)定重要程度不同的、包括在SESE/SEZE鏈中的節(jié)點(diǎn)但不是主節(jié)點(diǎn)鏈P中的節(jié)點(diǎn)的輔助節(jié)點(diǎn)鏈的集合Si。主節(jié)點(diǎn)鏈P描述每個基本程序塊根據(jù)所有基本程序塊所依據(jù)的頻率計(jì)數(shù)被放置在一個最好位置的基本程序塊的次序。Si鏈的重要程度不同;通常S1鏈的使用比S2鏈多,使用最少的鏈?zhǔn)荢n。在一般應(yīng)用中,2或3個輔助鏈將滿足。為使該討論清楚起見,我們僅使用一個輔助鏈。通過將每個節(jié)點(diǎn)放入與通往被插入輔助鏈的節(jié)點(diǎn)的邊緣有關(guān)的計(jì)數(shù)數(shù)量有關(guān)的輔助鏈簡單地?cái)U(kuò)展到多個輔助鏈。例如,大量使用的節(jié)點(diǎn)(邊緣計(jì)數(shù)大于1%)將進(jìn)入S1,較少使用的節(jié)點(diǎn)進(jìn)入S2,在編序執(zhí)行中實(shí)際上不使用的節(jié)點(diǎn)進(jìn)入S3。該目的是通過將RFG從每個SESE/SEZE區(qū)遞歸地遞降到包括其本身的超邊緣并針對這些邊緣的每一個構(gòu)成主和輔助集合實(shí)現(xiàn)的。一旦可獲得為該區(qū)構(gòu)成的主和輔助集合,用深度優(yōu)先搜索為該區(qū)基本上構(gòu)成最好的主路徑和輔助集合。在下面的段落中對此進(jìn)行了描述。在作為裸邊緣或SESE/SEZE鏈的超邊緣上調(diào)用圖36。在步驟1572,啟動布置超邊緣的方法。在步驟1574,將主和輔助鏈初始化為空鏈。如果超邊緣是一裸邊緣(因此而不包含節(jié)點(diǎn)),這正是其所需要的,該方法在步驟1576返回這些空鏈。否則,該邊緣是一個SESE/SEZE鏈并且該方法以步驟1578繼續(xù)。步驟1578開始在SESE/SEZE鏈中向下行進(jìn)到每個鏈接L。首先必須進(jìn)行的是為到鏈接L內(nèi)部的所有超邊緣進(jìn)行分析。在步驟1580,從鏈接L選擇下一個超邊緣。然后,在步驟1582在該邊緣上調(diào)用(遞歸地)圖38的方法,結(jié)果是為超邊緣e評估主P[e]和輔助S[e]節(jié)點(diǎn)。在步驟1584,如果可提供另一個超邊緣,該方法重復(fù)如步驟1580開始描述的調(diào)用,如果不能進(jìn)一步提供超邊緣,以步驟1586繼續(xù)該方法。到已評估步驟1586時,L中每個超邊緣e已確定了其主和輔助節(jié)點(diǎn)鏈。在步驟1586,用圖39描述的方法尋找從輸入到輸出的最好主路徑。從構(gòu)成的邊緣的主路徑構(gòu)成該主路徑。在主路徑的構(gòu)成中,可出現(xiàn)兩種可能的狀態(tài)。第一,由到L的輸入邊緣進(jìn)入的基本程序塊沒有進(jìn)入其的返回邊緣。這種情況下,由與替換前面的節(jié)點(diǎn)有關(guān)的CTR值確定待加入的第一節(jié)點(diǎn)。具體地說,如果對應(yīng)于索引值i1和i2的鏈接已被加到該鏈,索引值i3則對應(yīng)于當(dāng)前鏈接,對應(yīng)于剩余鏈接的索引值是i4和i5,每個候選節(jié)點(diǎn)i3的等級是r(i3)=∑CTR[i1][i2][i3][i4][i5]其中僅在隨后的索引值的范圍內(nèi)求和;這種情況下是在i4和i5的范圍內(nèi)。i1和i2的值是從已被布置好的該超邊緣中較早的鏈接中選擇的那些值。另一方面,如果有返回邊緣,由于沒有與該鏈接L相關(guān)的索引值,則完全由圖39確定待加入的第一節(jié)點(diǎn)。一旦步驟1586為鏈接L確定主路徑P[L]后,步驟1588確定可從另一個深度優(yōu)先索搜索中剩余主路徑P[e]構(gòu)成的最好輔助順序并通過輔助順序S[e]連接這些順序以形成S[L]。在步驟1592,將為該鏈接形成的PL連接到從前面的鏈接形成的P上,并將為該鏈接形成的S[L]連接到從前面的鏈接形成的S上。在步驟1592,如果鏈中剩有另一個鏈接,以步驟1578繼續(xù)控制。否則,已計(jì)算必要的P和S并在步驟1594返回。作為說明,表T-3中說明處理圖35的RFG采用的步驟</tables></tables>在該表中,第一列表示執(zhí)行操作的順序,第二列表示哪個賦值到主或輔助鏈,第三列表示在圖38的方法中進(jìn)行該賦值的步驟。圖39描述尋找″開始″和″目標(biāo)″兩個節(jié)點(diǎn)之間最佳路徑的尋找最佳路徑程序。最佳路徑是指該邊緣上任何邊緣閾值的最低值為最大的路徑。這些節(jié)點(diǎn)之間的任何其它路徑將具有至少一個閾值比最佳路徑上任何邊緣上最低閾值低的邊緣。邊緣(或超邊緣)的閾值是經(jīng)過邊緣次數(shù)的計(jì)數(shù)(對于超邊緣是通往超邊緣的裸邊緣次數(shù)的計(jì)數(shù))。尋找最佳路徑程序通過重復(fù)尋找路徑上任何邊緣上的最小閾值超過給定值的路徑獲得最佳路徑。該方法通過改變閾值,使用二進(jìn)制搜索策略搜索最佳路徑。首先,尋找最佳路徑程序獲得該區(qū)中所有邊緣閾值的值(步驟1632)。找出該不同閾值的數(shù)量″n″T1、T2、T3、…Tn。以值遞增順序列出這些值,T1是最低閾值,Tn是最高閾值。搜索最佳閾值使用兩個運(yùn)行指示符,以限定步驟1634初始化的搜索范圍,即″低″和″高″。首先,搜索最佳路徑的范圍以″低″值1(一)(表示閾值T1)和表示閾值Tn的″高″值″n″開始。然后,該程序通過依次尋找路徑并限定范圍重復(fù)一個循環(huán),直到僅有一個閾值出現(xiàn)在″低″和″高″之間的范圍內(nèi)(步驟1636)。給定閾值的測試在處在該范圍中間的閾值開始(步驟1638)。這就是閾值T試算。該搜索應(yīng)用圖40描述的DFS尋找路徑方法(步驟1640),以找出所有邊緣的閾值超過T試算的路徑,如果找出這樣的路徑,通過使T試算為該范圍的新″低″端限定搜索范圍(步驟1644)。另一方面,如果不存在這樣的路徑,表明T試算的閾值太高。通過在步驟1642使范圍的″高″端作為閾值索引(試算-1)的值限定該范圍。當(dāng)該范圍被限定到一個閾值時執(zhí)行步驟1646。步驟1646執(zhí)行一個最終的DFS尋找路徑調(diào)用,以設(shè)定全程變量Path為最佳路徑。圖40描述尋找從變元節(jié)點(diǎn)″n″到目標(biāo)節(jié)點(diǎn)的路徑以使路徑中的所有邊緣具有超過T試算的閾值的尋找DFS路徑程序。尋找DFS路徑程序使用遞歸深度優(yōu)先搜索方法尋找路徑。T試算是一個全程變量。由全程變量表示目標(biāo)節(jié)點(diǎn)Target。首先,尋找DFS路徑將從目前在路徑尾端的節(jié)點(diǎn)通往上方并包括節(jié)點(diǎn)″n″的主節(jié)點(diǎn)鏈加到構(gòu)成中的路徑(步驟1602)。該路徑表示為全程變量″Path″。然后,尋找DFS路徑方法查看是否已到達(dá)目標(biāo)(步驟1604)。如果肯定,則通知通過初始化全程變量″Found″已發(fā)現(xiàn)路徑(步驟1606)并返回調(diào)用者。全程變量Path包含所發(fā)現(xiàn)的路徑(步驟1608)。如果仍未到達(dá)該目標(biāo),該方法通過試圖尋找″n″的所有后繼塊之后的路徑隨該搜索繼續(xù)進(jìn)行(步驟1610)。測試候選后繼塊以確定其已不在該上路徑(步驟1612)。如果否定,則進(jìn)行測試以察看其閾值是否超過所要求的最小值T試算(步驟1614)。如果肯定,該方法遞歸地調(diào)用其自身,以查看該后繼塊之后是否有路徑(步驟1616)。如果發(fā)現(xiàn)一個路徑(步驟1618),該程序返回(步驟1624)。如果沒有,則嘗試下一個后繼塊(步驟1620)。如果已嘗試所有后繼塊,則表明不存在路徑。將節(jié)點(diǎn)″n″與步驟1602加入的所有節(jié)點(diǎn)一起從全程變量″Path″清除(步驟1622),并該程序返回(步驟1624)。在步驟1602設(shè)定為零的全程變量″Found″的值保持不變,以表明未發(fā)現(xiàn)路徑。圖41描述尋找DFS其它路徑程序的操作,通過該區(qū)尋找剩余路徑。這些路徑是除該區(qū)中最佳路徑之外的路徑。該程序還使用遞歸深度優(yōu)先程序構(gòu)成路徑。首先,認(rèn)為最佳路徑中的所有節(jié)點(diǎn)為″已使用″。全程變量Path保持所構(gòu)成的路徑。用變元節(jié)點(diǎn)″n″調(diào)用該方法并從″n″尋找剩余路徑。首先查看節(jié)點(diǎn)″n″是否已被使用(步驟1702)。如果否定,將″n″加入該全程Path并將″n″標(biāo)為已使用(步驟1704)。在兩種情況下,訪問″n″后所有未訪問的后繼塊以構(gòu)成該路徑(步驟1706)。該步驟是通過對″n″的每一個未訪問后繼塊的尋找DFS其它路徑的遞歸調(diào)用進(jìn)行的(步驟1708)。如果沒有″n″的未訪問后繼塊,則表示已構(gòu)成另一路徑并被存儲在全程變量Path中。該路徑附加到包含所有剩余路徑的全程變量Si(步驟1710)。重新初始化全程變量Path作為空路徑,以便在該調(diào)用返回之后由尋找DFS其它路徑的其它遞歸調(diào)用構(gòu)成(步驟1712)。圖42描述確定如何進(jìn)行SESE鏈復(fù)制的方法。復(fù)制目的是生成特定基本程序塊的復(fù)制件,以便能不必采用類似分支構(gòu)成較長的基本程序塊順序。圖42說明的程序說明僅復(fù)制一個鏈。僅在嵌套SESE鏈集合中的最低級、遞歸地在所有級直接應(yīng)用該方法,或僅在特定深度之下直接應(yīng)用該方法??墒褂们懊鎴D39說明的遞歸流程并返回具有值1加該區(qū)中包含的任何超邊緣e的最高深度的深度指示符的直接方式實(shí)現(xiàn)它們中的任何一種。然后,該深度值選通是否根據(jù)上面或類似方案進(jìn)行復(fù)制。一般來說,對于某些已生成一組計(jì)數(shù)器CTR[i1][i2]...[in]的in和執(zhí)行程序,一個SESE/SEZE鏈將包含一組鏈接。該部分的目的地用這些計(jì)數(shù)器確定應(yīng)復(fù)制鏈中開始SESE鏈接的節(jié)點(diǎn)或基本程序塊中哪一個,如果有的話。仍未對具有進(jìn)入節(jié)點(diǎn)的返回邊緣的那些節(jié)點(diǎn)或基本程序塊編序,并且不考慮對其進(jìn)行復(fù)制。該方法規(guī)定必須超過校正分支中測量的預(yù)定閾值性能改善,以便復(fù)制一個節(jié)點(diǎn)。執(zhí)行分級的順序;在節(jié)點(diǎn)的每個分級中,如果有的話,確定超過該閾值最多的節(jié)點(diǎn)。在該分級結(jié)尾,如果存在這樣的節(jié)點(diǎn),則將該節(jié)點(diǎn)標(biāo)為用于復(fù)制。如果不存在這樣的節(jié)點(diǎn),該分析結(jié)束。該程序以步驟1660開始。在步驟1662,所有鏈接標(biāo)為未復(fù)制,并確定一個適當(dāng)?shù)娜涕撝?。通常,該閾值是整個程序執(zhí)行的某些計(jì)數(shù)標(biāo)準(zhǔn)的預(yù)定百分比或分?jǐn)?shù)。在步驟1664,通過設(shè)定閾值為全程閾值并設(shè)定候選鏈接為零初始化用于新復(fù)制節(jié)點(diǎn)的搜索。在步驟1666,尋找鏈中的鏈接R。如果不再有鏈接,以步驟1676繼續(xù)該方法。否則,在步驟1668,選擇鏈中新的未復(fù)制鏈接r。如果不再發(fā)現(xiàn)鏈接,在步驟1666尋找另一個鏈接R。否則,在步驟1670計(jì)算如果復(fù)制鏈接r應(yīng)獲得的校正分支中的增量如下已復(fù)制的[r;R]=∑max(∑′CTR[i1][i2][i3]...[alt.1]...[in],∑′CTR[i1][i2][i3]...[alt.2]...[in])未復(fù)制的[r;R]=∑max(∑″CTR[i1][i2][i3]...[alt.1]...[in],∑″CTR[i1][i2][i3]...[alt.2]...[in])增量[r;R]=已復(fù)制的[r;R]-未復(fù)制的[r;R]其中∑為在被進(jìn)行復(fù)制的現(xiàn)有索引(包括已復(fù)制的[r;R]中的ir而不包括未復(fù)制的[r;R]中的ir)的范圍內(nèi)求和,∑′為在未進(jìn)行復(fù)制的索引之后的索引和之前的索引的范圍內(nèi)求和,針對結(jié)束R中第一節(jié)點(diǎn)的分支在各種替換[alt.1]范圍采用最大值。該計(jì)算假設(shè)R中第一節(jié)點(diǎn)僅有雙向分支。由于如果存在大于兩個替換,將可能使用表轉(zhuǎn)移(jump),這對跟隨其的后續(xù)代碼明顯不利,因此,該計(jì)算是合理的。在更有效地出現(xiàn)多個轉(zhuǎn)移的體系中,這些等式的擴(kuò)展是直接的。在步驟1672,確定該增量是否超過局部閾值。如果未超過,在步驟1668選擇新的現(xiàn)有未復(fù)制區(qū)r。如果超過,鏈接r變成候選區(qū),并且其在校正分支中的增量設(shè)定該新局部閾值。在步驟1676,查看任何候選區(qū)是否合格。如果肯定,在步驟1664將該候選區(qū)標(biāo)為用于復(fù)制并搜索另一個鏈以便重新復(fù)制。否則,結(jié)束對該鏈的分析。雖然該分析有時僅在兩兩改進(jìn)時使用,它可直接分析所有后續(xù)復(fù)制鏈上的利益。通過上面表T-1所示計(jì)數(shù)說明圖35的SESE鏈27;712的計(jì)算CTR=4CTR[1]=1CTR[1]=0CTR[1][1]=4僅檢查一對[r;R],即[27;712]。該計(jì)算給出已復(fù)制的[27;712]=max(4,1)+max(0,4)=8未復(fù)制的[27;712]=max(4+1,4+0)=5。應(yīng)指出,第一種情況中,與27對應(yīng)的索引范圍內(nèi)的和在已復(fù)制總和中的最大值之外和未復(fù)制總和中的最大值之內(nèi)。這種情況下,因復(fù)制造成的校正分支預(yù)測中的增量為增量[27;712]=3。假設(shè)該增量滿足全程閾值,跟隨SESE區(qū)27的第一節(jié)點(diǎn)之后的代碼將被向下復(fù)制到跟隨SESE區(qū)712的下一個連接點(diǎn)。通過圖34至37所示程序編序技術(shù)獲得的優(yōu)點(diǎn)之一是允許貫穿待識別代碼的不同″分支和連接″部分的不同分支之間之間運(yùn)行時間的從屬性。例如,圖3中的通信量統(tǒng)計(jì)導(dǎo)致圖5所示的最優(yōu)化。然而,該優(yōu)化不考慮不同分支之間運(yùn)行時間的交互作用。如果不同路徑和分支之間存在相關(guān)或交互作用,圖5所示優(yōu)化可能是次最優(yōu)化。上面的表T-1示出通往該代碼的四條可能路徑的理想業(yè)務(wù)量計(jì)數(shù)。下面的實(shí)例使用表T-1的業(yè)務(wù)統(tǒng)計(jì)說明圖5中的最優(yōu)化如何可能成為次最優(yōu)化。在路徑bce(超邊緣[35]70)和fgi(超邊緣[810]74)之間以及路徑bde(超邊緣[46]72)和fhi(超邊緣[911]76)之間存在緊密相關(guān)。當(dāng)路徑bce(超邊緣[35]70)連接到路徑fhi(超邊緣[911]76)作為最佳路徑時,該相關(guān)在圖5中遺漏。圖43是包括根據(jù)表T-1中的業(yè)務(wù)量計(jì)數(shù)從圖37說明的編序得到的復(fù)制路徑的控制流程圖。節(jié)點(diǎn)″e″58已被復(fù)制為節(jié)點(diǎn)e′58′和e″58″。節(jié)點(diǎn)″f″60已被復(fù)制為節(jié)點(diǎn)f′60′和f″60″。直線表示直通代碼(以節(jié)點(diǎn)″b″52與節(jié)點(diǎn)″c″54或節(jié)點(diǎn)″d″56之間必須有一個分支為前提),而虛線表示低頻交叉分支。使用表T-1的業(yè)務(wù)量統(tǒng)計(jì),采用路徑abce′fgi占九(9)分之四(4),采用路徑ade″f″hi占九(9)分之四(4),采用路徑abce″f″hi占九(9)分之一(1),不采用路徑abde′f′gi。與圖5所示現(xiàn)有技術(shù)的最優(yōu)化相反,表T-1中分別出現(xiàn)四(4)次的兩個高頻路徑abdefhi和abcefgi各需要兩條分支執(zhí)行。因此,很顯然,已根據(jù)本發(fā)明提供的軟件定序程序完全滿足要求和前面所述的優(yōu)點(diǎn)。雖然已參考其具體實(shí)施例描述和說明了本發(fā)明,本發(fā)明并不局限于所說明的這些實(shí)施例。本領(lǐng)域技術(shù)人員將認(rèn)識到,在不脫離本發(fā)明的情況下可對其進(jìn)行改進(jìn)和變化。例如這里所講的軟件可在計(jì)算機(jī)硬盤、軟盤、3.5″盤、計(jì)算機(jī)存儲磁帶、磁鼓、靜態(tài)隨機(jī)存取存儲器(SRAM)單元、動態(tài)隨機(jī)存取存儲器(DRAM)單元、電可擦(EEPROM、EPROM、閃光)單元、非易失單元、鐵電或鐵磁存儲器、密致盤(CD)、激光盤、光盤、和任何類似計(jì)算機(jī)可讀介質(zhì)。重要的是指出這里所講的矩陣所具有的行和列。很容易改變這些矩陣,以使行作為列和列作為行,由此使行運(yùn)算變成現(xiàn)在的列運(yùn)算等等。行和列的該普通置換不應(yīng)限于這里使用的″行″和″列″的含義。這里使用的術(shù)語″通道″表示矩陣的行和列是可互換的。因此,其意圖是本發(fā)明包括落入所附權(quán)利要求范圍內(nèi)的所有這類變化和改進(jìn)。權(quán)利要求1.一種用于排序在數(shù)據(jù)處理系統(tǒng)中執(zhí)行的計(jì)算機(jī)指令的方法,該方法特征在于包括步驟(a)在存儲器內(nèi)提供包含基本程序塊的計(jì)算機(jī)程序,其中每個基本程序塊至少包含一條計(jì)算機(jī)指令以及該計(jì)算機(jī)程序包含許多計(jì)算機(jī)指令;(b)通過從存儲器中讀取計(jì)算機(jī)指令執(zhí)行計(jì)算機(jī)程序和經(jīng)中央處理單元(CPU)執(zhí)行許多計(jì)算機(jī)指令;(c)在執(zhí)行步驟期間,在存儲器中存儲表示基本程序塊執(zhí)行次序的跟蹤數(shù)據(jù)文件,執(zhí)行次序表明何時按時相對于其它基本程序塊執(zhí)行任何基本程序塊,該執(zhí)行次序具有開始端和結(jié)束端;(d)從跟蹤數(shù)據(jù)文件選擇一系列M個基本程序塊形成一個所選的組,M是大于2的有限正整數(shù);(e)在存儲器中針對所選的組從跟蹤數(shù)據(jù)文件累積與M個基本程序塊順序有關(guān)的相關(guān)信息;(f)按所選組選擇M個基本程序塊的不同順序;(g)重復(fù)步驟(e)至(g)直到處理跟蹤數(shù)據(jù)文件中M個基本程序塊的所選數(shù)量的順序;和(h)使用經(jīng)步驟(e)至(g)獲得的相關(guān)信息以使基本程序塊按順序執(zhí)行。2.一種定序程序,用于對通過數(shù)據(jù)處理系統(tǒng)執(zhí)行的計(jì)算機(jī)指令定序,該定序程序存儲在計(jì)算機(jī)可讀介質(zhì)上,其特征在于用于初始化計(jì)算機(jī)存儲器中存儲的計(jì)算機(jī)程序執(zhí)行程序的計(jì)算機(jī)指令,通過從計(jì)算機(jī)存儲器讀取形成計(jì)算機(jī)代碼的基本程序塊并通過中央處理單元(CPU)執(zhí)行該計(jì)算機(jī)指令執(zhí)行該執(zhí)行程序;執(zhí)行執(zhí)行程序時用于在計(jì)算機(jī)存儲器中存儲表示基本程序塊執(zhí)行次序的跟蹤數(shù)據(jù)文件的計(jì)算機(jī)指令,該執(zhí)行次序表明何時按時相對于計(jì)算機(jī)程序中的其它基本程序塊執(zhí)行任何基本程序塊,該執(zhí)行次序具有開始端和結(jié)束端;用于從跟蹤數(shù)據(jù)文件重復(fù)選擇M個基本程序塊的不同順序以形成基本程序塊的所選組的計(jì)算機(jī)指令,M是大于2的有限正整數(shù),針對每個所選組中M個基本程序塊的每一個,在存儲器中為每個所選組的累加位于每個所選組中的基本程序塊之間的相關(guān)信息;和用于由計(jì)算機(jī)使用相關(guān)信息在執(zhí)行程序的執(zhí)行次序中對計(jì)算機(jī)程序的基本程序塊定序的計(jì)算機(jī)指令。3.數(shù)據(jù)處理系統(tǒng),其特征在于一個中央處理單元(CPU);耦合到該中央處理單元的計(jì)算機(jī)存儲器,其特征在于用于初始化存儲在計(jì)算機(jī)存儲器中的計(jì)算機(jī)程序的執(zhí)行程序的計(jì)算機(jī)指令,通過從計(jì)算機(jī)存儲器讀取形成計(jì)算機(jī)代碼的基本程序塊的計(jì)算機(jī)指令并通過中央處理單元(CPU)執(zhí)行該計(jì)算機(jī)指令來執(zhí)行該執(zhí)行程序;執(zhí)行該執(zhí)行程序時用于在計(jì)算機(jī)存儲器中存儲表示基本程序塊執(zhí)行次序的跟蹤數(shù)據(jù)文件的計(jì)算機(jī)指令,該執(zhí)行次序表明何時按時相對于計(jì)算機(jī)程序中的其它基本程序塊執(zhí)行任何基本程序塊,該執(zhí)行次序具有開始端和結(jié)束端;用于從跟蹤數(shù)據(jù)文件重復(fù)選擇M個基本程序塊的不同順序以形成基本程序塊的所選組的計(jì)算機(jī)指令,M是大于2的有限正整數(shù),針對每個所選組中M個基本程序塊的每一個,在存儲器中為每個所選組的累加位于每個所選組中的基本程序塊之間的相關(guān)信息;和用于由計(jì)算機(jī)使用相關(guān)信息在執(zhí)行程序的執(zhí)行次序中對計(jì)算機(jī)程序的基本程序塊定序的計(jì)算機(jī)指令。4.一種數(shù)據(jù)處理系統(tǒng),其特征在于用于初始化計(jì)算機(jī)存儲器中存儲的計(jì)算機(jī)程序執(zhí)行程序的裝置,通過從計(jì)算機(jī)存儲器讀取形成計(jì)算機(jī)代碼的基本程序塊并通過中央處理單元(CPU)執(zhí)行該計(jì)算機(jī)指令執(zhí)行該執(zhí)行程序;當(dāng)由所述用于執(zhí)行的裝置執(zhí)行該執(zhí)行程序時在計(jì)算機(jī)存儲器中存儲跟蹤數(shù)據(jù)文件的裝置,該跟蹤數(shù)據(jù)文件表示基本程序塊的執(zhí)行次序,該執(zhí)行次序表明何時按時相對于計(jì)算機(jī)程序中的其它基本程序塊執(zhí)行任何基本程序塊,該執(zhí)行次序具有開始端和結(jié)束端;用于從跟蹤數(shù)據(jù)文件重復(fù)選擇M個基本程序塊的不同順序以形成基本程序塊的所選組的裝置,M是大于2的有限正整數(shù),針對每個所選組中M個基本程序塊的每一個,在存儲器中為每個所選組的累加位于每個所選組中的基本程序塊之間的相關(guān)信息;和用于由計(jì)算機(jī)使用相關(guān)信息在執(zhí)行程序的執(zhí)行次序中對計(jì)算機(jī)程序的基本程序塊定序的裝置。5.一種定序可執(zhí)行代碼并將可執(zhí)行代碼大量制造到計(jì)算機(jī)可讀介質(zhì)上以改善計(jì)算機(jī)性能的方法,該方法特征在于包括步驟初始化計(jì)算機(jī)存儲器中存儲的計(jì)算機(jī)程序執(zhí)行程序,通過從計(jì)算機(jī)存儲器讀取形成計(jì)算機(jī)代碼的基本程序塊并通過中央處理單元(CPU)執(zhí)行該計(jì)算機(jī)指令執(zhí)行該執(zhí)行程序;執(zhí)行執(zhí)行程序時用于在計(jì)算機(jī)存儲器中存儲表示基本程序塊執(zhí)行次序的跟蹤數(shù)據(jù)文件,該執(zhí)行次序表明何時按時相對于計(jì)算機(jī)程序中的其它基本程序塊執(zhí)行任何基本程序塊,該執(zhí)行次序具有開始端和結(jié)束端;從跟蹤數(shù)據(jù)文件重復(fù)選擇M個基本程序塊的不同順序以形成基本程序塊的所選組,M是大于2的有限正整數(shù),針對每個所選組中M個基本程序塊的每一個,在存儲器中為每個所選組的累加位于每個所選組中的基本程序塊之間的相關(guān)信息;使用該相關(guān)信息定序計(jì)算機(jī)程序的基本程序塊,以形成可執(zhí)行的經(jīng)定序的計(jì)算機(jī)程序;和將可執(zhí)行的經(jīng)定序的計(jì)算機(jī)程序具體體現(xiàn)在一個或多個計(jì)算機(jī)可讀介質(zhì)上,由計(jì)算機(jī)執(zhí)行。6.一種用于排序在數(shù)據(jù)處理系統(tǒng)中執(zhí)行的計(jì)算機(jī)指令的方法,該方法特征在于包括步驟(a)在存儲器內(nèi)提供包含基本程序塊的計(jì)算機(jī)程序,其中每個基本程序塊至少包含一條計(jì)算機(jī)指令;(b)通過從存儲器讀取基本程序塊和經(jīng)中央處理單元(CPU)執(zhí)行基本程序塊來執(zhí)行計(jì)算機(jī)程序;(c)在執(zhí)行步驟期間,在存儲器中存儲表示基本程序塊執(zhí)行次序的跟蹤數(shù)據(jù)文件,執(zhí)行次序表明何時按時相對于其它基本程序塊執(zhí)行任何基本程序塊,該執(zhí)行次序具有開始端和結(jié)束端;(d)從跟蹤數(shù)據(jù)文件選擇一系列M個基本程序塊形成一個所選的組,M是大于2的有限正整數(shù);(e)在存儲器中針對所選的組從跟蹤數(shù)據(jù)文件累積與M個基本程序塊順序有關(guān)的相關(guān)信息;(f)按所選組選擇M個基本程序塊的不同順序;(g)重復(fù)步驟(e)至(g)直到處理跟蹤數(shù)據(jù)文件中M個基本程序塊的所選數(shù)量的順序;和(h)使用經(jīng)步驟(e)至(g)獲得的相關(guān)信息,以便通過有選擇地將相關(guān)信息排列在至少一個具有行和列矩陣(Wij)內(nèi),使用矩陣運(yùn)算分析至少一個矩陣以確定基本程序塊次序來排序連續(xù)執(zhí)行的基本程序塊。全文摘要一種在存儲器(24)中定序計(jì)算機(jī)指令的方法和裝置,通過經(jīng)CPU(22)執(zhí)行計(jì)算機(jī)指令并在存儲器(24)中生成一個跟蹤文件開始為中央處理單元(CPU)(22)提供多個指令的有效執(zhí)行。使用大于2的窗口尺寸(即每個窗口選擇大于兩個指令或基本程序塊/指令組)掃描跟蹤文件并確定每個窗口中數(shù)對指令之間的相關(guān)性(圖9和10)。然后分析(圖11)通過窗口程序獲得的相關(guān)性為任何目標(biāo)CPU連續(xù)執(zhí)行的計(jì)算機(jī)指令確定有效排序。文檔編號G06F11/34GK1176426SQ9710423公開日1998年3月18日申請日期1997年5月9日優(yōu)先權(quán)日1996年5月15日發(fā)明者小毛里西奧·布雷特尼茲,羅杰·A·史密斯申請人:摩托羅拉公司