为什么LLVM需要新的临时寄存器标识符

时间:2013-11-20 12:29:13

标签: llvm

我向编译器添加了一些新的测试,这些测试生成了以下内容但是给出了预期的%4错误。

; Entry Point
   define i32 @main(i32 %argc, i8** %argv) {
   entry:
      %argc_addr = alloca i32
      %argv_addr = alloca i8**
      %retval = alloca i32
      %0 = alloca i32
      store i32 %argc, i32* %argc_addr
      store i8** %argv, i8*** %argv_addr
      %1 = load i32* %argc_addr
      %2 = load i8*** %argv_addr
      call void @__llvmsharp_init(i32 %1, i8** %2)
      call i32 @__LS19ConsoleApplication37Program_mt_4Main()
      store i32 0, i32* %0, align 4
      %3 = load i32* %0, align 4

//错误预期%4

      store i32 %3, i32* %retval
      br label %return

 return:
      %retval1 = load i32* %retval
      ret i32 %retval1
 }

使用未命名的临时工也是明智的。

1 个答案:

答案 0 :(得分:4)

%3%4等既不是临时的也不是寄存器 - LLVM IR中不存在的两个概念 - 相反,它们是指令的名称。我建议您阅读有关single static assignment表单的更多信息,以了解其工作原理。

在LLVM IR的文本表示中,没有任何名称的非void指令被分配了数字名称,例如%3%4,以及是否在代码中隐式或显式分配,这些数字必须是连续的。指令call i32 @__LS19ConsoleApplication37Program_mt_4Main()是非空的,因此隐式分配了一个数字 - %3 - 所以下一个未命名的指令load i32* %0, align 4应该被赋予%4,而不是%3

如果您手动编写LLVM IR并且在指令命名方面遇到问题,可以考虑使用my LLVM IR editor plugin for Eclipse,它会为您标记此类错误,并提供用正确的错误替换任何错误的数字:

  

screenshot from the editor showing syntax error on bad name

(注意未命名的add i32 %1, 1是如何隐式分配的%2