我正在将另一个 IR 转换为 llvm IR。
我的 IR 是这样的:
a = 1;
b = a;
a = a + 1;
现在,我正在使用 alloca 在我的 IR 中创建变量(这里是“a”和“b”)。
但是,alloca 可能太重了,它会引入大量的加载存储指令。如果功能很大,这将是一个问题。实际上,就我而言,大多数变量都是寄存器宽度。所以我只想让它们成为一个有名字的虚拟寄存器。
有人知道如何创建虚拟寄存器(变量)而不是内存变量吗?
我的意思是如何避免使用“alloca”?
我正在将另一个 IR 转换为 llvm IR。
我的 IR 是这样的:
a = 1;
b = a;
a = a + 1;
现在,我正在使用 alloca 在我的 IR 中创建变量(这里是“a”和“b”)。
但是,alloca 可能太重了,它会引入大量的加载存储指令。如果功能很大,这将是一个问题。实际上,就我而言,大多数变量都是寄存器宽度。所以我只想让它们成为一个有名字的虚拟寄存器。
有人知道如何创建虚拟寄存器(变量)而不是内存变量吗?
我的意思是如何避免使用“alloca”?
你不应该这样做。生成 SSA 代码是一个相当困难的问题,因此它在 LLVM 通道中的所有前端都解决了一次。您应该使用alloca
和加载/存储,然后运行mem2reg
传递将它们转换为 SSA 变量。Clang 也这样做(将您的示例代码粘贴在 C 函数中,并在不进行优化的情况下对其进行编译)。