转换为LLVM IR:如何创建虚拟寄存器而不是分配堆栈变量?

时间:2012-10-23 14:28:25

标签: llvm

我正在努力将另一个IR转换为llvm IR。

我的IR是这样的:

a = 1;
b = a;
a = a + 1;

目前,我正在使用alloca在我的IR中创建变量(这里是“a”和“b”)。

但是,alloca可能太重了,它会引入大量的加载存储指令。如果功能很大,这将是一个问题。实际上,对于我的情况,大多数变量都是寄存器宽度。所以我只想让它们成为一个带名字的虚拟寄存器。

有谁知道如何创建虚拟寄存器(变量)而不是内存变量?

我的意思是如何避免使用“alloca”?

1 个答案:

答案 0 :(得分:4)

你不应该。生成SSA代码是一个非常困难的问题,因此它在LLVM传递中为所有前端解决了一次。您应该使用alloca并加载/存储,然后运行mem2reg传递以将其转换为SSA变量。 Clang也这样做(将您的示例代码粘贴在C函数中,而compile it没有优化)。