專利名稱:經(jīng)由有效數(shù)據(jù)流分析來指派寄存器類別的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
實施例涉及編譯器技術(shù),具體而言涉及經(jīng)由寄存器類別指派的編譯器優(yōu)化。
背景技術(shù):
當(dāng)設(shè)計和實現(xiàn)編譯器時,寄存器分配和寄存器指派在增加計算機程序效率方面是非常重要的。寄存器分配確定程序值,這些值在每一程序點上將被存儲在機器(例如計算機系統(tǒng))的寄存器中,而不是被存儲在存儲器中。寄存器指派確定每一被分配的程序值將定位到哪一個寄存器。編譯器開發(fā)者往往忽略了寄存器類別指派。寄存器類別指派通常被忽視的原因在于,很多機器包含非常少的寄存器類別。典型地,大部分機器僅具有兩類寄存器整數(shù)和浮點寄存器。
對于具有兩種寄存器類別(也就是整數(shù)和浮點)的這些機器而言,指令的每一寄存器操作數(shù)需要固定的寄存器類別,也就是在指令集結(jié)構(gòu)(ISA)設(shè)計期間明確執(zhí)行寄存器類別指派。然而,考慮到現(xiàn)代計算機結(jié)構(gòu)設(shè)計,寄存器類別指派越加困難地確定。例如,在一些先進的處理器中,大量的寄存器類別是可用的。并且允許向指令寄存器操作數(shù)指派不同寄存器類別形式的物理寄存器。
為了使得問題更加復(fù)雜,不能夠任意地執(zhí)行寄存器類別指派。僅能夠?qū)⒅付ǖ募拇嫫黝悇e應(yīng)用到指定指令的寄存器操作數(shù)。圖1A和1B說明了一個實例,其展示了用于算術(shù)邏輯單元(ALU)指令的靈活的寄存器類別指派。圖1A說明了ALU指令實例。圖1B說明了符號寄存器A_OP和B_OP的可能的寄存器類別指派實例。這種復(fù)雜性使得編譯器設(shè)計和實現(xiàn)越來越有挑戰(zhàn)性。
通過實例以及非限制性的附圖來說明本發(fā)明的實施例,附圖中相似的參數(shù)指示相似的元素。應(yīng)該指出,該公開內(nèi)容中的本發(fā)明的“一”實施例沒有必要是相同的實施例,并且它們意指至少一個。
圖1A說明了ALU指令的實例。
圖1B說明圖1A所述指令中對兩個符號寄存器的可能的寄存器類別指派實例。
圖2說明目標(biāo)機器指令的中間表示。
圖3說明了寄存器類別指派映射表的定義。
圖4說明了寄存器類別指派實施例的處理。
圖5說明了初始寄存器類別指派實施例的偽代碼。
圖6說明了一實施例的中間塊(inter-block)寄存器類別修正(fixup)的實例。
圖7說明了用于計算OUT_M(i)的實例的偽代碼。
圖8說明了線性時間數(shù)據(jù)流框架的實施例的偽代碼。
圖9A說明了用于提升(hosting)寄存器類別修正的實施例的實例。
圖9B說明了用于降低寄存器類別修正的實施例的實例。
圖10說明了一個實施例的系統(tǒng)的框圖。
圖11說明了實施例可以與之相結(jié)合實施的典型計算機。
具體實施例方式
這里討論的實施例通常涉及經(jīng)由有效的數(shù)據(jù)流分析來指派寄存器類別的方法和系統(tǒng)。參考附圖,將描述典型的實施例。典型的實施例被提供用以說明實施例,并且將不會構(gòu)成對實施例的范圍的限制。
說明書中對于“一實施例”、“一個實施例”、“一些實施例”或“其他實施例”的參考意思是與實施例相結(jié)合所描述的特殊特征、結(jié)構(gòu)、或特性包含于至少一些實施例中,但沒有必要包含于所有的實施例中。不同的表達“一實施例”、“一個實施例”或“一些實施例”沒有必要全部涉及相同的實施例。如果說明書描述了“可以”、“可能”或“能夠”包括的部件、特征、結(jié)構(gòu)、或特性,那么可以不需要包括特殊的部件、特征、結(jié)構(gòu)、或特性。如果說明書或權(quán)利要求涉及“一”或“一個”元素,那么這并不意味著僅存在一個元素。如果說明書或權(quán)利要求涉及“附加的”元素,那么這不排除存在一個以上的附加元素。
在目標(biāo)機器具有m個寄存器類別C1、C2、...Cm的情況中,每一寄存器類別C1包含Ni個物理寄存器(也就是Ni-|Ci|)。另外,目標(biāo)機器的每一指令的中間表示看起來象圖2所示的形式,其中Dest、Src_1和Src_2可以是符號寄存器。在一個實施例中,通過為每一編譯單元(函數(shù))使用有效的數(shù)據(jù)流分析,那么在每一指令中包括寄存器類別到每一符號寄存器的指派。
在另一實施例中,對于指令i中所包含的符號寄存器s而言,如果在i中將寄存器Ck指派給s,那么寄存器類別指派的信息被表示為RegClass(s,i)=Ck并且在指令中用符號表示為s:Ck。
在一個實施例中,通用寄存器類別(將其簡化為符號C)是一種偽寄存器類別,其指示從C1到Cm的每一寄存器類別的并集。在執(zhí)行寄存器類別指派的處理中能夠?qū)⒎柤拇嫫髦概傻紺。應(yīng)該指出,在完成寄存器類別指派處理之后,應(yīng)該向符號寄存器指派實際存在的寄存器類別(C1、C2、...Cm)。根據(jù)該定義,下面兩個方程對于滿足1≤i≤m的每一i都是成立的。
Ci∩C=CiCi∪C=C在一個實施例中,寄存器類別陣列(將其簡化為符號A)是一種具有 個元素的不變陣列,如下定義每一元素的值A(chǔ)(i)C1(1≤I≤N1)C2(N1+1≤I≤N1+N2)···Cm(Σ1≤J≤m-1Nj+1≤I≤Σi≤j≤mNJ)]]>全局整數(shù)A_Index用于在寄存器類別指派處理中迭代陣列。在一個實施例中,在指派處理的初始化部分期間,將A_Index初始化為1。
在一個實施例中,寄存器類別指派映射表(將其簡化為符號M)是一種用于跟蹤到每一符號寄存器的寄存器類別指派的映射表。M的每一元素具有的形式為(s,c),其意指將寄存器類別c指派到符號寄存器s。假設(shè)編譯單元(函數(shù))包含Ns個符號寄存器,那么能夠如圖3所示那樣定義包含Ns個元素的寄存器類別指派映射表。
在一個實施例中,寄存器類別修正是一種在修改寄存器類別指派時所插入的指令。例如,如果首先向符號寄存器s指派寄存器類別C1,并且在隨后的分析中確定向s指派C2,那么添加附加的指令以將s:C1移動到s:C2(s:C2←s:C1)。該附加的指令移動被稱為從C1到C2的寄存器類別修正。在一個實施例中,假如程序的語義沒有變化,可以將寄存器類別修正插入到一個指令之前或一個指令之后,或者兩者兼有。由于在一個指令中可能出現(xiàn)一個以上的符號寄存器,因此需要若干個寄存器類別修正以適應(yīng)所述移動是可能的。
圖4說明了一個實施例的處理,其中,將寄存器類別指派到每一符號寄存器并且該指派包含于每一指令中。處理400從塊410開始,其中產(chǎn)生初始的寄存器類別指派。對于一些指令而言,要求僅僅將特定的寄存器類別指派給在那些指令中出現(xiàn)的符號寄存器操作數(shù)(目標(biāo)操作數(shù)或源操作數(shù))。同時對于不具有所述要求的其他符號寄存器而言,將通用寄存器類別C指派到符號寄存器操作數(shù)。圖5說明了初始寄存器類別指派的一個實施例中所包括的算法的偽代碼。
在完成塊410之后,處理400繼續(xù)到塊420。在塊420,經(jīng)由連接(conjunctive)正向數(shù)據(jù)流分析來執(zhí)行寄存器類別指派。對于任意的基礎(chǔ)塊b而言,在塊入口指派寄存器類別指派映射表為IN_M(b),同時在決出口處指派寄存器類別指派映射表為OUT_M(b)。能夠?qū)⑾嗨频母拍顟?yīng)用到指令,也就是,IN_M(i)和OUT_M(i),它們分別用于表示在指令i的入口處的寄存器類別指派映射表和在指令i出口處的寄存器類別指派映射表。接下來的等式和算法用于計算OUT_M(b)、IN_M(b)、IN_M(i)和OUT_M(i)。關(guān)于OUT_M(b),能夠通過使用以下等式來計算OUT_M(b)=OUT_M(i),其中i是基礎(chǔ)塊b中最后的指令I(lǐng)N_M(b)=∩p∈Pred(b)OUT_M(P)]]>如下定義寄存器類別指派映射表的“交集”M1∩M2∩...∩Mn={(SiC1si∩C2si∩...∩Cnsi)|1≤i≤Ns}因為Ci∩C=Ci,如果任一cks(1<k<n)等于C,那么能夠忽略與它的“交集”。基于此,當(dāng)cksi≠C時,c1si∩…∩cnsi的值取決于那些cksi(1<k<n)。如果c1si∩c2si∩…∩cnsi中出現(xiàn)的Cj’s的數(shù)量為最大,那么接下來的公式在該算法中也是成立的c1si∩c2si∩…∩cnsi=Cj。例如C2∩C5∩C2∩C∩C3=C2∩C5∩C2∩C3=C2
如果c1si∩c2si∩…∩cnsi出現(xiàn)的每一Cj是相同的,那么對于Cj≠C的條件,c1si∩c2si∩…∩cnsi等于第一Cj。該等式反映了以下原則如果將不同的寄存器類別指派到不同路徑中的符號寄存器,那么在該接合點中,選擇在大多數(shù)路徑中有效的寄存器類別指派(“寄存器類別修正”)是更加有益的。在一個實施例中,在每一進行的基礎(chǔ)塊的結(jié)尾處引入寄存器類別修正,所述基礎(chǔ)塊中的寄存器類別指派不同于接合點中的指派。如果在一個進行的基礎(chǔ)塊中,符號寄存器被指派C,在基礎(chǔ)塊的結(jié)尾處沒有必要對符號寄存器進行寄存器類別修正。圖6說明了中間塊寄存器類別修正的實例。
在一個實施例中,如果b沒有進行的基礎(chǔ)塊,也就是,b是編譯單元(函數(shù))的入口塊,那么IN_M(b)=INIT_M,同時INIT_M是一種特殊的寄存器類別指派映射表,其中每一符號寄存器指派有C-通用寄存器類別。IN_M(i)=OUT_M(p),其中p是基礎(chǔ)塊b中i的進行的指令。如果i是基礎(chǔ)塊b的第一指令,那么IN_M(i)=IN_M(b)。
在一個實施例中,在算法中使用兩個函數(shù)接口。第一函數(shù)是“BOOLIsValidRegClassAssignment(Inst,NthOperand,RegClass)”。如果對指令I(lǐng)nst的NthOperand的寄存器類別指派(RegClass)是有效的,那么該函數(shù)返回TRUE。否則,該函數(shù)返回FALSE。
第二函數(shù)接口是“REGISTERCLASS GetNextRegClass(Inst,NthOperand)”。該函數(shù)用于發(fā)現(xiàn)指令I(lǐng)nst的NthOperand的正確的寄存器類別指派。在一個實施例中,GetNextRegClass的偽代碼如下while(TRUE)If(IsValidRegClassAssignment(Inst,NthOperand,A(A_Index)))break;Suppose A(A_Index)equals Cj,then reassign A_Index to be(Σ1≤i≤jNi)%(Σ1≤j≤m)+1]]>ReturnRegClass=A(A_Index);A_Index=(A_Index%(Σ1≤i≤mNi))+1]]>return ReturnRegClass.
應(yīng)該指出由于必須存在一個寄存器類別滿足指令I(lǐng)nst的NthOperand的寄存器類別指派,因此while循環(huán)不會變成無限循環(huán)。實際上,用于調(diào)整A_Index的機制能夠確保向鄰近使用的Ni個符號寄存器指派不多于Ni個寄存器類別,這有助于減少將來物理寄存器指派中的沖突。根據(jù)寄存器類別陣列A的定義,將(Σ1≤i≤jNi)%(Σ1≤j≤mNi)+1]]>指派到A_Index能夠確保C1將是Cm之后的下一個寄存器類別指派候選。
圖7說明了用于計算OUT_M(i)的實施例中所使用的算法的偽代碼。利用上述數(shù)據(jù)流等式,能夠執(zhí)行連接(conjunctive)正向數(shù)據(jù)流分析以計算每一指令內(nèi)對于每一符號寄存器的寄存器類別指派。數(shù)據(jù)流分析是有效的,因為每一基礎(chǔ)塊僅迭代一次。
圖8說明了線性時間數(shù)據(jù)流框架的算法的偽代碼。在構(gòu)成數(shù)據(jù)流圖的拓?fù)浯涡虻奶幚砥陂g,應(yīng)該使用算法以斷開強連接的部件以致于使得拓?fù)渑判?sort)可用。
在完成塊420之后,處理400繼續(xù)到塊430。決430經(jīng)由代碼提升/降低以及失效代碼消除而減少寄存器類別修正。應(yīng)該指出失效代碼消除是一種通過消除完全或部分失效的某一不必要的代碼以提高程序效率的技術(shù)。完全的失效代碼是一種其計算的值永遠不被使用的代碼。部分失效的代碼使得其計算出的值沿著一些路徑使用而不沿著其他路徑使用。如果在沿著任一其他路徑未執(zhí)行附加的指令的情況下能夠執(zhí)行提升,那么指令提升/上升到不同位置可以提高效率。如果在沿著任一其他路徑未執(zhí)行附加指令的情況下能夠執(zhí)行降低,那么指令的降低或移動能夠提高效率。
因為可以在塊420中執(zhí)行許多寄存器類別修正,所以能夠執(zhí)行代碼提升/降低的優(yōu)化以提升/降低修正,以至于將保持較少的寄存器類別修正。圖9A-B說明了提升和降低寄存器類別修正。在一個實施例中,能夠執(zhí)行失效代碼去除通道(pass)以去除不必要的寄存器類別修正。使用圖6所述的情況作為一種實例,如果接合塊中s的第一次出現(xiàn)是目標(biāo)操作數(shù),那么能夠去除修正。
一旦完成塊430,處理400進行塊440。塊440執(zhí)行寄存器重命名以確保寄存器類別指派的唯一性。在塊430之后,可以在不同指令中向符號寄存器指派各種寄存器類別。為確保每一符號寄存器僅被指派有一種寄存器類別,在塊440中執(zhí)行寄存器重命名通道。例如,如果符號寄存器被指派有K種不同的寄存器類別,那么將代替以使用K個不同的符號寄存器,每一符號寄存器被指派有僅有的一個寄存器類別。利用重命名的符號寄存器來替換它們相應(yīng)的出現(xiàn)。
通過使用上述的實施例,能夠有效地解決寄存器類別指派的問題。這些實施例提供了經(jīng)由數(shù)據(jù)流分析來執(zhí)行寄存器類別指派的一般框架。這些實施例特別有益于具有大量寄存器類別的現(xiàn)代處理器。整個數(shù)據(jù)流分析是線性的,因為其僅對每一基礎(chǔ)塊迭代一次。通過使用寄存器類別陣列(A)和用于調(diào)整陣列索引(A_Inder)的處理,寄存器類另指派算法實現(xiàn)以下效果,即不多于Ni個寄存器類別被指派給鄰近使用的Ni個符號寄存器。這有助于減少將來物理寄存器指派中的沖突。
圖10為具有根據(jù)上述實施例的寄存器類別指派處理的實施例而說明耦合到處理器的編譯器的框圖。特別是,圖10說明了處理器1020、編譯器1010和寄存器組1030。在一個實施例中,編譯器1010是機器上的計算機程序(也就是編譯器程序),其能夠駐留在輔助存儲器介質(zhì)上(例如機器上的硬盤)并且在處理器1020上執(zhí)行。本領(lǐng)域普通技術(shù)人員將能理解的是,圖10中未示出的其他部件也能夠耦合處理器1020(例如高速緩存存儲器、本地存儲器、存儲器控制器等等);僅提供了以開放方式描述本發(fā)明所需的那些部件。
處理器1020在寄存器組1030中具有多個寄存器(R1-RN)。在該實施例中,N能夠是1或更大。編譯器1010是一種能夠在處理器1020中執(zhí)行的編譯器,其中如本領(lǐng)域所公知的那樣,處理器1020中輸入源程序,促使編譯器1010產(chǎn)生可執(zhí)行程序。編譯器1010也能夠在目標(biāo)機器上執(zhí)行。理解這些實施例不限于任一特殊類型的源程序是重要的,因為用于寫源程序的計算機編程語言的類型可以從程序代碼類型語言改變到面向?qū)ο笳Z言。在一個實施例中,如本領(lǐng)域所公知的那樣,可執(zhí)行程序是一組匯編代碼指令。
應(yīng)該指出,編譯器1010能夠在主機器或目標(biāo)機器上運行以產(chǎn)生可執(zhí)行代碼。主機器和目標(biāo)機器能夠具有不同的體系結(jié)構(gòu)。被編譯的代碼能夠在主機器、目標(biāo)機器或在完全獨立的或網(wǎng)絡(luò)連接的其他機器上運行。在一個實施例中,雖然編譯器在主機器上運行,但是被編譯的代碼僅在目標(biāo)機器上運行。在一個實施例中,主機器和目標(biāo)機器相同。在另一實施例中,主機器和目標(biāo)機器彼此具有不同的體系結(jié)構(gòu)。
圖11說明了代表性的主機器1110和目標(biāo)機器1120的圖示,結(jié)合該主機器和目標(biāo)機器而可以實踐那些實施例。應(yīng)該指出,可以在其他的電子設(shè)備上實行本發(fā)明的實施例,所述其他的電子設(shè)備包括但不限于連接到互聯(lián)網(wǎng)的機頂盒、筆記本電腦、個人數(shù)字助理(PDA)、掌上個人電腦(PC)、筆記本、服務(wù)器、工作站等等。在一個實施例中,主機器1110和目標(biāo)機器1120是計算機設(shè)備,諸如臺式個人計算機(PC)、服務(wù)器、工作站等等。在一個實施例中,主機器1110可操作地耦合到監(jiān)視器、用戶接口(例如鍵盤)和定點設(shè)備(未示出)。在另一實施例中,目標(biāo)機器1120可操作地耦合到監(jiān)視器、用戶接口(例如鍵盤)和定點設(shè)備(未示出)。主機器1110包括至少一個處理器1125(例如多種Intel處理器中的一種,諸如Pentium);本地存儲器1127,諸如隨機存取存儲器(RAM)、靜態(tài)隨機存取存儲器(SRAM)、動態(tài)隨機存取存儲器(DRAM)、同步DRAM(SDRAM)、只讀存儲器(ROM)等等;以及一個或多個存儲設(shè)備1127、諸如硬盤驅(qū)動器、軟盤驅(qū)動器(能夠?qū)④洷P插入其中)、光盤驅(qū)動器、磁帶驅(qū)動器等等。計算機可讀存儲器類型為存儲器、硬盤驅(qū)動器、軟盤等等。
在一個實施例中,主機器1110包括編譯器1115和寄存器組1130。在一個實施例中,編譯器1115是一種能夠駐留在輔助存儲介質(zhì)(例如機器上的硬盤驅(qū)動器、RAM等等)上并且在諸如處理器1125那樣的處理器上運行的計算機程序(即,編譯器程序)。本領(lǐng)域普通技術(shù)人員將能理解,圖11中未示出的其他部件也能夠耦合處理器1125和1135(例如高速緩存存儲器、本地存儲器、存儲器控制器等等);僅提供了以開放方式描述本發(fā)明所需的那些部件。在一個實施例中,編譯器115在主機器1110的處理器1125上運行,執(zhí)行優(yōu)化,指派寄存器類別以及創(chuàng)建被編譯的代碼。在一個實施例中,被編譯的代碼在目標(biāo)機器1120上運行而不在主機器1110上運行。在另一實施例,在主機器1110上創(chuàng)建的被編譯的代碼在主機器1110上運行。應(yīng)該指出,當(dāng)在主機器110上創(chuàng)建被編譯的代碼時,其能夠在具有不同于主機器1110的體系結(jié)構(gòu)的另一目標(biāo)機器(未示出)運行。
在一個實施例中,處理器1125在寄存器組1030中具有多個寄存器(R1-RN)。在該實施例中,N能夠是1或更大。在一個實施例中,處理器1135在寄存器組1040中具有多個寄存器(R1-RN)。在該實施例中,N能夠是1或更大。編譯器1115是一種能夠在處理器中執(zhí)行的編譯器,其中如本領(lǐng)域所公知的那樣,處理器中輸入源程序,促使編譯器產(chǎn)生可執(zhí)行程序。編譯器1115也能夠在諸如目標(biāo)機器1120那樣的目標(biāo)機器上或在諸如主機器1110那樣的主機器上執(zhí)行。理解這些實施例不限于任一特殊類型的源程序是重要的,因為用于寫源程序的計算機編程語言的類型可以從過程代碼類型語言改變到面向?qū)ο笳Z言。在一個實施例中,如本領(lǐng)域所公知的那樣,可執(zhí)行程序是一組匯編代碼指令。
這些實施例沒有特別限制到任一類型的主機器1110或目標(biāo)機器1120。存儲運行在機器1110或目標(biāo)機器1120上的計算機程序的計算機可讀介質(zhì)駐留在主機器1110上。通過根據(jù)實施例的計算機程序來實施編譯器的優(yōu)化。在一個實施例中,目標(biāo)機器具有編譯器1116。應(yīng)該指出,在其他的實施例中,不包括或不需要編譯器1116。編譯器1116能夠完全不同于編譯器1115。在另一實施例中,編譯器1115和編譯器1116能夠相似或相同。
上述實施例也能夠被存儲在設(shè)備或機器可讀介質(zhì)上并且由機器讀取以執(zhí)行指令。機器可讀介質(zhì)包括任一機構(gòu),其提供(也就是存儲和/或傳送)機器(例如計算機)可讀形式的信息。例如,機器可讀介質(zhì)包括只讀存儲器(ROM);隨機存取存儲器(RAM);磁盤存儲介質(zhì);光存儲介質(zhì);閃速存儲器設(shè)備、生物電子、機械系統(tǒng);電,光,聲或其他形式的傳播信號(例如載波信號、紅外信號、數(shù)字信號等等)。所述設(shè)備或機器可讀介質(zhì)包括微型電機系統(tǒng)(MEMS),毫微技術(shù)設(shè)備,有機、全息、固態(tài)存儲設(shè)備和/或旋轉(zhuǎn)磁或光盤。當(dāng)將指令劃分分割到不同機器時,所述設(shè)備或機器可讀介質(zhì)可以是分布式的,例如跨計算機的互聯(lián)連接分布。
雖然附圖中描述并示出了某些典型的實施例,但是應(yīng)該理解的是所述實施例僅是說明性的,而非對寬泛的發(fā)明的限制,并且該發(fā)明不限于所示和描述的特殊結(jié)構(gòu)和布置,因為各種其他的修改對本領(lǐng)域技術(shù)人員來說是顯而易見的。
權(quán)利要求
1.一種方法,包括在至少一個指令中指派第一寄存器類別到至少一個符號寄存器;確定并指派第二寄存器類別到該至少一個符號寄存器;減少寄存器類別修訂;以及對該至少一個符號寄存器進行重命名。
2.如權(quán)利要求1所述的方法,所述指派第一寄存器類別是初始的指派。
3.如權(quán)利要求1所述的方法,所述確定并指派第二寄存器包括在塊入口處標(biāo)記寄存器類別指派映射表;在塊出口處標(biāo)記寄存器類別指派映射表;在每一指令的入口處確定寄存器類別指派映射表;以及在每一指令的出口處確定寄存器類別指派映射表。
4.如權(quán)利要求1所述的方法,所述減少寄存器類別修正包括提升寄存器類別修正;降低寄存器類別修正;以及去除不必要的寄存器類別修正。
5.如權(quán)利要求4所述的方法,所述去除不必要的寄存器類別修正包括去除失效代碼。
6.一種包括機器可讀介質(zhì)的裝置,所述機器可讀介質(zhì)包含指令,當(dāng)機器執(zhí)行所述指令時,使得機器執(zhí)行以下操作在至少一個指令中指派第一寄存器類別到至少一個符號寄存器;確定并指派第二寄存器類別到該至少一個符號寄存器;減少寄存器類別修訂;以及對該至少一個符號寄存器進行重命名。
7.如權(quán)利要求6所述的裝置,所述指派第一寄存器類別指令是初始的指派。
8.如權(quán)利要求6所述的裝置,所述確定并指派第二寄存器進一步包括指令,當(dāng)被機器執(zhí)行時,使得機器執(zhí)行以下的操作在塊入口處標(biāo)記寄存器類別指派映射表;在塊出口處標(biāo)記寄存器類別指派映射表;在一個指令的入口處確定寄存器類別指派映射表;以及在一個指令的出口處確定寄存器類別指派映射表。
9.如權(quán)利要求6所述的裝置,所述減少寄存器類別修正進一步包括指令,當(dāng)被機器執(zhí)行時,使得機器執(zhí)行以下的操作提升寄存器類別修正;降低寄存器類別修正;以及去除不必要的寄存器類別修正。
10.如權(quán)利要求9所述的裝置,所述去除不必要的寄存器類別修正進一步包括指令,當(dāng)被機器執(zhí)行時,使得機器執(zhí)行包括去除失效代碼的操作。
11.一種系統(tǒng),包括具有至少一個寄存器的處理器;以及耦合到該處理器的編譯器,用于在輸入具有多個操作塊的源程序的主設(shè)備中運行,其中該編譯器在至少一個指令中將第一寄存器類別指派到至少一個符號寄存器;確定并指派第二寄存器類別到該至少一個符號寄存器;減少寄存器類別修訂;以及對該至少一個符號寄存器進行重命名。
12.如權(quán)利要求11所述的系統(tǒng),其中,被指派的第一寄存器類別是初始指派的寄存器類別。
13.如權(quán)利要求11所述的系統(tǒng),其中,被確定并指派的第二寄存器類別包括在塊入口處標(biāo)記寄存器類別指派映射表;在塊出口處標(biāo)記寄存器類別指派映射表;在一個指令的入口處確定寄存器類別指派映射表;以及在一個指令的出口處確定寄存器類別指派映射表。
14.如權(quán)利要求11所述的系統(tǒng),所述減少寄存器類別修正包括提升寄存器類別修正;降低寄存器類別修正;以及去除不必要的寄存器類別修正。
15.如權(quán)利要求14所述的系統(tǒng),所述去除不必要的寄存器類別修正包括去除失效代碼。
16.一種計算機,包括至少一個處理器,具有耦合到第一存儲器和第二存儲器的至少一個寄存器;耦合到該處理器的至少一個用戶輸入設(shè)備;耦合到該處理器的監(jiān)視器;以及編譯器,其在輸入具有多個操作塊的源程序的處理器中運行,其中該編譯器在至少一個指令中將第一寄存器類別指派到至少一個符號寄存器;確定并指派第二寄存器類別到該至少一個寄存器;減少寄存器類別修正;以及對該至少一個寄存器進行重命名。
17.如權(quán)利要求16所述的計算機,其中,被指派的第一寄存器類別是初始指派的寄存器類別。
18.如權(quán)利要求16所述的計算機,其中,被確定并指派的第二寄存器類別包括在塊入口處標(biāo)記寄存器類別指派映射表;在塊出口處標(biāo)記寄存器類別指派映射表;在一個指令的入口處確定寄存器類別指派映射表;以及在一個指令的出口處確定寄存器類別指派映射表。
19.如權(quán)利要求16所述的計算機,所述減少寄存器類別修正包括提升寄存器類別修正;降低寄存器類別修正;以及去除不必要的寄存器類別修正。
20.如權(quán)利要求19所述的計算機,所述去除不必要的寄存器類別修正包括去除失效代碼。
全文摘要
提供了一種方法,其包括在至少一個指令中將第一寄存器類別指派到至少一個符號寄存器,確定并指派第二寄存器類別到該至少一個寄存器,減少寄存器類別修正以及重命名該至少一個符號寄存器。還提供了一種系統(tǒng),其包括具有至少一個寄存器的處理器,以及在輸入了具有許多操作塊的源程序的處理器中運行的編譯器。編譯器在至少一個指令中將第一寄存器類別指派到該至少一個符號寄存器,確定并指派第二寄存器類別到該至少一個寄存器,減少寄存器類別修正以及重命名該至少一個符號寄存器。
文檔編號G06F9/45GK1938682SQ200580010377
公開日2007年3月28日 申請日期2005年3月30日 優(yōu)先權(quán)日2004年3月31日
發(fā)明者B·黃, J·戴, C·西德 申請人:英特爾公司