• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-161  評論-223  文章-30  trackbacks-0
             
            1. 不可達代碼是指無論輸入什么都不會執(zhí)行的代碼,對過程而言,即是從入口基本塊到不了(沒有路徑可達)的那些基本塊;死代碼是指可達但計算了后面任何可執(zhí)行路徑都不會使用其計算結(jié)果的代碼,比如死變量和死指令

            2. 不可達代碼的識別本質(zhì)是有向圖的可達性判定與傳遞閉包計算問題,一般用DFS法處理。先找到從入口基本塊不可達的基本塊,再刪除(同時改變其前驅(qū)和后繼基本塊的指向),直到找不到為止。死代碼的識別可用活躍分析或必要指令標記法,對于活躍分析,刪除基本塊出口不活躍的變量定值,以及它所使用不活躍操作數(shù)的定值;對于標記法,從必要指令出發(fā),根據(jù)def-use鏈和use-def鏈,不斷標記對其操作數(shù)有貢獻的指令,最后刪除沒被標記的那些指令

            3. 不可達代碼和死代碼可能來源于程序員,更可能源于編譯器的其它一些優(yōu)化產(chǎn)生,刪除優(yōu)化它們能顯著減小代碼體積,對執(zhí)行速度有間接的影響,因為可能改善指令高速緩層的利用率
            posted @ 2023-09-06 23:33 春秋十二月 閱讀(147) | 評論 (0)編輯 收藏
            1. 目的是識別循環(huán)中那種在每個迭代都產(chǎn)生相同值的計算,并將它們移到循環(huán)之外。注意,如果一個計算出現(xiàn)在嵌套循環(huán)內(nèi),對外循環(huán)的特定迭代而言,內(nèi)循環(huán)的每個迭代都產(chǎn)生相同的值,但外循環(huán)的不同迭代產(chǎn)生不同的值,那么這種計算將移到內(nèi)循環(huán)外,而非外循環(huán)外

            2. 識別循環(huán)不變量可以基于數(shù)據(jù)流分析求得的use-def鏈,一條指令是循環(huán)不變的,當它的每個操作數(shù)滿足以下條件之一
            a)該操作數(shù)是常數(shù)
            b)該操作數(shù)的所有到達定值在循環(huán)之外。因為若有一個在循環(huán)內(nèi),則該指令就可能是循環(huán)變化的,除非那個定值是循環(huán)不變量
            c)該操作數(shù)只存在一個為循環(huán)不變量的到達定值,且該指令之前沒有對其左部變量(若有)的使用。因為若有多個這樣的定值,則該指令就可能是循環(huán)變化的,除非多個定值結(jié)果都一樣;因為若前面有對其左部變量的使用,則該指令的賦值就殺死了左部變量的初值,這樣外提后左部變量第一次迭代就會使用錯誤的定值

            3. 由于以上條件沒考慮到控制流分析,不能保證循環(huán)不變量在每個迭代中執(zhí)行,以及循環(huán)不變量之左部變量的所有使用都是相同的值。因此為了保證外提后的代碼行為正確,還需要滿足條件:循環(huán)不變量所在基本塊必須是循環(huán)中所有使用了其左部變量的基本塊和所有出口基本塊的必經(jīng)結(jié)點。當外提循環(huán)不變量后,考慮到循環(huán)有可能執(zhí)行0次即一開始就不滿足循環(huán)進入條件,可以用是否進入循環(huán)的測試條件來保護前置塊,即識別終止條件是否一開始就為false,來保護它。這種方法總是安全的,但增加了代碼體積。不過若終止條件恒為true或false,則常數(shù)傳播分析會刪除這個冗余測試,如果為false,那么還會刪除前置塊
            posted @ 2023-09-06 23:30 春秋十二月 閱讀(72) | 評論 (0)編輯 收藏
            葉調(diào)用優(yōu)化與收縮包裝
            1. 葉調(diào)用優(yōu)化適用于被調(diào)者是不調(diào)用任何過程的過程之場景,這種過程叫葉過程
            2. 有幾種可能的優(yōu)化
            a)如果過程的實現(xiàn)使用display數(shù)組來尋址非局部變量,那么葉過程可避免在起始代碼序列中更新display數(shù)組
            b)如果葉過程內(nèi)不使用由被調(diào)者保存的寄存器(寄存器分配器應設法優(yōu)先使用由調(diào)用者保存的寄存器),那么可避免起始代碼序列中保存代碼和收尾代碼序列中恢復代碼。很小的葉過程很可能不使用到被調(diào)者保存的寄存器,只使用部分調(diào)用者保存的寄存器的葉過程,那么調(diào)用者也可以避免一部分寄存器保存與恢復代碼
            c)如果調(diào)用者有很多次調(diào)用葉過程,而且兩者代碼同時可見,那么葉過程不必自己分配棧幀,由調(diào)用者一次性分配好
            3. 收縮包裝是葉調(diào)用優(yōu)化的一種推廣,目的是盡可能去掉過程起始代碼序列和收尾代碼序列中實際沒用的寄存器保存恢復代碼。可以先用數(shù)據(jù)流分析來計算每個基本塊的保存寄存器集合(基本塊入口可預見但其前驅(qū)不可預見且入口不可達的那些寄存器)與恢復寄存器集合(基本塊出口可達但其后繼不可達且出口不可預見的那些寄存器),再在保存寄存器集合非空的基本塊入口處插入save指令(插入點已是最早的合適的位置),恢復寄存器集合非空的基本塊出口處插入restore指令(插入點已是最晚的合適的位置)

            尾調(diào)用優(yōu)化與尾遞歸刪除
            1. 尾調(diào)用優(yōu)化的條件是兩個(不同)過程編譯時同時可見,比如處于同一編譯單元,或調(diào)用者有足夠多的、使得優(yōu)化可能發(fā)生的關(guān)于被調(diào)用者的信息
            2. 尾調(diào)用優(yōu)化的實現(xiàn),因為被調(diào)者返回后代碼序列到調(diào)用者收尾代碼序列之間不存在有用計算,所以原來標準鏈接處理要保存的那些寄存器不可能活躍,首先要裁剪調(diào)用前代碼序列即不保存由調(diào)用者保存的寄存器和不壓棧返回地址,以及裁剪被調(diào)過程的起始代碼序列即不保存由被調(diào)者保存的寄存器和不分配新棧幀(借用調(diào)用者的棧幀,若被調(diào)者的棧幀比調(diào)用者的大,則需按兩者之差擴展棧幀),然后轉(zhuǎn)移到被調(diào)者裁剪過的起始代碼序列,最后修改被調(diào)過程的收尾代碼序列:正確釋放棧幀,比如用幀指針賦給棧指針,使之直接返回到調(diào)用者的調(diào)用者(比如o調(diào)用p,p調(diào)用q,q是尾調(diào)用,那么優(yōu)化后q實際返回到o)。綜上可得,尾調(diào)用優(yōu)化減免了壓棧返回地址與保存寄存器的開銷
            3. 尾遞歸刪除是尾調(diào)用優(yōu)化的一種特例,由于調(diào)用者和被調(diào)者是同一過程,因此不存在擴展棧幀和額外釋放棧幀,只須改變參數(shù)及跳轉(zhuǎn)到過程入口處即可
            posted @ 2023-09-06 23:23 春秋十二月 閱讀(72) | 評論 (0)編輯 收藏
            1. 數(shù)學基礎:兩者的共同點是都基于數(shù)據(jù)流值的半格和對組合運算封閉的傳遞函數(shù),不同點是區(qū)域分析算法還要求傳遞函數(shù)是一個半格,不僅支持組合運算,而且支持交匯運算和閉包運算,交匯運算用于把有相同后繼的不同執(zhí)行路徑組合起來,閉包運算用于環(huán)上(比如循環(huán))執(zhí)行零到多次的效果

            2. 流程:迭代算法由初始化和循環(huán)求不動解組成,以前向數(shù)據(jù)流為例,其中初始化包括初始化入口基本塊的out集合為合適值,其它基本塊的out集合為半格的頂元素;循環(huán)求不動解遍歷除入口外(因為入口的out不會變)的每個基本塊,計算其out集合,直至所有基本塊的out不再改變。區(qū)域分析算法由計算層次區(qū)域序列、構(gòu)造區(qū)域傳遞函數(shù)和計算各區(qū)域入口值組成,計算層次區(qū)域序列自底向上,基本塊為葉子區(qū)域,自然循環(huán)分為循環(huán)體區(qū)域和循環(huán)區(qū)域,都是內(nèi)部區(qū)域,不是自然循環(huán)的整個流圖為根區(qū)域;區(qū)域傳遞函數(shù)有2個,一是R區(qū)域入口到其直接子區(qū)域S的入口的數(shù)據(jù)流值傳遞,記作Fin(R,S),另一是R區(qū)域入口到其直接子區(qū)域出口基本塊B(可能有多個)出口處的數(shù)據(jù)流值傳遞,記作Fout(R,B),區(qū)域傳遞函數(shù)的計算自底向上,對于葉子區(qū)域,F(xiàn)in是恒等函數(shù),F(xiàn)out和迭代算法的傳遞函數(shù)一樣,取決于具體數(shù)據(jù)流問題;對于更大的區(qū)域(非葉子區(qū)域),遍歷每個子區(qū)域,F(xiàn)in由所有Fout(R,B)交匯而成,B為S在R中的前驅(qū),若R為循環(huán)區(qū)域,則再求Fout的閉包,遍歷S的每個出口基本塊B,F(xiàn)out由Fout(S,B)和Fin(R,S)組合而成。計算各區(qū)域入口值自頂向下,根區(qū)域的In值等于流圖入口的In值,其它區(qū)域S的In值等于Fin(R,S),R為父區(qū)域,所有Fin在前一環(huán)節(jié)已構(gòu)造好

            3. 結(jié)果:對同一數(shù)據(jù)流問題比如到達定值,兩種算法求得的數(shù)據(jù)流值是一樣的。為什么區(qū)域分析算法是正確的?因為它實際是按照程序控制流來構(gòu)造傳遞函數(shù)的,包含了所有可能執(zhí)行路徑數(shù)據(jù)流值傳遞的效果,這相當于迭代算法求不動解的過程,所以最后只要一個流圖的入口值,就能算出各區(qū)域的入口值。為什么迭代算法是收斂的?因為半格是單調(diào)的且高度有窮。收斂速度取決于遍歷基本塊的順序,如果按基本塊深度優(yōu)先排序(逆后序)遍歷,那么迭代輪數(shù)不超過流圖的深度(各條無環(huán)路徑后退邊的最大數(shù))加2

            4. 區(qū)別:迭代算法用于可歸約流圖和不可歸約流圖,區(qū)域分析算法僅能用于可歸約流圖
            posted @ 2023-09-06 23:18 春秋十二月 閱讀(93) | 評論 (0)編輯 收藏
            1. 作為指令高速緩層優(yōu)化的一種重要技術(shù),它根據(jù)CFG流圖邊的執(zhí)行頻率將頻繁執(zhí)行的基本塊排列在一起,并布局那些基本塊在下降分支路徑,而不在一起的也就是很少執(zhí)行的基本塊布局在轉(zhuǎn)移分支路徑。這樣做一來可以使取到I-cache中的指令實際被執(zhí)行的比例較高,二來對于某些體系結(jié)構(gòu)上轉(zhuǎn)移和下降路徑延遲不等的分支指令,可以降低跳轉(zhuǎn)延遲

            2. 實現(xiàn)過程內(nèi)代碼置放有以下幾個環(huán)節(jié):
            a)獲取剖析數(shù)據(jù):編譯器可以先在基本塊出口處插入代碼以統(tǒng)計到其后繼基本塊的執(zhí)行次數(shù),作為CFG流圖邊的權(quán)重,然后編譯生成可執(zhí)行文件,輸入代表性數(shù)據(jù)運行它,結(jié)果輸出一個數(shù)據(jù)文件,用于第二次編譯,這次編譯實施過程內(nèi)代碼置放優(yōu)化
            b)以鏈的形式構(gòu)建熱路徑:熱路徑是CFG路徑的一個集合,其中包括頻繁執(zhí)行的那些邊,每條路徑是一個或多個基本塊按邊的方向構(gòu)成的鏈,每個鏈關(guān)聯(lián)一個優(yōu)先級,用于布局代碼的先后順序。初始時,每個基本塊構(gòu)成一個只有它本身的鏈,其優(yōu)先級為CFG流圖邊的數(shù)量或者更大值;接下來,在CFG中按權(quán)重降序遍歷每條邊<x,y>(x不等于y),若x是某個鏈a的尾結(jié)點且y是某鏈b的頭結(jié)點,則把b合并到a后面,更新a的優(yōu)先級為a原來優(yōu)先級、b優(yōu)先級、P三者的最小值,同時遞增P,其中P為鏈合并操作的計數(shù)器,用于決定鏈的相對次序由低到高排列,初值為0。當遍歷結(jié)束時,所有熱路徑構(gòu)建完成
            c)進行代碼布局:經(jīng)過前一環(huán)節(jié),就得到了鏈的集合。首先從鏈集合找出含有入口基本塊的鏈t,將t加入工作表WL;然后從WL移出一個優(yōu)先級最低的鏈c,按序(構(gòu)建鏈時加入基本塊的順序)遍歷c的每個基本塊x,把x放在過程可執(zhí)行代碼體的末端,對于邊<x,y>,將包含y的鏈t加入WL(若t不在WL中),重復該過程直至WL為空
            posted @ 2023-09-06 23:15 春秋十二月 閱讀(67) | 評論 (0)編輯 收藏
            【輸入輸出】
            一個過程的所有基本塊,除entry和exit外的每個基本塊包含指令序列

            【流程】
            由前向數(shù)據(jù)流分析、局部復寫傳播和遍歷基本塊構(gòu)成
            1. 前向數(shù)據(jù)流分析:目標是計算出每個基本塊入口處有效的復寫賦值集合,這里定義為CPin(i),i為基本塊,其元素為表示復寫賦值的四元組<u,v,blk,pos>,u為左變量,v為右變量,blk為基本塊,pos為在blk中的位置。另外定義COPY(i)為基本塊i中出現(xiàn)且到達了出口的那些復寫賦值集合,即u和v在i中pos后沒被賦值;KILL(i)為被基本塊i殺死的那些賦值集合,即i中存在對其它基本塊復寫賦值右變量的賦值;CPout(i)為基本塊i出口處有效的復寫賦值集合。以上四種集合的數(shù)據(jù)流方程為:CPin(i)等于i的每個前驅(qū)p的CPout的交集,CPout(i)等于COPY(i)與CPin(i)減去KILL(i)之差的并集。CPout(entry)初值為空集,其它基本塊的CPout初值為全集U,U為過程所有復寫賦值的集合即所有基本塊的COPY之并集,根據(jù)迭代求不動點法可算出每個基本塊最終的CPin值
            2. 局部復寫傳播:作為被全局復寫傳播調(diào)用的例程,有兩個參數(shù),一個為輸入輸出參數(shù)單個基本塊,另一個為輸入?yún)?shù)CPin,即前向數(shù)據(jù)流分析求得的結(jié)果。該例程內(nèi)部維護一個有效復寫賦值的表,稱作ACP,其元素為二元組<u,v>,u是復寫賦值的左變量,v是右變量。首先初始化ACP即將CPin中的復寫賦值加入到ACP,再遍歷基本塊的每條指令,針對指令類別做對應的處理,有以下幾種情況
            a)對于一元/二元表達式及過程調(diào)用,將表達式的操作數(shù)或調(diào)用參數(shù)替換為ACP中對應元組的第二分量,若不存在這樣的元組則不用替換
            b)對于賦值語句(包括復寫賦值),從ACP中刪除第一或第二分量為賦值語句左變量的元組,這是為了刪除被殺死的復寫賦值
            c)對于復寫賦值且左變量u不等于右變量v,將元組<u,v>加入到ACP
            當遍歷結(jié)束后,局部復寫傳播就完成了
            3. 遍歷基本塊:對每個基本塊調(diào)用局部復寫傳播,當遍歷結(jié)束后,全局復寫傳播就完成了

            【分析】
            數(shù)據(jù)流分析的復雜度取決于基本塊總數(shù)及指令總數(shù),局部復寫傳播的復雜度取決于基本塊的指令總數(shù),遍歷基本塊復雜度取決于基本塊數(shù)量。全局復寫傳播會造成無用的賦值指令,但是這正給死代碼刪除和強度削減(比如兩個相同的整型變量加法用移位代替)提供了機會
            posted @ 2023-09-06 23:13 春秋十二月 閱讀(147) | 評論 (0)編輯 收藏
            【輸入】
            ssa控制流圖。結(jié)點為一個phi函數(shù)或一條運算指令,邊包含控制流邊和ssa邊

            【輸出】
            所有ssa變量的最終LatCell(常量半格值)

            【流程】
            1. 算法維護兩個工作表,一是流圖邊FlowWL,用于跟蹤控制流的執(zhí)行,二是ssa邊SSAWL,用于單賦值變量的傳播。還有一個ExecFlag映射,用于確保僅有控制流邊導向的運算結(jié)點最多執(zhí)行一次,多次執(zhí)行是沒必要的,因為運算涉及的分量不會變(沒有ssa前驅(qū)邊),ExecFlag(a,b)為true表示邊a->b導向的結(jié)點b已執(zhí)行,否則未執(zhí)行
            2. 兩種結(jié)點的分析:
            a) 對于phi結(jié)點,不管被哪種邊導向,都先計算其LatCell(phi結(jié)果與各個phi參數(shù)的交),若與舊值不同,則將它的ssa后繼邊加入SSAWL,若控制流后繼邊尚未執(zhí)行即對應ExecFlag為false,則將它的控制流后繼邊加入FlowWL
            b) 對于運算結(jié)點,若是控制流邊導向且未被執(zhí)行過(到結(jié)點的所有邊的ExecFlag為false)或ssa邊導向且以前執(zhí)行過(存在至少一條邊的ExecFlag為true),則執(zhí)行其運算,計算左值變量的LatCell(解釋執(zhí)行整數(shù)運算),若與舊值不同,則將ssa后繼邊加入SSAWL,若LatCell是常量且為條件運算,則將滿足條件的Y或N邊加入FlowWL,否則將所有控制流后繼邊加入FlowWL
            3. 算法初始時,設置所有控制流邊的ExecFlag為false,設置所有ssa變量的LatCell為未知(半格頂元素),將流圖入口到第1個結(jié)點的邊加入FlowWL。然后進行主循環(huán),先從FlowWL移出一條邊,若邊的ExecFlag為false則設為true,判斷尾結(jié)點類型,若為phi則轉(zhuǎn)到上述2-a處理,若為運算則轉(zhuǎn)到2-b處理;再從SSAWL移出一條邊,若邊尾結(jié)點為phi類型則轉(zhuǎn)到2-a處理,否則為運算類型轉(zhuǎn)到2-b處理,以上過程直至FlowWL和SSAWL皆為空

            【分析】
            該算法思想是符號執(zhí)行,對于運算x=y或x=y+z(這里+泛指對整型有意義的操作),在常量半格中,x、y、z初值為未知,y和z單調(diào)降低,導致x也單調(diào)降低,它們最多降低2次,故當格值不變后,SSAWL終為空,另外由于ExecFlag的作用導致所有僅控制流邊導向的結(jié)點最多執(zhí)行一次,因此FlowWL終為空,算法是收斂的,復雜度取決于控制流邊和ssa邊的總數(shù)
            posted @ 2023-09-06 23:10 春秋十二月 閱讀(86) | 評論 (0)編輯 收藏
            【輸入】
            程序控制流圖CFG

            【輸出】
            帶區(qū)域結(jié)點的控制依賴圖CDG

            【流程】
            1. 為CFG添加一個虛構(gòu)謂詞結(jié)點start,它的Y邊指向入口結(jié)點entry,出邊指向出口結(jié)點exit,得到CFG+。添加start是因為entry到第1個基本塊沒有條件判斷
            2. 為CFG+構(gòu)建后必經(jīng)結(jié)點樹PDOMTree,將CFG+中所有n不是m的后必經(jīng)結(jié)點的邊m->n加入集合S,邊的標號來自CFG為Y或N
            3. 遍歷S,對每條邊m->n,先在PDOMTree中找到最低公共祖先p(如果m為根結(jié)點則為m,否則為m的父結(jié)點),再將PDOMTree中p到n路徑上每個結(jié)點(p和entry除外)x加入CDG,并添加邊m->x,其邊標號同m->n
            4. 對CDG的每個內(nèi)部結(jié)點,若存在Y邊,則新建一個區(qū)域結(jié)點,連接所有Y邊對應的子結(jié)點;若存在N結(jié)點,則新建一個區(qū)域結(jié)點,連接所有N邊對應的子結(jié)點

            【應用】
            對于控制依賴于同一結(jié)點的所有結(jié)點,只要它們之間沒有數(shù)據(jù)依賴關(guān)系,就可以并行執(zhí)行
            posted @ 2023-09-06 23:07 春秋十二月 閱讀(122) | 評論 (0)編輯 收藏
            【輸入】
            根過程,及每個過程(含根過程)的指令序列

            【輸出】
            調(diào)用圖,由過程點集和調(diào)用邊(形如<p,i,q>,p在位置i調(diào)用q)集構(gòu)成

            【全局結(jié)構(gòu)】
            PVVs:過程值變量集合
            PVVals:過程值變量到過程常數(shù)集合的映射
            PVBinds:過程值變量到過程值變量集合的映射
            PVCalls:調(diào)用邊的集合

            【流程核心】
            1. 分析過程p內(nèi)指令,要處理調(diào)用指令和賦值指令兩種類型。對于調(diào)用指令,若被調(diào)過程q是過程常數(shù),則將q和<p,i,q>加入調(diào)用圖,先解析q的過程值形參與傳入實參的關(guān)系,有4種情況
            a)過程常數(shù)cp傳入過程值形參fp,將偶對<fp,cp>加入PVVals,fp加入PVVs
            b)過程值變量vp傳入過程值形參fp,將<fp,vp>加入PVBinds,fp和vp加入PVVs
            c)過程值形參fp傳出過程值變量vp,將<vp,fp>加入PVBinds,vp和fp加入PVVs
            d)過程值形參fp傳出過程常數(shù)cp,將<fp,cp>加入PVVals,fp加入PVVs
            若q不是常數(shù)而是過程值變量,則將q加入PVVs,<p,i,q>加入PVCalls。再解析q的返回與p的關(guān)系,有2種情況
            e)返回一個過程值變量vp1賦給另一過程值變量vp2,將<vp2,vp1>加入PVBinds,vp2和vp1加入PVVs
            f)返回一個過程常數(shù)cp賦給一個過程值變量vp,將<vp,cp>加入PVVals,vp加入PVVs
            對于賦值指令,其實情況和上述返回賦值一樣
            ----------------------------------------------------------------
            2. 遍歷PVVs,傳播各過程值變量的PVBinds,直至不再改變(迭代求不動解),本質(zhì)是計算過程值變量的傳遞閉包
            3. 遍歷PVCalls,對每個<p,i,q>,先遍歷它的每個PVVals u,將u和<p,i,u>加入調(diào)用圖;再遍歷它的每個PVBinds u及u的每個PVVals v,將v和<p,i,v>加入調(diào)用圖
            ----------------------------------------------------------------
            以上三環(huán)節(jié)可使用工作表w來驅(qū)動,w初始只有根過程,不斷從w移出一個過程p、分析p,每當在環(huán)節(jié)1或環(huán)節(jié)3發(fā)現(xiàn)一個新過程(過程常數(shù))就加入w,直至w為空,這時所有過程都已分析,調(diào)用圖構(gòu)建完成
            posted @ 2023-09-06 23:04 春秋十二月 閱讀(85) | 評論 (0)編輯 收藏
            【輸入】
            調(diào)用圖,其頂端是根過程

            【輸出】
            每個過程每個參數(shù)的icp值

            【算法步驟】
            1. 將根過程加入工作表,遍歷調(diào)用圖,構(gòu)建每個過程的形參集合,初始化每個形參的icp值為未知(icp格的頂元素)
            2. 從工作表移出一個過程p,若工作表為空則終止
            3. 遍歷p的指令序列,對每個調(diào)用點遍歷被調(diào)過程q的形參,對每個形參x,若對應的傳入實參是p的一個形參,則計算x的icp值(等于x舊值和傳入實參的icp值之交)
            4. 若x的icp值比舊值小,則將q加入工作表,轉(zhuǎn)到步驟2繼續(xù)

            【算法分析】
            數(shù)學基礎是icp半格,高度為3,所以必定收斂(因為半格是單調(diào)偏序的,icp最多變小2次:未知->常量,常量->非常量)。步驟1復雜度取決于過程數(shù)及其參數(shù)數(shù)量,步驟2~4之外循環(huán)次數(shù)取決于調(diào)用圖的深度,內(nèi)循環(huán)取決于調(diào)用點數(shù)、被調(diào)過程的參數(shù)數(shù)量。該算法是位置無關(guān)的,不能處理特定調(diào)用點的特定過程之常量傳播,另外過程的形參集合不能有交集

            【應用】
            可以計算出每個過程入口形參對應的常量實參集合,進而可以運用全局常數(shù)傳播使結(jié)果更精確。如果確定了一個過程的哪些參數(shù)是常量,那么可以克隆出一個副本,對副本進行優(yōu)化,比如裁剪調(diào)用和起始代碼序列,使之不傳遞常數(shù)參數(shù),再運用過程內(nèi)優(yōu)化
            posted @ 2023-09-06 23:02 春秋十二月 閱讀(62) | 評論 (0)編輯 收藏
            僅列出標題
            共17頁: 1 2 3 4 5 6 7 8 9 Last 
            午夜肉伦伦影院久久精品免费看国产一区二区三区 | 69SEX久久精品国产麻豆| 免费精品久久久久久中文字幕 | 中文字幕亚洲综合久久菠萝蜜 | 青青青伊人色综合久久| 欧美精品一本久久男人的天堂| 亚洲国产二区三区久久| 亚洲精品高清久久| 久久免费看黄a级毛片| 久久综合狠狠综合久久综合88| 国产精品久久久久aaaa| 久久av免费天堂小草播放| 日韩美女18网站久久精品| 久久人人爽人人爽人人片av高请| 嫩草影院久久99| 人妻精品久久久久中文字幕69| 91久久国产视频| 亚洲中文字幕无码久久综合网| 久久青青草原综合伊人| 99久久99久久精品国产片果冻| 久久精品国产免费一区| 国产亚洲精品久久久久秋霞 | 久久最近最新中文字幕大全 | 丁香色欲久久久久久综合网| 久久国产精品久久久| 2019久久久高清456| 狠狠精品久久久无码中文字幕| 亚洲中文久久精品无码| 热久久国产欧美一区二区精品 | 国产免费福利体检区久久| 久久中文骚妇内射| 久久久一本精品99久久精品88| 成人a毛片久久免费播放| 国产精品99久久免费观看| 无码国产69精品久久久久网站| 久久精品中文字幕一区| 国产精品久久久99| 一本大道久久a久久精品综合| 国产亚洲色婷婷久久99精品| 午夜精品久久久久久久久| 精品国产乱码久久久久久呢|