首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GCC 4.6.3 Linux -O3支持优化,列出了应用于代码差异的vs。优化顺序是否影响代码编译?

GCC 4.6.3 Linux -O3支持优化,列出了应用于代码差异的vs。优化顺序是否影响代码编译?
EN

Stack Overflow用户
提问于 2014-08-04 15:08:14
回答 1查看 732关注 0票数 4

我正面临着GCC 4.6.3的问题,我找不到任何逻辑的解决方案/解释。我正在进行一个将嵌入式固件应用程序与OS移植到基于Linux的应用程序的项目。应用程序有大量单元测试,可以通过参数来激活这些测试,以检查代码/特性的正确性。

当我在调试中编译时,所有东西都100%工作,所有单元测试都通过了。但是,我在版本构建( -O3优化)方面遇到了问题。我设法隔离了这个有问题的文件。这个文件来自一个我们没有编码的外部包,我们根本不想改变它。

我使用GCC的文档来获得-O3中包含的所有优化。我得到的是:

代码语言:javascript
复制
-fauto-inc-dec
-fcprop-registers
-fdce
-fdefer-pop
-fdse
-fguess-branch-probability
-fif-conversion2
-fif-conversion
-finline-small-functions
-fipa-pure-const
-fipa-reference
-fmerge-constants
-fsplit-wide-types
-ftree-builtin-call-dce
-ftree-ccp
-ftree-ch
-ftree-copyrename
-ftree-dce
-ftree-dominator-opts
-ftree-dse
-ftree-fre
-ftree-sra
-ftree-ter
-funit-at-a-time
-fomit-frame-pointer
-fthread-jumps
-falign-functions
-falign-jumps
-falign-loops
-falign-labels
-fcaller-saves
-fcrossjumping
-fcse-follow-jumps
-fcse-skip-blocks
-fdelete-null-pointer-checks
-fexpensive-optimizations
-fgcse
-fgcse-lm
-findirect-inlining
-foptimize-sibling-calls
-fpeephole2
-fregmove
-freorder-blocks
-freorder-functions
-frerun-cse-after-loop
-fsched-interblock
-fsched-spec
-fschedule-insns
-fschedule-insns2
-fstrict-aliasing
-fstrict-overflow
-ftree-switch-conversion
-ftree-pre
-ftree-vrp
-finline-functions
-funswitch-loops
-fpredictive-commoning
-fgcse-after-reload
-ftree-vectorize
-fipa-cp-clone

我发现是-fschedule-insns造成了这个问题。删除此优化使代码再次正常工作。

下面是我无法解释的,GCC的文档说,如果你想确切地知道GCC在申请什么,你可以在控制台gcc -Q -O3 --help=optimizers | grep "enabled"上写这个。我做了,这是输出:

代码语言:javascript
复制
-falign-functions                   [enabled]
-falign-jumps                       [enabled]
-falign-labels                      [enabled]
-falign-loops                       [enabled]
-fasynchronous-unwind-tables        [enabled]
-fbranch-count-reg                  [enabled]
-fcaller-saves                      [enabled]
-fcombine-stack-adjustments         [enabled]
-fcommon                            [enabled]
-fcompare-elim                      [enabled]
-fcprop-registers                   [enabled]
-fcrossjumping                      [enabled]
-fcse-follow-jumps                  [enabled]
-fdce                               [enabled]
-fdefer-pop                         [enabled]
-fdelete-null-pointer-checks        [enabled]
-fdevirtualize                      [enabled]
-fdse                               [enabled]
-fearly-inlining                    [enabled]
-fexpensive-optimizations           [enabled]
-fforward-propagate                 [enabled]
-fgcse                              [enabled]
-fgcse-after-reload                 [enabled]
-fgcse-lm                           [enabled]
-fguess-branch-probability          [enabled]
-fif-conversion                     [enabled]
-fif-conversion2                    [enabled]
-finline-functions                  [enabled]
-finline-functions-called-once      [enabled]
-finline-small-functions            [enabled]
-fipa-cp                            [enabled]
-fipa-cp-clone                      [enabled]
-fipa-profile                       [enabled]
-fipa-pure-const                    [enabled]
-fipa-reference                     [enabled]
-fipa-sra                           [enabled]
-fivopts                            [enabled]
-fjump-tables                       [enabled]
-fmath-errno                        [enabled]
-fmerge-constants                   [enabled]
-fmove-loop-invariants              [enabled]
-foptimize-register-move            [enabled]
-foptimize-sibling-calls            [enabled]
-fpeephole                          [enabled]
-fpeephole2                         [enabled]
-fpredictive-commoning              [enabled]
-fprefetch-loop-arrays              [enabled]
-fregmove                           [enabled]
-frename-registers                  [enabled]
-freorder-blocks                    [enabled]
-freorder-functions                 [enabled]
-frerun-cse-after-loop              [enabled]
-frtti                              [enabled]
-fsched-critical-path-heuristic     [enabled]
-fsched-dep-count-heuristic         [enabled]
-fsched-group-heuristic             [enabled]
-fsched-interblock                  [enabled]
-fsched-last-insn-heuristic         [enabled]
-fsched-rank-heuristic              [enabled]
-fsched-spec                        [enabled]
-fsched-spec-insn-heuristic         [enabled]
-fsched-stalled-insns-dep           [enabled]
-fschedule-insns2                   [enabled]
-fshort-enums                       [enabled]
-fsigned-zeros                      [enabled]
-fsplit-ivs-in-unroller             [enabled]
-fsplit-wide-types                  [enabled]
-fstrict-aliasing                   [enabled]
-fthread-jumps                      [enabled]
-fno-threadsafe-statics             [enabled]
-ftoplevel-reorder                  [enabled]
-ftrapping-math                     [enabled]
-ftree-bit-ccp                      [enabled]
-ftree-builtin-call-dce             [enabled]
-ftree-ccp                          [enabled]
-ftree-ch                           [enabled]
-ftree-copy-prop                    [enabled]
-ftree-copyrename                   [enabled]
-ftree-cselim                       [enabled]
-ftree-dce                          [enabled]
-ftree-dominator-opts               [enabled]
-ftree-dse                          [enabled]
-ftree-forwprop                     [enabled]
-ftree-fre                          [enabled]
-ftree-loop-distribute-patterns     [enabled]
-ftree-loop-if-convert              [enabled]
-ftree-loop-im                      [enabled]
-ftree-loop-ivcanon                 [enabled]
-ftree-loop-optimize                [enabled]
-ftree-phiprop                      [enabled]
-ftree-pre                          [enabled]
-ftree-pta                          [enabled]
-ftree-reassoc                      [enabled]
-ftree-scev-cprop                   [enabled]
-ftree-sink                         [enabled]
-ftree-slp-vectorize                [enabled]
-ftree-sra                          [enabled]
-ftree-switch-conversion            [enabled]
-ftree-ter                          [enabled]
-ftree-vect-loop-version            [enabled]
-ftree-vectorize                    [enabled]
-ftree-vrp                          [enabled]
-funit-at-a-time                    [enabled]
-funswitch-loops                    [enabled]
-fvar-tracking                      [enabled]
-fvar-tracking-assignments          [enabled]
-fvect-cost-model                   [enabled]
-fweb                               [enabled]

