使用LLVM-gcc或gcc进行部分评估/专业化

Nig*_*r88 5 c++ optimization evaluation llvm partial

我对c/c ++的(部分)编译时评估非常感兴趣(不是像c ++中的模板参数).让我们考虑以下情况(取自[1]):

double mypower(double x, int n) {
  int i;
  double ret = x;
  for (i = 1; i < n; i++) {
    ret *= x;
  }
  return ret;
}
Run Code Online (Sandbox Code Playgroud)

然后在代码中的某处调用此函数:

mypower(x,3); // y varies all the time, 
Run Code Online (Sandbox Code Playgroud)

然后编译器可以优化它(例如循环展开).我使用的一些常用函数可以从优化中获益(通过手动创建专用函数进行测试).演示文稿[1]描述了一个搜索函数的过程,并由函数的专用版本替换.这似乎有效.但它似乎并不是非常普遍,需要为应该替换的函数编写代码.

该演示文稿似乎是从2008年开始,我找不到比此来源更多的信息.那么从那时起有什么改进吗?我更喜欢某种自动化,它对可能由属性语法控制的所有函数都做同样的事情(例如__attribute__(peval)......).此外,我希望同样适用于面向对象的代码,为不同的对象创建专门的类([2]似乎暗示这是不可能的).

另外,我希望这种专业化不仅适用于代码中的常量.我正在考虑编译为LLVM IR(字节码)的程序可以执行以下操作:

  1. 在解释器的初始化阶段运行程序,在初始化阶段,程序可以从文件中读取一些配置.初始化后,解释器停止.

  2. 从那一点开始修复一些变量(包括成员变量).提取这些变量(例如,在编译期间由属性标记).

  3. 创建专门的函数和类.将这些克隆到字节码中.

  4. 运行JIT以创建本机机器代码.

这是我要求的很多,只有少数计算密集型程序可以从这种优化中受益.但是有些人必须在努力.我可能只是不知道正确的搜索条件来提供谷歌.

注意:请不要建议使用非类型参数或手动专业化的模板类,我已经这样做了.我只是希望编译器为我工作.

链接:

[1] 介绍如何在LLVM中进行部分评估

[2] 关于部分评估的论坛信息

ech*_*sto 1

这主要是在过程间优化领域。llvm 有其中一些,特别是 IP 常量传播,只有当您在翻译单元中的所有调用站点使用 mypower(x, 3) 时,这才会有帮助。你所描述的是可能的,但还没有真正做到。改进 IPCP 传递是您想要考虑的事情 - 通过让它克隆并专门化特定调用站点的函数。如果您有足够的翻译单元,这可能会导致一些相当大的代码膨胀,但这就是为什么人们没有真正考虑这样做的原因。

当您可以查看程序中的所有调用时,这可能在 LTO 级别上有更多用处。