GCC函数后缀.constprop是什么意思?

nne*_*neo 13 gcc name-mangling

看一下C++程序的反汇编,我看到了类似的函数_Z41__static_initialization_and_destruction_0ii.constprop.221.constprop这种情况下的意思是什么?它看起来在外观上与isra后缀相似(有时结合起来,例如.isra.124.constprop.226),但它意味着别的东西.

zaf*_*zaf 5

从我已阅读的源代码注释中,它们表明在优化过程中已克隆的函数。

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

简单的恒定传播

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

add i32 1, 2
Run Code Online (Sandbox Code Playgroud)

变成

i32 3
Run Code Online (Sandbox Code Playgroud)

注意:此通行证有使定义失效的习惯。在运行此过程之后的某个时间运行DIE(失效指令消除)过程是个好主意。

资源

  • 复活旧线程总是很有趣。:)我不是gcc开发人员,但是我将为此添加一些内容。如果您有一个静态函数,并且碰巧用一个或多个常数为其某个或多个参数调用它,则gcc可以仅为该参数值的组合创建优化版本。可以以非常有趣的方式利用这种现象。 (3认同)
  • @DanielSantos 谢谢,这帮助我弄清楚为什么我的 `always_inline` 函数没有内联,而是 `call`-ed。 (2认同)
  • @YoYoYonnY取决于您要执行的操作,这可能是一个问题,这就是添加了`flatten`函数属性的原因。如果使用此属性定义了* calling *函数,则它应强制进行内联(可能的所有内容)。我*认为*之所以没有这样做,是因为编译器认为常量传播的版本更好。我与gcc开发人员进行了一段时间的讨论,但我不记得所有的细微差别。 (2认同)