-fschedule-insns不在列表中,如果我删除grep,它将被标记为禁用。如果我采用GCC的命令输出中列出的所有优化,并使用提供的列表编译有问题的文件,则代码仍然会传递。这里怎么了?

这是个总结。如果我直接使用-O3,它就会失败。如果我使用GCC文档中列出的所有-O3优化,它就会失败。如果我使用GCC从命令行提供的所有-O3优化,它就会通过。最后,如果我使用GCC文档中列出的所有-O3优化(不包括-fschedule-insns ),它就过去了。

-O3的真正优化列表是什么?!!GCC的文件或者GCC通过命令行告诉了什么?对于如何对此做出积极的/合乎逻辑的解释,我感到困惑和困惑。

有人和GCC遇到过这样的问题吗?

EN

回答 1

Stack Overflow用户

发布于 2014-08-04 16:34:57

问得好。你刚刚发现,和往常一样,源头是唯一的真相。这甚至有一个GCC“布奇拉”中的错误

我将提请您注意GCC源代码中的两个地方。

  1. gcc-4.6.3/gcc/opts.c第474行中,我们在默认选项表中看到以下内容: { OPT_LEVELS_2_PLUS,OPT_frerun_cse_after_loop,NULL,1 },{ OPT_LEVELS_2_PLUS,OPT_fcaller_saves,NULL,1 },{ OPT_LEVELS_2_PLUS,OPT_fpeephole2,NULL,1 },#ifdef INSN_SCHEDULING /*仅在优化速度的情况下运行重新分配前的调度传递.*/ { OPT_LEVELS_2_PLUS_SPEED_ONLY,OPT_fschedule_insns,NULL,1 },{ OPT_LEVELS_2_PLUS,OPT_fschedule_insns2,NULL,1 },#endif { OPT_LEVELS_2_PLUS,OPT_fregmove,NULL,1 },{ OPT_LEVELS_2_PLUS,OPT_fstrict_aliasing,NULL,1 },{ OPT_LEVELS_2_PLUS,OPT_fstrict_overflow,NULL,1 },{ OPT_LEVELS_2_PLUS,OPT_freorder_blocks,NULL,1 },
  2. gcc-4.6.3/gcc/config/i386/i386.c第5166行中,我们看到 默认情况下,静态构造结构default_options ix86_option_optimization_table[] ={ /*关闭-fschedule-insns。它往往会使没有足够寄存器的问题变得更糟。*/ #ifdef INSN_SCHEDULING { OPT_LEVELS_ALL,OPT_fschedule_insns,NULL,0 },#endif #ifdef SUBTARGET_OPTIMIZATION_OPTIONS SUBTARGET_OPTIMIZATION_OPTIONS,#endif { OPT_LEVELS_NONE,0,NULL,0 };

我们可以得出这样的结论:文档只是部分正确;有些传递实际上在某些目标上被禁用,甚至在通常启用的O-level上也是如此。特别是,默认情况下,x86、mep和mcore派生的目标在所有优化级别禁用schedule-insns,即使它应该在-O2和up上启用。您仍然可以手动强制启用它,但是您首先要运行禁用它的风险。

此外,如果编译器是在禁用了-fschedule_insns的情况下构建的,那么默认情况下可以在所有级别禁用INSN_SCHEDULING

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25121819

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档