LLVM程序集:为寄存器分配整数常量

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建议的常量似乎是最干净的解决方案.