【问题标题】: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。

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

【问题讨论】:

    标签: c++ clang llvm compiler-optimization


    【解决方案1】:

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

    【讨论】:

    • 我的问题是我有很多这样的字符串,所以编译器标志是可取的。为什么?在 O2 之后,我在 _const 部分使用字符串进行了优化,并且由于优化而遗漏了一些字符串。
    • 你调整/优化二进制结果?
    • 我在中间表示上的工作。在这个阶段仍然为时已晚,字符串已经被提升为寄存器。我试过手动运行reg2mem pass,但没有效果。
    猜你喜欢
    • 2016-04-26
    • 2015-12-19
    • 1970-01-01
    • 2014-05-23
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多