LLVM无操作指令?

时间:2011-11-18 19:31:22

标签: compiler-construction llvm compiler-optimization

我正在为具有空语句的语言编写一个编译器。 对于像if-then-else这样的结构,如果我可以在llvm中使用no-op语句,但我没有找到任何“官方”nop,这可能很方便。我有一些想法,但理想情况下我想让llvm优化代码的这一部分并删除指令;有什么建议吗?

3 个答案:

答案 0 :(得分:6)

IR中没有无操作操作码。但是你可以安全地使用任何无副作用的死指令作为替代(也就是说,如果你真的需要发出no-op),因为优化器会很容易地删除它们。例如。 %nop = add i1 0, 0%nop = alloca i1, i1 0可以有效。

答案 1 :(得分:6)

看看这个内在:

declare void @llvm.donothing() nounwind readnone
来自LLVM语言参考手册:

llvm.donothing内在函数不执行任何操作。它是仅有的两个内在函数(除了llvm.experimental.patchpoint)之一,可以使用invoke指令调用。

答案 2 :(得分:-1)

而不是noop或优化为noop的语句,为if条件创建标签和分支。

  1. 这简化了代码生成,没有出现或不存在的特殊情况。
  2. 优化器会将这些转换为phi说明。
  3. 它使代码的意图对开发人员显而易见。未来你或其他人不需要弄清楚为什么插入这个额外的指令。
  4. 例如:

        %2 = icmp sgt i32 %0, %1
        br i1 %2, label %3, label %7
    ; <label>:3
    ;   ;; [instructions in block redacted for simplicity]
        br label %8
    ; <label>:7
        br label %8
    ; <label>:8
        %9 = load i32* %x, align 4 ;; continue on our merry way