編譯原理系列之十 代碼優化


代碼優化

  • 代碼優化可分為與機器有關的優化和與機器無關的優化。

    與機器有關的優化一般在目標代碼上進行。與機器無關的優化一般在中間代碼上進行。

  • 代碼優化也可分為局部優化、 循環優化和全局優化:

    局部優化指的是在只有一個入口、 一個出口的基本程序塊上進行的優化。
    循環優化是對循環中的代碼進行的優化,在一個程序運行時,相當多的一部分時間會花在循環上,因此,基於循環的優化非常重要。
    全局優化是在整個程序范圍內進行的優化。

  • 常用的代碼優化技術 :

    1. 刪除公共子表達式(刪除多余運算)

      2869373-649c98c699fa6f5c.png

      刪除公共子表達式

  1. 代碼外提
    代碼外提是指將循環中的不變運算提到循環體前面。

     

    2869373-907263d66590f2a9.png

    代碼外提

  2. 強度削弱

    強度削弱是指用執行效率較高的操作等價地替換原操作。

    比如將乘法改成加法

    2869373-88b20996e9aa464b.png

    強度削弱

  1. 變換循環控制條件(刪除歸納變量)

    2869373-501b64edd1e448d6.png

    刪除歸納變量

  1. 合並已知變量

    2869373-836da130d9f16bf6.png

    合並已知變量

  1. 復寫傳播

    復寫傳播是指盡量不引用那些在程序中僅僅只傳遞信息而不改變其值,也不影響其運行結果的變量。

     

    2869373-17f520dc594a9bf4.png

    復寫傳播

  2. 刪除無用賦值

     

    2869373-0fd29921e62b0657.png

    刪除無用賦值

  • 基本塊的划分:

    基本塊:是指程序中一順序執行的語句序列,其中只有一個入口語句和一個出口語句。執行時只能從其入口語句進入,從其出口語句退出,不存在跳轉和分叉匯合的情況。

    基本塊入口語句的判斷:
    • 程序的第一個語句;
    • 條件轉移語句或無條件轉移語句的轉移目標語句
    • 緊跟在條件轉移語句后面的語句

  • 流圖:

    流圖以基本塊集為結點集:第一個結點為含有程序第一條語句的基本塊;

    2869373-057e505ac2e8c0a2.png

    流圖

  • DAG 表示的代碼優化分析

    所作的優化合並已知量、刪除多余運算、刪除無用賦值

    2869373-429a83ef326ecb62.png

    DAG 表示的代碼優化分析

  • 循環優化:

    對循環中的代碼段,可以進行代碼外提、強度削弱和刪除歸納變量等優化。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM