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



我正在编写一个使用LLVM作为后端的编译器,我的编译器生成以下LLVM汇编代码

@0 = private constant [25 x i8] c"Hello World to %dntegers0"
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
       ^

文档中显示了类似的示例。

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

  %2 = add i32 0, 1 ; FIXME

请参阅LLVMdev讨论"如何将常量分配给寄存器?"正如Duncan Sands:所指出的那样

让我说,总的来说,这样做毫无意义。由于SSA形式的原因,如果将%x设置为5,则以后不能将其设置为其他值。因此,在任何使用%x的地方,您都可以直接在那里使用5。一种常见的情况是,您有一个寄存器%x,由于执行了优化,您发现实际上%x的值总是5。您可以使用RAUW(也称为replaceAllUsesWith方法)将%x替换为5。

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新