为什么在指令组合中不能使用虚拟寄存器变量?

时间:2020-07-26 02:21:36

标签: 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 = 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指令将多个寄存器变量加在一起时,会出现问题。

1 个答案:

答案 0 :(得分:2)

好吧。因为这不是有效的LLVM IR :)中的代码

    %sum = add i32
        add (i32 1, i32 2),
        add (i32 3, i32 4)

代表所谓的常量表达式(https://llvm.org/docs/LangRef.html#constant-expressions),因此有效。

指令的参数必须是SSA值,因此您需要命名它们(或使用位置命名)。

相关问题