Llvm 为什么我能';在指令合成中不使用虚拟寄存器变量?

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

我试图通过一次执行多个操作,利用指令组合使我的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 = 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值都需要名称。常量值是唯一的(这是相同的值,不能创建常量的第二个实例),因此它们是匿名的。这里的关键点是没有“内部”或“运行时”临时值以及“编译时值”。