我试图通过一次执行多项操作来利用指令组合来使我的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
指令将多个寄存器变量加在一起时,会出现问题。
答案 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值,因此您需要命名它们(或使用位置命名)。