预先评估LLVM IR

时间:2016-11-09 00:34:15

标签: c++ llvm llvm-ir

假设我们有以下表达式:

  %rem = srem i32 %i.0, 10
  %mul = mul nsw i32 %rem, 2
  • %i.0是llvm :: PHINode,我可以获得界限。

问题是:在编译期间有没有办法获得%mul的值?我正在写一个llvm Pass,我需要评估一些使用%i.0的表达式。我正在搜索函数,类或其他我将给%i.0赋值的函数,它将评估表达式并返回结果。

1 个答案:

答案 0 :(得分:2)

您可以克隆代码(包含函数或整个模块,具体取决于您需要多少上下文),然后用常量值替换%i.0,在代码上运行常量传播传递,最后检查是否将%mul分配给常量值,如果是,则将其解压缩。

它并不优雅,但我认为它会起作用。请注意:

  1. 确保%mul未被删除 - 例如,将其从函数中返回,或将其值存储到内存或其他内容。
  2. 请注意,常量传播假定代码有些事情,特别是它已经通过mem2reg传递。