【发布时间】:2012-10-20 21:01:43
【问题描述】:
在编译一些代码时,我注意到在 -O0 和 -O1 之间创建的汇编程序存在很大差异。我想通过启用/禁用优化,直到我发现是什么导致了汇编程序的某些变化。
如果我使用 -fverbose-asm 来准确找出 O1 与 O0 相比启用了哪些标志,然后手动禁用它们,为什么生成的汇编程序仍然存在如此巨大的差异?即使我使用 O0 运行 gcc 并手动添加 fverbose-asm 所说的使用 O1 启用的所有标志,我也无法获得与仅使用 O1 相同的汇编程序。
除了 '-f...' 和 '-m...' 还有什么可以改变的吗?
或者只是'O1'与'O0'相比有一些无法关闭的魔力。
抱歉,这与Reducing stack usage during recursion with GCC + ARM 有关,但提到它使问题有点难以理解。
【问题讨论】:
-
所以问题是您不知道增加堆栈使用的“违规优化”的名称(或杀手组合),而且您也不知道您需要来自
-Os的优化名称?其中“不知道名称”包括它们根本没有名称的可能性,它们是由O1或Os启用的杂项额外优化,无法单独控制。 -
是的 - 基本上我知道 GCC 说它已启用的所有标志(通过 -fverbose-asm)。但是手动禁用它们并不能解决问题,所以它一定是我无法控制的一些“魔法”。但是,我刚刚发现(请参阅链接的问题)O0 仍然存在问题,只是方式不同。不过,如果知道这个问题是否有答案仍然是件好事——因为无法控制优化是很可怕的。
-
您是否尝试过使用 GCC 的
attribute(())或以其他方式重写函数(例如,将变量设为静态或手动分配它们的空间)?作为最后机会的解决方案,有问题的函数可以在汇编中重写。 -
您确定这是优化吗?即使在 -O0 的情况下,您是否也查看过汇编程序的输出?我很确定 gcc 总是会生成这样的代码,因为它是生成代码的最简单方法。我现在没有要验证的 arm gcc,但无论如何,这可能会在编译器的机器独立部分中处理。
-
嗨,我刚刚更新了这个问题,试图让它更清楚(并且与其他问题不同),很抱歉造成混乱。