• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 博客專欄

    EEPW首頁 > 博客 > GCC編譯優化解析

    GCC編譯優化解析

    發布人:電子禪石 時間:2023-02-24 來源:工程師 發布文章
    編譯優化

    如果不指定優化標志,gcc會產生可調試的代碼

    啟用優化后,gcc會改變程序的結構,讓代碼變小或者運行得更快

    -O0

    不優化

    -O, -O1

    在不影響編譯速度的情況下,盡量采取一些優化算法降低代碼大小和加快代碼運行的速度,并啟用以下優化選項:

    • fauto-inc-dec
      地址訪問時,合并地址訪問指令和地址的遞增和遞減操作

    • fbranch-count-reg
      在計數寄存器中運行遞減和分支指令
      而不是單獨運行遞減指令,并與零比較,然后再根據結果進行分支

    • combine-stack-adjustments
      跟蹤堆棧的push和pop,并嘗試找到合并它們的方法

    • fcompare-elim
      判斷計算結果的flag寄存器,如果可以,用flag寄存器的結果來代替現式地比較操作

    • fcprop-registers
      通過寄存器存有的值,通過計算變量的依賴,減少從內存中讀取該變量的值,通過拷貝傳播,來減少變量的拷貝

    • -fdce
      消除死代碼

    • -fdefer-pop
      程序一般在函數返回時,會pop出棧中元素
      而編譯器,會合并多個函數調用,并一次性pop出相關的元素

    • -fdelayed-branch
      嘗試對指令重新排序,來利用延遲分支指令后可用的指令槽

    • -fdse
      對死代碼進行消除

    • -fforward-propagate
      The pass tries to combine two instructions and checks if the result can be simplified. If loop unrolling is active, two passes are performed and the second is scheduled after loop unrolling.

    • -fguess-branch-probability
      分支預測

    • -fif-conversion2
      利用條件執行把if條件轉化為無分支等價代碼

    • -fif-conversion
      利用moves, min, max, set, abs等手段把if條件轉化為無分支等價代碼

    • -finline-functions-called-once
      把靜態函數轉為inline函數

    • -fipa-pure-const
      發現函數是純函數還是常量函數

    • -fipa-profile
      對cold(僅調用一次的函數)函數進行優化

    • -fipa-reference

    • -fmerge-constants
      合并常數計算

    • -fmove-loop-invariants
      優化循環的不變量

    • -freorder-blocks
      重排代碼塊

    • -fshrink-wrap
      函數的開場白僅在使用前才初始化,而不是在函數開始的時候做

    • -fshrink-wrap-separate
      把函數的開場白和結束語分開,盡在使用的時候才初始化

    • -fsplit-wide-types
      對于某些需要占用多個寄存器的變量,獨立的申請寄存器

    • -fssa-backprop
      在定義鏈上傳播相關使用的信息,來簡化定義

    • -fssa-phiopt
      優化條件代碼

    • -fstore-merging
      合并存儲

    • -ftree-bit-ccp
      在tree上傳播稀疏條件位常量,并對齊傳播指針

    • -ftree-ccp
      在tree上傳播稀疏條件常量,并對齊傳播指針

    • -ftree-ch

    • -ftree-coalesce-vars

    • -ftree-copy-prop

    • -ftree-dce

    • -ftree-dominator-opts

    • -ftree-dse

    • -ftree-forwprop

    • -ftree-fre

    • -ftree-phiprop

    • -ftree-sink

    • -ftree-slsr

    • -ftree-sra

    • -ftree-pta

    • -ftree-ter

    • -funit-at-a-time

    -O2

    會犧牲一定的編譯速度,除了執行O1的所有編譯優化之外,還會采取幾乎所有的目標配置支持的優化算法,用來提高目標代碼的運行速度

    • -fthread-jumps
      判斷是否有double jump,并進行優化

    • -falign-functions
      把函數的開始地址對齊到2的冪

    • -falign-jumps
      把分支的起點地址對齊到2的冪

    • -falign-loops
      把循環的開始地址對齊到2的冪

    • -falign-labels
      把標簽的地址對齊到2的冪

    • -fcaller-saves

    • -fcrossjumping

    • -fcse-follow-jumps

    • -fcse-skip-blocks

    • -fdelete-null-pointer-checks
      檢查是否存在delete空指針

    • -fdevirtualize -fdevirtualize-speculatively
      用子類虛函數覆蓋虛函數函數指針

    • -fexpensive-optimizations

    • -fgcse -fgcse-lm
      全局的公用子表達式優化

    • -fhoist-adjacent-loads

    • -finline-small-functions
      把小函數優化為內聯函數

    • -findirect-inlining

    • -fipa-cp
      過程間常數傳播

    • -fipa-cp-alignment

    • -fipa-bit-cp

    • -fipa-sra
      過程間優化,刪除未使用的參數,將值傳遞優化為引用傳遞

    • -fipa-icf

    • -fisolate-erroneous-paths-dereference
      檢測由于取消空指針而觸發錯誤或未定義行為的路徑,將這些路徑隔離

    • -flra-remat
      通過上下文敏感,重用變量

    • -foptimize-sibling-calls
      優化同級和尾部遞歸調用

    • -foptimize-strlen
      優化strlen函數

    • -fpartial-inlining
      部分內聯函數

    • -fpeephole2
      機器相關優化

    • -freorder-blocks-algorithm=stc
      塊內代碼重排優化

    • -freorder-blocks-and-partition -freorder-functions
      重排代碼

    • -frerun-cse-after-loop
      重新運行公共表達式減少在循環后

    • -fsched-interblock -fsched-spec
      在不同塊間進行重排指令

    • -fschedule-insns -fschedule-insns2

    • -fstrict-aliasing
      類型嚴格轉換檢查

    • -fstrict-overflow
      檢查類型是否溢出

    • -ftree-builtin-call-dce

    • -ftree-switch-conversion -ftree-tail-merge

    • -fcode-hoisting

    • -ftree-pre

    • -ftree-vrp

    • -fipa-ra
      函數調用者,如果某些寄存器沒有用到,則可以不需要保存這些寄存器的值

    -O3

    除了執行O2所有的優化選項之外,一般還會采用很多向量化算法,提高程序的并行度,并利用CPU的流水線和cache來加快運行速度,

    這個選項會加大代碼的大小,并降低目標代碼的執行時間

    • -finline-functions
      采用一些啟發式算法對函數進行內聯

    • -funswitch-loops
      找到循環的不變條件,并移到循環外部

    • -fpredictive-commoning
      在循環間重用計算

    • -fgcse-after-reload
      執行全局的共同子表達式消除

    • -ftree-loop-vectorize 
      向量化優化

    • -ftree-loop-distribute-patterns
      把loop的某些部分轉化為標準函數,例如memset

    • -fsplit-paths

    • -ftree-slp-vectorize
      基本塊向量化

    • -fvect-cost-model

    • -ftree-partial-pre
      部分冗余代碼消除

    • -fpeel-loops

    • -fipa-cp-clone
      過程間調用函數克隆,讓常量傳播更有效

    -Os

    目的是盡量減少目標代碼的大小,這對存儲容量很小的設備尤為重要

    • -falign-functions
      對齊

    • -falign-jumps
      對齊

    • -falign-loops
      對齊

    • -falign-labels
      對齊

    • -freorder-blocks
      重排

    • -freorder-blocks-algorithm=stc
      重排

    • -freorder-blocks-and-partition
      重排

    • -fprefetch-loop-arrays
      預取

    -Ofast

    除了啟用所有O3的優化選項之外,還會針對某些語言啟用部分優化

    -Og

    目的是保留較好的可調試信息的前提下提供合理的優化

    GCC常用選項
    • -E: 預處理

    • -S: 編譯

    • -c: 編譯 匯編 不鏈接

    • -g: 包含調試信息

    • -I: 指定include頭文件目錄

    • -o: 輸出編譯文件

    • -w: 忽略所有警告

    • -Werror: 不區分警告和錯誤,遇到任何警告都停止編譯

    • -Wall: 開啟大部分告警提示

    • -Wshadow: 作用域相關存在變量同名時發出告警

    • -Wextra: 對所有合法但值得懷疑的表達式發出告警


    ref: gcc.gnu.org/onlinedocs/


    *博客內容為網友個人發布,僅代表博主個人觀點,如有侵權請聯系工作人員刪除。



    關鍵詞: gcc

    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 澜沧| 西丰县| 克什克腾旗| 溆浦县| 黎平县| 望江县| 涞源县| 绥宁县| 资兴市| 滨海县| 江津市| 德令哈市| 子长县| 仙居县| 游戏| 神农架林区| 上饶市| 德钦县| 吉水县| 龙山县| 壶关县| 宜丰县| 江达县| 山西省| 板桥市| 保定市| 章丘市| 华蓥市| 外汇| 大足县| 仁化县| 花垣县| 嘉禾县| 宝山区| 松江区| 偏关县| 四会市| 娱乐| 铜川市| 鸡东县| 睢宁县|