gpt4 book ai didi

c - GCC 4.6.3 Linux -O3 启用优化列表与应用于代码差异。优化顺序是否影响代码编译?

转载 作者:IT王子 更新时间:2023-10-29 00:35:17 26 4
gpt4 key购买 nike

我遇到了 GCC 4.6.3 的问题,我找不到任何逻辑解决方案/解释。我正在从事一个将带有操作系统的嵌入式固件应用程序移植到基于 Linux 的应用程序的项目。该应用程序有一大堆单元测试,可以通过参数激活这些单元测试以检查代码/功能的完整性。

当我在调试中编译时,一切都 100% 正常并且所有单元测试都通过了。但是,我在发布构建时遇到了问题(使用 -O3 优化)。我设法隔离了有问题的文件。该文件来 self 们未编码的外部包,我们根本不想更改它。

我查阅了 GCC 的文档以获得 -O3 中包含的所有优化。这是我得到的:

-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“启用”。我做了,这是输出:

-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 优化,它就会通过。最后,如果我使用除 -fschedule-insns 之外的 GCC 文档中列出的所有 -O3 优化,它就会通过。

-O3 的真正优化列表是什么!?! GCC 的文档或 GCC 通过命令行告诉的内容?我很困惑,不知道如何对此做出积极/合乎逻辑的解释。

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

最佳答案

好问题。您刚刚发现,与往常一样,来源是唯一的真理。甚至还有一个 bug in GCC's Bugzilla为此。

我会提请您注意 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
    /* Only run the pre-regalloc scheduling pass if optimizing for speed. */
    { 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 行,我们看到

    static const struct default_options ix86_option_optimization_table[] =
    {
    /* Turn off -fschedule-insns by default. It tends to make the
    problem with not enough registers even worse. */
    #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 级别,某些通行证实际上在某些目标上被禁用。特别是,x86、mep 和 mcore 派生目标默认在所有优化级别禁用schedule-insns,即使它应该在-启用O2 及以上。您仍然可以手动强制启用它,但您首先要承担禁用它的风险。

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

关于c - GCC 4.6.3 Linux -O3 启用优化列表与应用于代码差异。优化顺序是否影响代码编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25121819/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com