Clang 和 '-O2' - 禁用特定优化

Posted

技术标签:

【中文标题】Clang 和 \'-O2\' - 禁用特定优化【英文标题】:Clang and '-O2' - disable specific optimizationClang 和 '-O2' - 禁用特定优化 【发布时间】:2020-07-19 04:45:57 【问题描述】:

出于性能原因,我必须在我的代码中使用 -O2 优化级别。问题是编译器将短字符串(8 字节或更少)提升为寄存器,例如:

__text:00000000001348DA                 mov     rcx, 3D3D3D3D3D3D3D3Dh
__text:00000000001348E4                 mov     [rax+10h], rcx
__text:00000000001348E8                 mov     [rax+8], rcx
__text:00000000001348EC                 mov     rcx, 3D3D3D3D3D3D3D0Ah

等于加载字符串“\n========================”。

我需要将字符串保存为数据常量,防止将它们提升为寄存器。而且我必须保持 -O2 优化以提高性能。 clang 基于 LLVM 10。

我正在询问或帮助,因为我找不到关闭此类优化通过的标志。

【问题讨论】:

【参考方案1】:

将这些特定字符串声明为 volatile 应该可以防止这种情况发生,但是,真正的问题是为什么它对您不利?

【讨论】:

我的问题是我有很多这样的字符串,所以编译器标志是可取的。为什么?在 O2 之后,我在 _const 部分使用字符串进行了优化,并且由于优化而遗漏了一些字符串。 你调整/优化二进制结果? 我在中间表示上的工作。在这个阶段仍然为时已晚,字符串已经被提升为寄存器。我试过手动运行reg2mem pass,但没有效果。

以上是关于Clang 和 '-O2' - 禁用特定优化的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 .xcconfig 禁用特定的 clang 诊断?

clang 格式:禁用排序包括

Clang 优化级别

如何禁用 LLVM 中的优化

如何正确禁用包括按clang格式排序?

在gcc编译器中禁用特定优化(死代码消除)