Llvm 为什么我能';在指令合成中不使用虚拟寄存器变量?
我试图通过一次执行多个操作,利用指令组合使我的LLVM IR代码更具可读性。我有四个虚拟寄存器变量,我想将它们相加,并将结果存储到一个Llvm 为什么我能';在指令合成中不使用虚拟寄存器变量?,llvm,llvm-ir,instructions,Llvm,Llvm Ir,Instructions,我试图通过一次执行多个操作,利用指令组合使我的LLVM IR代码更具可读性。我有四个虚拟寄存器变量,我想将它们相加,并将结果存储到一个%sum变量中 这是我的密码: target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" target triple = "x86_64-unknown-linux-gnu" define i32 @main() { %obj1 = insertvalu
%sum
变量中
这是我的密码:
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define i32 @main() {
%obj1 = insertvalue {i32, i32} {i32 2, i32 3}, i32 2, 0
%obj2 = insertvalue {i32, i32} %obj1, i32 7, 1
%1 = extractvalue {i32, i32} %obj1, 0
%2 = extractvalue {i32, i32} %obj1, 1
%3 = extractvalue {i32, i32} %obj2, 0
%4 = extractvalue {i32, i32} %obj2, 1
%sum = add i32
add (i32 %1, i32 %2),
add (i32 %3, i32 %4)
ret i32 %sum
}
在我看来,这段包含指令组合的代码(将多个虚拟寄存器变量添加到一起)在语法上是正确的。但是,编译器(或汇编程序)显示错误:
$ llvm-as insertvalue_test.ll -o insertvalue_test.bc
llvm-as: insertvalue_test.ll:14:18: error: invalid use of function-local name
add (i32 %1, i32 %2),
^
我不知道那个错误是什么意思。即使我将虚拟寄存器变量替换为常量,代码也可以正常编译和运行:
%sum = add i32
add (i32 1, i32 2),
add (i32 3, i32 4)
另外,当我尝试使用一条add
指令将这两个寄存器变量相加时,效果也不错
%sum = add i32 %1, %2
但是,当我试图在指令组合中使用多个
add
指令将多个寄存器变量添加到一起时,就会出现问题。很好。因为这不是有效的LLVM IR:)中的代码
%sum = add i32
add (i32 1, i32 2),
add (i32 3, i32 4)
表示所谓的常量表达式(),因此是有效的
指令的参数必须是SSA值,因此您需要命名它们(或使用位置命名)。。因为这不是有效的LLVM IR:)中的代码
%sum = add i32
add (i32 1, i32 2),
add (i32 3, i32 4)
表示所谓的常量表达式(),因此是有效的
指令的参数必须是SSA值,因此您需要命名它们(或使用位置命名)。因此,如果我理解正确,关键是LLVM不会为内部临时文件命名,因为它是运行时临时文件。但是两个常量的总和可以成为一个编译时值,而不需要名称。所有SSA值都需要名称。常量值是唯一的(这是相同的值,不能创建常量的第二个实例),因此它们是匿名的。这里的关键点是,没有“内部”或“运行时”临时变量以及“编译时值”。因此,如果我理解正确,关键点是,当内部临时变量是运行时临时变量时,LLVM不会为其命名。但是两个常量的总和可以成为一个编译时值,而不需要名称。所有SSA值都需要名称。常量值是唯一的(这是相同的值,不能创建常量的第二个实例),因此它们是匿名的。这里的关键点是没有“内部”或“运行时”临时值以及“编译时值”。