GCC编译选项作用 “每日读书”

gcc -O1

  • -fauto-inc-dec:自动递增和递减操作,编译器会自动识别并优化。
  • -fbranch-count-reg:开启条件分支计数寄存器,帮助编译器更好地预测控制流。
  • -fcombine-stack-adjustments:合并栈调整,编译器会尝试合并相邻的栈调整操作。
  • -fcompare-elim:消除比较操作,编译器会尝试消除不必要的比较操作。
  • -fcprop-registers:传播寄存器,编译器会尝试将变量保留在寄存器中,以减少内存访问。
  • -fdce: dead code elimination,消除无用代码,编译器会删除未被引用的代码。
  • -defer-pop:延迟弹出,编译器会延迟弹出栈帧,以提高性能。
  • -delayed-branch:延迟分支,编译器会尝试延迟分支操作,以提高预测准确性。
  • -fdse:数据流分析和优化,编译器会对代码进行数据流分析,并进行相应的优化。
  • -fforward-propagate:向前传播,编译器会尝试向前传播函数调用的结果,以减少重复计算。
  • -guess-branch-probability:猜测分支概率,编译器会尝试预测分支的概率,以提高预测准确性。
  • -if-conversion2:整数到浮点数的转换,编译器会尝试进行整数到浮点数的转换。
  • -inline-functions-called-once:内联函数调用,编译器会将只被调用一次的函数内联,以提高性能。
  • -ipa-pure-const:纯常量传播,编译器会尝试传播纯常量,以减少计算。
  • -ipa-profile:Profile guided optimization,编译器会根据Profile信息进行优化。
  • -ipa-reference:引用计数优化,编译器会尝试优化引用计数,以提高性能。
  • -merge-constants:合并常量,编译器会尝试合并相邻的常量。
  • -move-loop-invariants:移动循环不变量,编译器会尝试将循环不变量移动到循环之外,以减少重复计算。
  • -reorder-blocks:重新排序块,编译器会尝试重新排序基本块,以提高性能。
  • -shrink-wrap:收缩包装,编译器会尝试收缩包装,以减少内存访问。
  • -shrink-wrap-separate:收缩包装分离,编译器会尝试收缩包装,以减少内存访问。
  • -split-wide-types:拆分宽类型,编译器会尝试拆分宽类型,以提高内存访问效率。
  • -ssa-backprop:静态单赋值分析反向传播,编译器会尝试进行静态单赋值分析反向传播,以提高性能。
  • -ssa-phiopt:静态单赋值分析和优化,编译器会尝试进行静态单赋值分析和优化。
  • -store-merging:存储合并,编译器会尝试合并相邻的存储操作。
  • -ftree-bit-ccp:树位计数和压缩,编译器会尝试进行树位计数和压缩,以减少内存访问。
  • -ftree-ccp:树压缩和指针分析,编译器会尝试进行树压缩和指针分析,以提高性能。
  • -ftree-ch:树 Ch 优化,编译器会尝试进行树 Ch 优化,以提高性能。
  • -ftree-coalesce-vars:树合并变量,编译器会尝试合并树中的变量,以减少内存访问。
  • -ftree-copy-prop:树复制传播,编译器会尝试进行树复制传播,以减少重复计算。
  • -ftree-dce:树无用代码消除,编译器会尝试消除树中的无用代码。
  • -ftree-dominator-opts:树支配者优化,编译器会尝试进行树支配者优化,以提高性能。
  • -ftree-dse:树数据流分析和优化,编译器会对代码进行数据流分析,并进行相应的优化。
  • -ftree-forwprop:树向前传播,编译器会尝试向前传播树中的结果,以减少重复计算。
  • -ftree-fre:树自由变量消除,编译器会尝试消除树中的自由变量,以减少内存访问。
  • -ftree-phiprop:树 phi 函数优化,编译器会尝试优化树中的 phi 函数,以提高性能。
  • -ftree-sink:树下沉,编译器会尝试将操作下沉到树中,以提高性能。
  • -ftree-slsr:树短循环优化,编译器会尝试进行树短循环优化,以提高性能。
  • -ftree-sra:树右移分析,编译器会尝试进行树右移分析,以提高性能。
  • -ftree-pta:树 PTA 优化,编译器会尝试进行树 PTA 优化,以提高性能。
  • -ftree-ter:树终结,编译器会尝试进行树终结,以提高性能。
  • -funit-at-a-time:一次性单元优化,编译器会尝试进行一次性单元优化,以提高性能。

