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

时间:2011-06-16 15:25:10

标签: assembly integer constants llvm

我正在编写使用LLVM作为后端的a compiler,我的编译器生成以下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
}

但是我收到以下错误:

c.ll:8:8: error: expected instruction opcode
  %2 = 1
       ^

文档显示examples like that

你知道如何让它发挥作用吗?目前,我正在使用:

  %2 = add i32 0, 1 ; FIXME

2 个答案:

答案 0 :(得分:14)

参见LLVMdev讨论"How to assign a constant to a register?"正如Duncan Sands所指出的那样:

  

让我说,一般来说这样做毫无意义。由于SSA格式,如果%x设置为5,则以后无法将其设置为其他内容。因此,无论你在哪个地方使用%x,你都可以直接在那里使用5。一个常见的情况是你有一个寄存器%x,并且由于执行了优化,你发现实际上%x总是具有值5.你可以使用RAUW(也就是replaceAllUsesWith方法)将%x替换为5处。< / p>

该线程确实生成了几个直接使用常量的替代方法:

  • 使用alloca获取指针,存储指针,然后根据需要加载值。
  • 创建指向常量的全局,然后根据需要加载该值。

有人指出alloca方法最终会在优化后使用寄存器。

无论如何,直接使用@ SK-logic建议的常量似乎是最干净的解决方案。

答案 1 :(得分:0)

%1是unnamed。请改用%name_here。