问题来了,
假设,我有以下说明
%add = add nsw i32 %argc, 50
首先,我想创建一个如下所示的二进制指令
%T1 = add nsw i32 %argc, 50
%add = add nsw i32 %argc, 50
然后以某种方式将 %add 的指令替换为对 T1 的赋值,如下所示
%add = %T1 //psuedo code as I do not know how to this
需要一些关于如何实现“%add = %T1”的建议
Bakcground:我的 Lazy Code Motion 分析需要这种实现
%add = %T1 //伪代码,因为我不知道怎么做
LLVM IR 中没有赋值运算符,因此您不能按原样编写,但好消息是您永远不需要这样做。
%name = add i32 %this, %that
是一条指令,llvm::Instruction*
内存中的一条。如果您调用I->getName()
该指令,您将获得名称“名称”。LLVM 根本没有赋值运算符,打印文本表单中的等号是虚构的,以使其更易于阅读。不需要赋值运算符,因为 LLVM 采用 SSA 形式,每个寄存器在创建时都被分配一次,并且永远不能被改变或重新分配。
这是两种常见的情况。假设你有%a = add i32 %b, %c
并且你想用%c
with%d
代替这个用法。您可以致电I->setOperand(1, D)
(其中 D 是llvm::Value*
for %d
)。在另一种情况下,假设您有%e = add i32 %f, 0
并且想要删除它。打电话E->replaceAllUsesWith(F); E->eraseFromParent();
。第一条语句会发现到处都提到并%e
替换%f
为))。%e
E
llvm::Instruction*
如果您可以写,那么说并删除用任何地方替换它%add = copy %T1
也是有效的。Add->replaceAllUsesWith(T1);
%add
%t1
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句