- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我遇到了 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 源代码中的两个地方。
在 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 },
在 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/
我写了几个命令来转换数据框,但我想将我写的代码简化为四个部分。第 1,2 和 3 部分用于计算第 1、2 和 3 列(计算每列重复值的次数,并完成 0 和三列最大值之间的缺失数)。第四部分是加入前面的
我试图理解应用于函数的类型参数。 我想在下面的方法中使用通用类型,但为了我的理解使用 String 和 Int。 当我如下定义一个函数时 def myfunc[Int](f:String => I
我有一个像下面这样的 DIV: // link to some js .js 在 div 中呈现最新的文章摘要。然而,它在 Calibri
我在 GridView 中有以下列,一列是日期,另一列是美元金额。我应用了格式并将 HtmlEncode 属性设置为 false,但值仍然未格式化: 这就是这些值在 GridView 中的显示方式
假设我已经定义了这些类型: data Km = Km Float deriving (Show, Eq) data Mile = Mile Float deriving (Show, Eq
我有一个关于 value in context 的小问题。 取 Just 'a',所以在这种情况下 Maybe 类型上下文中的值是 'a' 采用[3],因此在这种情况下,[a] 类型上下文中的值为3
require(quantmod) require(PerformanceAnalytics) getSymbols('INTC') x<- monthlyReturn(INTC) rollapply
我正在使用 VBA 对“已应用字轨更改”文档进行更改。 红色段落结束标记是插入段落结束标记。(打开“跟踪更改”> 将光标放在第一段末尾 > 按 Enter > 插入新段落内容 > 格式风格不同) 我需
考虑以下代码: class A{ my_method(const B& b){ import_something_from_c(this, b.getC()); // does some
我正在为自定义 Material 分配图像。分配的图像看起来有点像素化,类似于此图像 我已经将抗锯齿设置为 4 倍。我该如何解决这个问题? 最佳答案 尝试将 Material 的 mipFilter
我将样式应用于 元素和 元素。是否可以在 上使用样式元素应用于 似乎不遵循 CSS 特异性的通常规则。这是真的吗? 示例:http://jsfiddle.net/59dpy/ 尝试将所有背景色设为红
有没有办法将垂直虚线边框应用于 没有他们(边界)合并?我说的是附图上的东西——有 3 个 这里的元素,每个元素包含 2 的。如果我申请 border-right: 1px dashed black到
当我在 CSS 中对主体应用线性渐变时,如下所示 body { background: linear-gradient(#10416b, black); } 它不会将它应用到整个网页,而是将它应用到页
当我将边框和边框半径应用于 td 时,内半径是一个直 Angular ,根本不是圆的。 最佳答案 问题很可能是背景不透明的子元素会剪掉边框的内半径。 要解决此问题,您可以在 td 上应用 overfl
基本上,我有一个小的 SVG,它使用一个组来定义一个可重用的符号。该组包括我想在 CSS 中设置动画的路径。我面临的问题是只有“原始”元素应用了 CSS,“使用过”的元素没有。 .player_arr
宽度属性在这里不起作用: td { height: 50px; width: 25px; border: 1px
我想要一个函数(例如)在两种情况下输出 Map 的所有值: Map map1 = new HashMap(); Map map2 = new HashMap(); output(map1, "1234
我被要求将我们应用中的警报对话框的外观与应用主题使用的外观相匹配。 我设法将样式应用于应用程序中的所有警报对话框,并将其用作应用程序主题的一部分,但有些情况下样式应用不正确。 例如,当警报对话框包含“
我有一个 CGPath(由 UIBezierPath 创建),我想通过应用 CGAffineTransformScale 将其缩放到我想要的任何大小。 这会影响我的绘图质量(在转换为图像时)吗?如果不
您好,我已经在 vector 上使用了一些 STL 算法,例如 find_if、count_if、sort、push_back 等。现在我想为所有容器对象( vector 、列表、映射、集合)制作一个
我是一名优秀的程序员,十分优秀!