Compiler construction LLVM无操作指令?

Compiler construction LLVM无操作指令?,compiler-construction,llvm,compiler-optimization,Compiler Construction,Llvm,Compiler Optimization,我正在为一种有空语句的语言的赋值编写编译器。 对于像if-then-else这样的结构,如果我可以在llvm中使用no-op语句,可能会很方便,但我没有找到任何“官方”nop。我有一些想法,但理想情况下,我希望llvm能够优化代码的这一部分并删除指令;有什么建议吗?IR中没有操作码。但是您可以安全地使用任何无副作用的死指令作为替代(也就是说,如果您真的需要发出no-op),因为优化器很容易删除它们。例如,%nop=addi10,0或%nop=alloca i1,i10可以工作。看看这个内在的:

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

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

看看这个内在的:

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


llvm.donothing内在函数不执行任何操作。它是仅有的两个可以通过调用指令调用的内部函数(除了llvm.experional.patchpoint之外)之一。

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

  • 这简化了代码生成,没有其他代码存在或不存在的特殊情况
  • 优化器将这些转换为phi指令
  • 它使代码的意图向开发人员明确。将来,您或其他人将不需要了解为什么要插入此额外指令
  • 例如:

        %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
    
    %2=icmp sgt i32%0,%1
    br i1%2,标签%3,标签%7
    ; :3.
    ;   ;; [为简单起见,已对方框中的说明进行了编辑]
    br标签%8
    ; :7.
    br标签%8
    ; :8.
    %9=负载i32*%x,对齐4;;继续我们的快乐之路
    
    可以实现预取和冗余类型转换以获得无操作效果()为什么不需要操作?我真的不需要它们;但这将是一个简单/快速的解决方案