<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > GCC編譯優(yōu)化解析

GCC編譯優(yōu)化解析

發(fā)布人:電子禪石 時(shí)間:2023-02-24 來(lái)源:工程師 發(fā)布文章
編譯優(yōu)化

如果不指定優(yōu)化標志,gcc會(huì )產(chǎn)生可調試的代碼

啟用優(yōu)化后,gcc會(huì )改變程序的結構,讓代碼變小或者運行得更快

-O0

不優(yōu)化

-O, -O1

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

  • fauto-inc-dec
    地址訪(fǎng)問(wèn)時(shí),合并地址訪(fǎng)問(wèn)指令和地址的遞增和遞減操作

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

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

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

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

  • -fdce
    消除死代碼

  • -fdefer-pop
    程序一般在函數返回時(shí),會(huì )pop出棧中元素
    而編譯器,會(huì )合并多個(gè)函數調用,并一次性pop出相關(guān)的元素

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

  • -fdse
    對死代碼進(jìn)行消除

  • -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條件轉化為無(wú)分支等價(jià)代碼

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

  • -finline-functions-called-once
    把靜態(tài)函數轉為inline函數

  • -fipa-pure-const
    發(fā)現函數是純函數還是常量函數

  • -fipa-profile
    對cold(僅調用一次的函數)函數進(jìn)行優(yōu)化

  • -fipa-reference

  • -fmerge-constants
    合并常數計算

  • -fmove-loop-invariants
    優(yōu)化循環(huán)的不變量

  • -freorder-blocks
    重排代碼塊

  • -fshrink-wrap
    函數的開(kāi)場(chǎng)白僅在使用前才初始化,而不是在函數開(kāi)始的時(shí)候做

  • -fshrink-wrap-separate
    把函數的開(kāi)場(chǎng)白和結束語(yǔ)分開(kāi),盡在使用的時(shí)候才初始化

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

  • -fssa-backprop
    在定義鏈上傳播相關(guān)使用的信息,來(lái)簡(jiǎn)化定義

  • -fssa-phiopt
    優(yōu)化條件代碼

  • -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

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

  • -fthread-jumps
    判斷是否有double jump,并進(jìn)行優(yōu)化

  • -falign-functions
    把函數的開(kāi)始地址對齊到2的冪

  • -falign-jumps
    把分支的起點(diǎn)地址對齊到2的冪

  • -falign-loops
    把循環(huán)的開(kāi)始地址對齊到2的冪

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

  • -fcaller-saves

  • -fcrossjumping

  • -fcse-follow-jumps

  • -fcse-skip-blocks

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

  • -fdevirtualize -fdevirtualize-speculatively
    用子類(lèi)虛函數覆蓋虛函數函數指針

  • -fexpensive-optimizations

  • -fgcse -fgcse-lm
    全局的公用子表達式優(yōu)化

  • -fhoist-adjacent-loads

  • -finline-small-functions
    把小函數優(yōu)化為內聯(lián)函數

  • -findirect-inlining

  • -fipa-cp
    過(guò)程間常數傳播

  • -fipa-cp-alignment

  • -fipa-bit-cp

  • -fipa-sra
    過(guò)程間優(yōu)化,刪除未使用的參數,將值傳遞優(yōu)化為引用傳遞

  • -fipa-icf

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

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

  • -foptimize-sibling-calls
    優(yōu)化同級和尾部遞歸調用

  • -foptimize-strlen
    優(yōu)化strlen函數

  • -fpartial-inlining
    部分內聯(lián)函數

  • -fpeephole2
    機器相關(guān)優(yōu)化

  • -freorder-blocks-algorithm=stc
    塊內代碼重排優(yōu)化

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

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

  • -fsched-interblock -fsched-spec
    在不同塊間進(jìn)行重排指令

  • -fschedule-insns -fschedule-insns2

  • -fstrict-aliasing
    類(lèi)型嚴格轉換檢查

  • -fstrict-overflow
    檢查類(lèi)型是否溢出

  • -ftree-builtin-call-dce

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

  • -fcode-hoisting

  • -ftree-pre

  • -ftree-vrp

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

-O3

除了執行O2所有的優(yōu)化選項之外,一般還會(huì )采用很多向量化算法,提高程序的并行度,并利用CPU的流水線(xiàn)和cache來(lái)加快運行速度,

這個(gè)選項會(huì )加大代碼的大小,并降低目標代碼的執行時(shí)間

  • -finline-functions
    采用一些啟發(fā)式算法對函數進(jìn)行內聯(lián)

  • -funswitch-loops
    找到循環(huán)的不變條件,并移到循環(huán)外部

  • -fpredictive-commoning
    在循環(huán)間重用計算

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

  • -ftree-loop-vectorize 
    向量化優(yōu)化

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

  • -fsplit-paths

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

  • -fvect-cost-model

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

  • -fpeel-loops

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

-Os

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

  • -falign-functions
    對齊

  • -falign-jumps
    對齊

  • -falign-loops
    對齊

  • -falign-labels
    對齊

  • -freorder-blocks
    重排

  • -freorder-blocks-algorithm=stc
    重排

  • -freorder-blocks-and-partition
    重排

  • -fprefetch-loop-arrays
    預取

-Ofast

除了啟用所有O3的優(yōu)化選項之外,還會(huì )針對某些語(yǔ)言啟用部分優(yōu)化

-Og

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

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

  • -S: 編譯

  • -c: 編譯 匯編 不鏈接

  • -g: 包含調試信息

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

  • -o: 輸出編譯文件

  • -w: 忽略所有警告

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

  • -Wall: 開(kāi)啟大部分告警提示

  • -Wshadow: 作用域相關(guān)存在變量同名時(shí)發(fā)出告警

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


ref: gcc.gnu.org/onlinedocs/


*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: gcc

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>