【问题标题】:What does the GCC function suffix .constprop mean?GCC 函数后缀 .constprop 是什么意思?
【发布时间】:2013-01-25 15:25:06
【问题描述】:

查看 C++ 程序的反汇编,我看到类似 _Z41__static_initialization_and_destruction_0ii.constprop.221 的函数。在这种情况下,constprop 是什么意思?它在外观上似乎与isra 后缀相似(有时会组合在一起,例如.isra.124.constprop.226),但它的含义不同。

【问题讨论】:

    标签: gcc name-mangling


    【解决方案1】:

    从我读过的源代码 cmets - 它们表示在优化期间已克隆的函数。

    编辑:这可能是答案,也可能不是。

    简单的常量传播

    这个文件实现了常量传播和合并。它查找仅涉及常量操作数的指令,并将它们替换为常量值而不是指令。例如:

    add i32 1, 2
    

    变成

    i32 3
    

    注意:这个 pass 习惯于使定义失效。运行此通道后的某个时间运行 DIE(死指令消除)通道是个好主意。

    SOURCE

    【讨论】:

    • 你知道正在执行什么优化吗?
    • 酷。看起来它可能是过程间的常量传播,因为它创建了函数的多个版本。虽然该文档是针对 LLVM 的,但我想类似的事情也必须适用于 GCC。
    • 复活旧线程总是很有趣。 :) 我不是 gcc 开发人员,但我会为此添加一些内容。如果你有一个静态函数并且你碰巧用一个或一些参数的某个常量(或多个常量)调用它,gcc 可以为参数值的组合创建一个优化版本。这种现象可以通过非常有趣的方式加以利用。
    • @DanielSantos 谢谢,这帮助我弄清楚为什么我的 always_inline 函数没有内联,而是 call-ed。
    • @YoYoYonnY 根据您要执行的操作,这可能是个问题,这也是添加 flatten 函数属性的原因。如果你用这个属性定义了 calling 函数,它应该强制内联(它可以的一切)。我认为它不这样做的原因是因为编译器认为常量传播版本更好。前段时间我和一个 gcc 开发人员讨论过这个问题,但我记不起所有的细微差别。
    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2022-01-23
    • 2022-08-21
    相关资源
    最近更新 更多