專(zhuān)利名稱(chēng):一種基于高級(jí)中間表示的結(jié)構(gòu)優(yōu)化方法及系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于程序編譯優(yōu)化技術(shù)領(lǐng)域,具體涉及一種用于程序優(yōu)化的中間表示和關(guān) 聯(lián)的方法和系統(tǒng)。
背景技術(shù):
中間表示直接決定著編譯器的可擴(kuò)展性和優(yōu)化效果。從結(jié)構(gòu)上來(lái)看,中間表示一 般分為三種(1)結(jié)構(gòu)化的表示,這類(lèi)中間表示面向圖形,如樹(shù)、有向無(wú)環(huán)圖,通常用于源到 源的程序轉(zhuǎn)換;(2)線性的表示,偽代碼的表示形式,依據(jù)機(jī)器不同的抽象層而變換,通常 采用簡(jiǎn)單、緊湊的數(shù)據(jù)結(jié)構(gòu),易于重構(gòu),如SSA ; (3)混合的表示,是對(duì)前兩種表示的混合,試 圖獲取兩者的優(yōu)點(diǎn),如控制流圖。中間表示的最佳選擇依賴于具體應(yīng)用,沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)。 程序分析過(guò)程依賴程序的控制流和數(shù)據(jù)流信息,比如嵌套循環(huán)優(yōu)化和自動(dòng)并行識(shí)別需要識(shí) 別循環(huán)結(jié)構(gòu)和精確的數(shù)據(jù)流信息。0pen64編譯器定義了一種樹(shù)結(jié)構(gòu)的中間表示W(wǎng)HIRL。 WHIRL通過(guò)高級(jí)控制流結(jié)構(gòu),如IF、WHILE_D0、D0_L00P和GOTO/LABEL語(yǔ)句,顯式的表示控 制流信息;數(shù)據(jù)訪問(wèn)信息通過(guò)內(nèi)存訪問(wèn)語(yǔ)句,如LDID、I LOAD, STID、ISTORE等表示;WHIRL 有結(jié)構(gòu)化表示的優(yōu)點(diǎn),但不能顯式的表示數(shù)據(jù)流信息。對(duì)于優(yōu)化中的數(shù)據(jù)流信息,通常采用 SSA (Static Single Assignment)形式將程序變量重命名成不同的版本,每個(gè)版本有一個(gè) 靜態(tài)單一賦值語(yǔ)句,因此,變量的不同版本信息顯式的給出了引用-定義信息。SSA表示需 要依賴控制圖獲取程序的控制流信息,而WHIRL的優(yōu)勢(shì)在于能夠顯示的提供數(shù)據(jù)流信息, 無(wú)需構(gòu)建程序的控制流圖。因此本發(fā)明提出了一種基于高級(jí)中間表示的結(jié)構(gòu)WHIRL SSA的優(yōu)化方法,顯式地 表示程序控制流和數(shù)據(jù)流信息。WHIRL SSA在WHIRL節(jié)點(diǎn)上標(biāo)注SSA信息,繼承了 WHIRL表 示和SSA表示的優(yōu)點(diǎn),能夠提高編譯器的可擴(kuò)展性和優(yōu)化效果。
發(fā)明內(nèi)容
本發(fā)明的目的在于提供一種基于高級(jí)中間表示的優(yōu)化架構(gòu)WHIRL SSA的方法,以 便能顯式地表示程序控制流和數(shù)據(jù)流信息,提高編譯器的可擴(kuò)展性和優(yōu)化效果。本發(fā)明提出的基于高級(jí)中間表示的優(yōu)化架構(gòu)WHIRL SSA的方法,是將SSA信息標(biāo) 注在WHIRL樹(shù)形結(jié)構(gòu)中。它繼承了原有WHIRL的特點(diǎn)并與基于WHIRL的優(yōu)化實(shí)現(xiàn)兼容;同 時(shí),所有基于SSA的優(yōu)化都能從WHIRL SSA架構(gòu)中受益。具體步驟包括(I)WHIRL SSA的 生成;(2)PHI節(jié)點(diǎn)的插入;(3) WHIRL SSA的更新;(4) WHIRL SSA的驗(yàn)證。1. WHIRL SSA的生成 WHIRL SSA通過(guò)遍歷WHIRL節(jié)點(diǎn)生成SSA信息;并將SSA 信息插入到WHIRL結(jié)構(gòu)中。2. PHI節(jié)點(diǎn)的插入 將PHI節(jié)點(diǎn)插入到WHIRL結(jié)構(gòu)的合適位置。WHIRL SSA繼承了 WHIRL和SSA的優(yōu)點(diǎn),能夠同時(shí)顯式的表示控制流信息和數(shù)據(jù)流 信息。別名的定義/引用操作可以同標(biāo)量處理一樣。由于別名信息的不精確,導(dǎo)致很多分 析只能中止而作保守估計(jì),而WHIRL SSA有助于得到精確的別名信息。
4
3. WHIRL SSA的更新 WHIRL SSA可在小范圍內(nèi)更新并保持精度。相同精確的 信息可在不同的優(yōu)化階段提供給不同的優(yōu)化??朔藙e名情況下傳統(tǒng)的數(shù)據(jù)流信息不完整 以及SSA更新造成的精度丟失。由更新模塊完成。4. WHIRL SSA的驗(yàn)證對(duì)構(gòu)建的SSA信息以及更新后的SSA信息進(jìn)行正確性與一 致性的驗(yàn)證。由驗(yàn)證模塊完成。相應(yīng)于上述優(yōu)化方法的實(shí)現(xiàn)系統(tǒng),其總體架構(gòu)包括6個(gè)模塊WHIRL SSA管理模 塊、DU/UD管理模塊、更新模塊、驗(yàn)證模塊、生成模塊和讀寫(xiě)接口。模塊間的依賴關(guān)系見(jiàn)圖1 所示,即WHIRL SSA管理模塊分別與DU/UD管理模塊、更新模塊、驗(yàn)證模塊、生成模塊和讀寫(xiě) 接口連接。每個(gè)程序方法擁有一個(gè)指針,該指針指向包含該方法SSA信息的WHIRL SSA管理 模塊。WHIRL SSA管理模塊負(fù)責(zé)維護(hù)每個(gè)方法的SSA相關(guān)信息。SSA信息包含phi/chi/ mu/ver,存儲(chǔ)在多個(gè)表中。WHIRL節(jié)點(diǎn)和SSA之間的映射關(guān)系通過(guò)map結(jié)構(gòu)維護(hù)。map在生 成SSA信息或從WHIRL文件讀取SSA信息時(shí)進(jìn)行建立。依賴于同一個(gè)WN的phi節(jié)點(diǎn)通過(guò) PHI_LIST鏈接。WHIRL SSA管理模塊提供接口給生成模塊,用于決定WHIRL節(jié)點(diǎn)的類(lèi)型; 生成模塊依據(jù)全局優(yōu)化階段的符號(hào)表和SSA信息生成SSA符號(hào)表;驗(yàn)證模塊用來(lái)驗(yàn)證SSA 信息的正確性和一致性。當(dāng)程序轉(zhuǎn)換完成后,更新模塊可以在局部區(qū)域?qū)SA信息進(jìn)行更 新;DU/UD管理模塊負(fù)責(zé)維護(hù)數(shù)據(jù)流信息。讀寫(xiě)接口負(fù)責(zé)對(duì)WHIRL文件的SSA信息進(jìn)行讀 取或?qū)懟?。本發(fā)明將兩種中間表示的優(yōu)點(diǎn)揉合在一個(gè)優(yōu)化架構(gòu)中,并與原有的WHIRL結(jié)構(gòu)兼 容,提高WHIRL中間表示的信息表示能力。WHIRL SSA使得每個(gè)函數(shù)調(diào)用點(diǎn)擁有流敏感的上 下文信息抽象調(diào)用點(diǎn)的每個(gè)實(shí)參和全局變量,進(jìn)而能夠構(gòu)建標(biāo)量流敏感和上下文敏感的 調(diào)用圖,有利于展開(kāi)精確的過(guò)程間分析。過(guò)程間別名分析同樣能從WHIRL SSA受益,如“是 否χ和y別名”的問(wèn)題則轉(zhuǎn)化為“是否χ的i版本和y的j版本別名”的問(wèn)題。因而有利于 得到精確的別名信息。
圖1是WHIRL SSA的系統(tǒng)架構(gòu)圖。圖2是WHIRL SSA的phi插入處理過(guò)程。
具體實(shí)施例方式第一,WHIRLSSA 的生成
通過(guò)SSA生成器通過(guò)遍歷WHIRL節(jié)點(diǎn)生成SSA信息,包含phi節(jié)點(diǎn)、chi節(jié)點(diǎn)、mu節(jié) 點(diǎn)和變量的版本信息。最后將Phi節(jié)點(diǎn)、chi節(jié)點(diǎn)和mu節(jié)點(diǎn)插入到WHIRL樹(shù)中。正確位置 中chi表示變量定義信息,mu表示變量的引用信息。這樣別名的定義一引用信息被記錄在 chi和mu節(jié)點(diǎn)上。phi、chi和mu節(jié)點(diǎn)的版本信息記錄在各自的節(jié)點(diǎn)內(nèi)。第二,phi的插入處理
構(gòu)建SSA的一個(gè)重要步驟就是PHI節(jié)點(diǎn)的插入。為了保持與WHIRL表示的兼容,不引 入新的節(jié)點(diǎn),WHIRL SSA中的phi節(jié)點(diǎn)插入與傳統(tǒng)的SSA插入處理有所區(qū)別。phi被插入在
5結(jié)構(gòu)控制流(SCF)和標(biāo)號(hào)(標(biāo)號(hào)是多個(gè)goto的聚合節(jié)點(diǎn))的根節(jié)點(diǎn)上。這樣的插入策略 基于如下兩個(gè)原因=(I)Phi節(jié)點(diǎn)描述了整個(gè)SCF節(jié)點(diǎn)的副作用;(2)大部分SCF的聚合節(jié)點(diǎn) 之內(nèi)或之后沒(méi)有標(biāo)號(hào)。圖2是除Label語(yǔ)句之外的高層控制流結(jié)構(gòu)的phi節(jié)點(diǎn)插入處理圖示。1、對(duì)于IF結(jié)構(gòu),phi節(jié)點(diǎn)被插入在IF的WHIRL節(jié)點(diǎn)上。phi有兩個(gè)操作數(shù)第一 個(gè)操作數(shù)是THEN塊內(nèi)定義的版本信息,比如圖2(a)中的al,或在IF之前的活躍版本 ’另 一個(gè)是ELSE塊內(nèi)定義的版本,或當(dāng)ELSE內(nèi)無(wú)版本定義,則為IF之前的活躍版本。phi節(jié)點(diǎn) 的結(jié)果是IF之后活躍版本。2、對(duì)于WHILE_D0循環(huán)結(jié)構(gòu),phi的第一個(gè)操作數(shù)為WHILE_D0之前的活躍版本;第 二個(gè)操作數(shù)為循環(huán)體內(nèi)定義的最后版本;結(jié)果為WHILE_D0之后的活躍版本。3、對(duì)于D0_WHILE循環(huán),phi的操作數(shù)以及結(jié)果與WHILE_D0類(lèi)似。4、對(duì)于D0_L00P循環(huán),phi的第一個(gè)操作數(shù)為初始化定義的最后版本,若初始化 中無(wú)定義,則為循環(huán)前的活躍版本;第二個(gè)操作數(shù)為循環(huán)體和循環(huán)計(jì)數(shù)中定義的最后版本; 結(jié)果為循環(huán)結(jié)構(gòu)后的活躍版本。5、對(duì)于Label語(yǔ)句的phi插入處理與基于控制流圖的傳統(tǒng)phi插入處理類(lèi)似。第三,WHIRL SSA的更新
當(dāng)程序在優(yōu)化中被變換時(shí),SSA信息則需要更新。對(duì)于傳統(tǒng)的SSA優(yōu)化,WHIRL SSA的 更新可以采用傳統(tǒng)的SSA更新方法;在很多情況下,SSA更新困難且開(kāi)銷(xiāo)較大,通常采用重 新構(gòu)建SSA的策略。本發(fā)明采用對(duì)局部范圍的SSA重構(gòu),然后再和整體進(jìn)行合并,達(dá)到對(duì) SSA更新的目的。DU/UD的數(shù)據(jù)流信息也同樣在局部范圍內(nèi)重新計(jì)算。這樣的策略避免了 更新后SSA信息的不精確,并且使得DU/UD信息在分析過(guò)程中按需計(jì)算。對(duì)SSA的局部計(jì)算,有以下約定
1)被轉(zhuǎn)換的區(qū)域必須只有一個(gè)入口。如果有多個(gè)入邊,則插入phi節(jié)點(diǎn)。2)被轉(zhuǎn)換區(qū)域可以有多個(gè)出邊或是exit基本塊。3 )轉(zhuǎn)換過(guò)程不引入新的入口。4)轉(zhuǎn)換過(guò)程可以引入新的出邊,但不引入新的出邊目標(biāo)節(jié)點(diǎn)。有了上述條件,區(qū)域內(nèi)的變換影響范圍有限,兩個(gè)SSA子區(qū)域被合并后能夠保持 變量版本信息的一致。更新算法包含以下四個(gè)步驟
1)驗(yàn)證區(qū)域符合上述四個(gè)條件。2)在變換前,收集區(qū)域內(nèi)每個(gè)使用或定義符號(hào)的版本信息。3)轉(zhuǎn)換后,驗(yàn)證新的區(qū)域,在該區(qū)域內(nèi)重新計(jì)算SSA信息。在重命名階段,對(duì)變量 的版本號(hào)更新從該符號(hào)在變換前的最大版本開(kāi)始。4)最后,新區(qū)域樹(shù)合并到原始的根樹(shù)。通過(guò)對(duì)入口和輸出節(jié)點(diǎn)插入賦值語(yǔ)句實(shí)現(xiàn) 符號(hào)版本的一致。當(dāng)引入了新的出邊,則在出邊的目標(biāo)處插入Phi節(jié)點(diǎn)。第四,WHIRLSSA 驗(yàn)證
構(gòu)建WHIRL SSA或更新SSA信息都需要對(duì)WHIRL SSA的正確性和一致性進(jìn)行驗(yàn)證。正 確性包括所有變量的版本信息且版本號(hào)無(wú)重疊、控制流圖中的連接節(jié)點(diǎn)有Phi節(jié)點(diǎn)、mu/ chi列表構(gòu)建正確。一致性主要驗(yàn)證phi節(jié)點(diǎn)的操作數(shù)與WHIRL節(jié)點(diǎn)一致,且滿足phi的插 入規(guī)則。另外,還需要驗(yàn)證SSA版本的活躍區(qū)間無(wú)重疊。
權(quán)利要求
一種基于高級(jí)中間表示的結(jié)構(gòu)優(yōu)化方法,其特征在于具體步驟為(1)WHIRL SSA的生成;(2)PHI節(jié)點(diǎn)的插入;(3)WHIRL SSA的更新;(4)WHIRL SSA的驗(yàn)證。
2.根據(jù)權(quán)利要求1所述的基于高級(jí)中間表示的結(jié)構(gòu)優(yōu)化方法,其特征在于所述WHIRL SSA的生成的步驟為通過(guò)SSA生成器通過(guò)遍歷WHIRL節(jié)點(diǎn)生成SSA信息,包含phi節(jié)點(diǎn)、 chi節(jié)點(diǎn)、mu節(jié)點(diǎn)和變量的版本信息;最后將phi節(jié)點(diǎn)、chi節(jié)點(diǎn)和mu節(jié)點(diǎn)插入到WHIRL樹(shù) 中;正確位置中chi表示變量定義信息,mu表示變量的引用信息;別名的定義一引用信息被 記錄在chi和mu節(jié)點(diǎn)上;phi、chi和mu節(jié)點(diǎn)的版本信息記錄在各自的節(jié)點(diǎn)內(nèi)。
3.根據(jù)權(quán)利要求2所述的基于高級(jí)中間表示的結(jié)構(gòu)優(yōu)化方法,其特征在于所述phi節(jié) 點(diǎn)的插入是將Phi插入在結(jié)構(gòu)控制流(SCF)和標(biāo)號(hào)的根節(jié)點(diǎn)上。
4.根據(jù)權(quán)利要求3所述的基于高級(jí)中間表示的結(jié)構(gòu)優(yōu)化方法,其特征在于所述phi節(jié) 點(diǎn)的插入分下述幾種情形(1)對(duì)于IF結(jié)構(gòu),將phi節(jié)點(diǎn)插入在IF的WHIRL節(jié)點(diǎn)上;phi有兩個(gè)操作數(shù)第一個(gè) 操作數(shù)是THEN塊內(nèi)定義的版本信息,或在IF之前的活躍版本;另一個(gè)是ELSE塊內(nèi)定義的 版本,或當(dāng)ELSE內(nèi)無(wú)版本定義,則為IF之前的活躍版本;phi節(jié)點(diǎn)的結(jié)果是IF之后活躍版 本;(2)對(duì)于WHILE_D0循環(huán)結(jié)構(gòu),phi的第一個(gè)操作數(shù)為WHILE_D0之前的活躍版本;第二 個(gè)操作數(shù)為循環(huán)體內(nèi)定義的最后版本;結(jié)果為WHILE_D0之后的活躍版本;(3)對(duì)于D0_WHILE循環(huán),phi的操作數(shù)以及結(jié)果與WHILE_D0相同;(4)對(duì)于D0_L00P循環(huán),phi的第一個(gè)操作數(shù)為初始化定義的最后版本,若初始化中無(wú) 定義,則為循環(huán)前的活躍版本;第二個(gè)操作數(shù)為循環(huán)體和循環(huán)計(jì)數(shù)中定義的最后版本;結(jié) 果為循環(huán)結(jié)構(gòu)后的活躍版本。
5.根據(jù)權(quán)利要求4所述的基于高級(jí)中間表示的結(jié)構(gòu)優(yōu)化方法,其特征在于所述WHIRL SSA的更新,采用對(duì)局部范圍的SSA重構(gòu)方法,然后再和整體進(jìn)行合并,達(dá)到對(duì)SSA更新的目 的;DU/UD的數(shù)據(jù)流信息同樣在局部范圍內(nèi)重新計(jì)算;對(duì)SSA的局部計(jì)算,有以下約定1)被轉(zhuǎn)換的區(qū)域必須只有一個(gè)入口,如果有多個(gè)入邊,則插入phi節(jié)點(diǎn);2)被轉(zhuǎn)換區(qū)域有多個(gè)出邊或是exit基本塊;3)轉(zhuǎn)換過(guò)程不引入新的入口;4)轉(zhuǎn)換過(guò)程可以引入新的出邊,但不引入新的出邊目標(biāo)節(jié)點(diǎn);更新算法包含以下四個(gè)步驟1)驗(yàn)證區(qū)域符合上述四個(gè)條件;2)在變換前,收集區(qū)域內(nèi)每個(gè)使用或定義符號(hào)的版本信息;3)轉(zhuǎn)換后,驗(yàn)證新的區(qū)域,在該區(qū)域內(nèi)重新計(jì)算SSA信息;在重命名階段,對(duì)變量的版 本號(hào)更新從該符號(hào)在變換前的最大版本開(kāi)始;4)最后,新區(qū)域樹(shù)合并到原始的根樹(shù),通過(guò)對(duì)入口和輸出節(jié)點(diǎn)插入賦值語(yǔ)句實(shí)現(xiàn)符號(hào) 版本的一致;當(dāng)引入了新的出邊,則在出邊的目標(biāo)處插入Phi節(jié)點(diǎn)。
6.根據(jù)權(quán)利要求5所述的基于高級(jí)中間表示的結(jié)構(gòu)優(yōu)化方法,其特征在于所述WHIRLSSA驗(yàn)證包括在構(gòu)建WHIRL SSA或更新SSA信息時(shí),對(duì)WHIRL SSA的正確性和一致性進(jìn)行驗(yàn) 證;其中,正確性驗(yàn)證包括所有變量的版本信息且版本號(hào)有無(wú)重疊、控制流圖中的連接節(jié)點(diǎn) 有無(wú)Phi節(jié)點(diǎn)、mu/chi列表構(gòu)建是否正確;一致性驗(yàn)證包括phi節(jié)點(diǎn)的操作數(shù)與WHIRL節(jié) 點(diǎn)是否一致,且滿足Phi的插入規(guī)則,SSA版本的活躍區(qū)間有無(wú)重疊。
7.根據(jù)權(quán)利要求1一6之一所述的基于高級(jí)中間表示的結(jié)構(gòu)優(yōu)化方法的實(shí)現(xiàn)系統(tǒng),其 特征在于總體架構(gòu)包括6個(gè)模塊:WHIRL SSA管理模塊、DU/UD管理模塊、更新模塊、驗(yàn)證模 塊、生成模塊和讀寫(xiě)接口; WHIRL SSA管理模塊分別與DU/UD管理模塊、更新模塊、驗(yàn)證模 塊、生成模塊和讀寫(xiě)接口連接;其中WHIRL SSA管理模塊負(fù)責(zé)維護(hù)每個(gè)模塊的SSA相關(guān)信息,SSA信息包含phi/chi/mu/ ver,存儲(chǔ)在多個(gè)表中;WHIRL節(jié)點(diǎn)和SSA之間的映射關(guān)系通過(guò)map結(jié)構(gòu)維護(hù),map在生成SSA 信息或從WHIRL文件讀取SSA信息時(shí)進(jìn)行建立;依賴于同一個(gè)WN的phi節(jié)點(diǎn)通過(guò)PHI_LIST 鏈接;WHIRL SSA管理模塊提供接口給生成模塊,用于決定WHIRL節(jié)點(diǎn)的類(lèi)型;生成模塊依 據(jù)全局優(yōu)化階段的符號(hào)表和SSA信息生成SSA符號(hào)表;驗(yàn)證模塊用來(lái)驗(yàn)證SSA信息的正確 性和一致性;當(dāng)程序轉(zhuǎn)換完成后,更新模塊在局部區(qū)域?qū)SA信息進(jìn)行更新;DU/UD管理模 塊負(fù)責(zé)維護(hù)數(shù)據(jù)流信息;讀寫(xiě)接口負(fù)責(zé)對(duì)WHIRL文件的SSA信息進(jìn)行讀取或?qū)懟亍?br>
全文摘要
本發(fā)明屬于程序編譯優(yōu)化技術(shù)領(lǐng)域,具體為一種基于高級(jí)中間表示的結(jié)構(gòu)優(yōu)化方法及系統(tǒng)。主要包括(1)WHIRLSSA的生成,通過(guò)遍歷WHIRL節(jié)點(diǎn)生成SSA信息并將SSA信息標(biāo)注在WHIRL節(jié)點(diǎn)中;(2)PHI節(jié)點(diǎn)的插入,將PHI節(jié)點(diǎn)插入到WHIRL結(jié)構(gòu)的合適位置;(3)WHIRLSSA的更新與驗(yàn)證,WHIRLSSA更新采用按需更新策略,通過(guò)將局部范圍的SSA更新合并到一起,實(shí)現(xiàn)對(duì)整個(gè)SSA更新的目的。系統(tǒng)的總體構(gòu)架包括WHIRLSSA管理模塊、DU/UD管理模塊、更新模塊、驗(yàn)證模塊、生成模塊和讀寫(xiě)接口。WHILRSSA是一個(gè)同時(shí)包含了數(shù)據(jù)流和控制流信息的基于樹(shù)結(jié)構(gòu)高級(jí)中間表示的優(yōu)化架構(gòu)。WHIRLSSA優(yōu)化架構(gòu)繼承了WHIRL和SSA兩種中間表示的優(yōu)點(diǎn),提高了編譯器的優(yōu)化效果和擴(kuò)展性。
文檔編號(hào)G06F9/44GK101923472SQ20101028318
公開(kāi)日2010年12月22日 申請(qǐng)日期2010年9月16日 優(yōu)先權(quán)日2010年9月16日
發(fā)明者李弋, 楊克嶠, 臧斌宇 申請(qǐng)人:復(fù)旦大學(xué)