Mil*_*red 13 assembly integer constants llvm
我正在编写一个使用LLVM作为后端的编译器,我的编译器生成以下LLVM汇编代码
@0 = private constant [25 x i8] c"Hello World to %dntegers\00"
declare void @printf (i8*, i32)
define void @main () {
%1 = getelementptr [25 x i8]* @0, i32 0, i32 0
%2 = 1
tail call void @printf(i8* %1, i32 %2)
ret void
}
Run Code Online (Sandbox Code Playgroud)
但是我收到以下错误:
c.ll:8:8: error: expected instruction opcode
%2 = 1
^
Run Code Online (Sandbox Code Playgroud)
文档显示了这样的例子.
你知道如何让这个工作吗?目前,我正在使用:
%2 = add i32 0, 1 ; FIXME
Run Code Online (Sandbox Code Playgroud)
Jer*_*man 14
请参阅LLVMdev讨论"如何为寄存器分配常量?" 正如Duncan Sands指出的那样:
让我说,一般来说这样做毫无意义.由于SSA格式,如果%x设置为5,则以后无法将其设置为其他内容.因此,无论你在哪个地方使用%x,你都可以直接在那里使用5.一个常见的情况是你有一个寄存器%x,并且由于执行优化你发现实际上%x总是具有值5.你可以使用RAUW(也就是replaceAllUsesWith方法)将%x替换为5处.
该线程确实生成了几个直接使用常量的替代方法:
alloca获取一个指针,保存它,然后根据需要加载该值.有人指出,该alloca方法最终会在优化后使用寄存器.
无论如何,直接使用@ SK-logic建议的常量似乎是最干净的解决方案.