Peephole 優化實做介紹

 C Complier 在嵌入上使用的時候,儘量都是CodeSize 最小,那麼在這樣的前提下,如何將code size 最小,這是一個編譯器優化中比較常見的問題,但是同時如何保證程序的效率,這兩者之中難免出現衝突,存在這樣的矛盾問題,首先你要了解目前你自己的C complier 編譯出來的程序是要運行效率高,還是Codesize最小,這兩者似乎沒有辦法協調。
     當然這篇文章主要在code size 優化上,而且接着前一篇繼續說明peephole內部的算法如何。
1.首先使用Visual parser 將自己ASM code,進行解析,或者自己寫解析器,收集每一行指令的信息,將其放入一個表中,表中的每一行都是一條ASM 指令的信息(Instrution table)。
2.合併基本塊(Basic block)
   因爲c complier產生的ASM code 中間經常要產生一些沒有實際作用的label, 其實這些label是Debugger 等其他組件使用的,但不會影響程序的執行流程。因此我們要將這些沒有實際作用的label,剔除掉,因爲peephole 所聚焦的是一個basic block.
    Basic Block : 是指在局部範圍內,程序的片斷只有一個入口和一個出口,這樣的代碼片斷就構成一個基本塊。
     首先程序中有很多的label, 這些label 之間可能是basic block, 也可能不是,當是一個basic block 的時候,還要看能不能和周圍的basic block 構成一個更大basic block.
  
     basic block 的劃分:block 開始:程序的入口,跳轉指令後的地址,call 指令的地址。
                                  block 結束:程序結束,Call 指令,Jmp 指令(包含直接跳轉和間接跳轉)

3. 在使用特定的算法對錶中每一行進行處理,將處理的結果放到另一個表中(Erase table),這個表中可能記錄了你當前要進行的刪除或者更改的指令,表中的每一個數據項要包含什麼信息,就要根據CComplier產生的ASM來確定了。
4. 根據Erase table 產生出最終的指令代碼。

例如:



那麼如何將這些PUSH 和Pop 指令刪除掉, 當然使用什麼算法因個人自己而定,這裏我使用的是狀態機,如下圖:

圖中紅色的部分就是可以刪除的PUSH POP 指令,因此使用上面的規則,那麼剛纔的代碼就可以變成如下的樣子:

這篇文章就這樣了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章