gcc -O2优化

  • -fthread-jumps:跳转 threading 优化。
  • -falign-functions:函数对齐优化。
  • -falign-jumps:跳转对齐优化。
  • -falign-loops:循环对齐优化。
  • -falign-labels:标签对齐优化。
  • -fcaller-saves:调用者保存优化。
  • -fcrossjumping:交叉跳转优化。
  • -fcse-follow-jumps:跟随跳转的 CSE 优化。
  • -fcse-skip-blocks:跳过块的 CSE 优化。
  • -fdelete-null-pointer-checks:删除空指针检查。
  • -fdevirtualize:虚函数调用优化。
  • -fdevirtualize-speculatively:推测性的虚函数调用优化。
  • -fexpensive-optimizations:启用一些代价高昂的优化。
  • -fgcse:全局 CSE 优化。
  • -fgcse-lm:使用链接时内存的全局 CSE 优化。
  • -fhoist-adjacent-loads:提升相邻加载优化。
  • -finline-small-functions:内联小函数优化。
  • -findirect-inlining:间接内联优化。
  • -fipa-cp:函数内联分析的 Cp 优化。
  • -fipa-cp-alignment:使用 Cp 进行函数内联分析的对齐优化。
  • -fipa-bit-cp:使用位 Cp 进行函数内联分析的优化。
  • -fipa-sra:使用 SRA 进行函数内联分析的优化。
  • -fipa-icf:函数内联调用成本的优化。
  • -fisolate-erroneous-paths-dereference:分离错误路径的引用优化。
  • -flra-remat:LRA 重排的优化。
  • -foptimize-sibling-calls:同胞函数调用优化。
  • -foptimize-strlenstrlen函数的优化。
  • -fpartial-inlining:部分内联优化。
  • -fpeephole2:Peephole 优化。
  • -freorder-blocks-algorithm=stc:使用栈和树的块重排算法。
  • -freorder-blocks-and-partition:块重排和分区优化。
  • -freorder-functions:函数重排优化。
  • -frerun-cse-after-loop:循环后运行 CSE 优化。
  • -fsched-interblock:基本块间调度优化。
  • -fsched-spec:使用 SSA 形式的调度器。
  • -fschedule-insns2:基本块内调度优化。
  • -fstrict-aliasing:严格别名优化。
  • -fstrict-overflow:严格的溢出检查。
  • -ftree-builtin-call-dce:内置调用的 DCE 优化。
  • -ftree-switch-conversion:树开关转换优化。
  • -ftree-tail-merge:树尾合并优化。
  • -fcode-hoisting:代码提升优化。
  • -ftree-pre:树前序遍历优化。
  • -ftree-vrp:使用 VRP 进行树优化。
  • -fipa-ra:基于引用计数的别名分析优化。

gcc -O3选项

  • -finline-functions:采用一些启发式算法对函数进行内联,它可以将一些函数调用直接替换为函数代码,从而减少函数调用的开销,提高程序的运行效率。
  • -funswitch-loops:执行循环unswitch变换,它可以将一些循环结构转换为更高效的形式,从而提高程序的运行效率。
  • -fpredictive-commoning:执行预测性的共同子表达式消除,它可以在编译时分析代码中的数据流,并预测哪些表达式可以被消除,从而减少程序的运行时间和空间复杂度
  • -fgcse-after-reload:执行全局的共同子表达式消除,它可以在编译时分析代码中的数据流,并消除一些重复计算的子表达式,从而减少程序的运行时间和空间复杂度。
  • -ftree-loop-vectorize:执行循环向量化,它可以将一些循环中的操作转化为向量操作,从而提高程序的并行性和运行效率。
  • -ftree-loop-distribute-patterns:执行循环分布模式,它可以将一些循环中的操作分布到多个处理器上执行,从而提高程序的并行性和运行效率。
  • -fsplit-paths:执行路径分裂,它可以将一些控制流路径分裂成多个路径,从而提高程序的并行性和运行效率。
  • -ftree-slp-vectorize:执行 SLP 向量化成,它可以将一些循环中的操作转化为 SLP 向量操作,从而提高程序的并行性和运行效率。
  • -fvect-cost-model:采用向量成本模型,它可以在编译时分析代码中的向量操作,并选择最优化的向量指令,从而提高程序的运行效率。
  • -ftree-partial-pre:执行部分预取,它可以在编译时分析代码中的数据流,并预测哪些数据可以被提前读取,从而减少程序的运行时间和空间复杂度。
  • -fpeel-loops:执行循环剥皮,它可以将一些循环中的操作提取到循环体外执行,从而减少循环的执行次数,提高程序的运行效率。
  • -fipa-cp-clone:这是一个与函数内联相关的选项,用于控制inline函数的行为。它可以决定是否在调用点进行内联,是否对函数进行克隆,以及如何处理内联函数的调用和返回。

gcc -Os

  • -falign-functions:这个选项告诉编译器在函数定义时按照指定的边界对齐,以提高内存访问效率。
  • -falign-jumps:这个选项告诉编译器在生成跳转指令时按照指定的边界对齐,以提高指令流水线的效率。
  • -falign-loops:这个选项告诉编译器在循环代码中按照指定的边界对齐,以提高循环的效率。
  • -falign-labels:这个选项告诉编译器在生成标签时按照指定的边界对齐,以提高跳转到标签的效率。
  • -freorder-blocks:这个选项告诉编译器重新排列基本块的顺序,以提高代码的执行效率。
  • -freorder-blocks-algorithm=stc:这个选项告诉编译器使用stc算法来重新排列基本块的顺序,stc算法是一种基于静态单赋值(SSA)形式的算法。
  • -freorder-blocks-and-partition:这个选项告诉编译器在重新排列基本块的顺序时,同时考虑分区,以提高代码的并行性。
  • -prefetch-loop-arrays:这个选项告诉编译器在循环中预取数组,以提高内存访问效率。

扩展补充

C语言参数可以通过寄存器或数据栈来传递。具体来说,当参数不超过4个时,可以使用寄存器R0到R3来传递参数;当参数超过4个时,可以使用数据栈来传递参数。

x64 6参数以内都用寄存器传递参数更多

rdi rsi rdx rcx r8 r9

armv7平台寄存器

  • 30个通用寄存器:r0-r12,r13(sp),r14(lr),r15(pc)。其中,r13用作堆栈,r14用作链接寄存器,r15用作程序计数器。
  • 6个状态寄存器:cpsr,spsr。

有16个128位向量寄存器,用q0-q15表示,每个q寄存器又可以拆分成两个64位向量寄存器,用d0-d31表示。

armv8

提供了31个64位的通用寄存器,分别命名为X0到X30,其中X0寄存器也被称为零寄存器,用于存储常量0。每个寄存器都是64位的

函数调用时前8个参数用通用寄存器(X0~X7)传递,其余的参数用栈传递

向量寄存器v0-v31(芯片厂家不同会有区别)

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值