用 LLVM 中的指令替换指令的 RHS

阿比莱什·孙达拉萨米

问题来了,

假设,我有以下说明

%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并且你想用%cwith%d代替这个用法。您可以致电I->setOperand(1, D) (其中 D 是llvm::Value*for %d在另一种情况下,假设您有%e = add i32 %f, 0并且想要删除它。打电话E->replaceAllUsesWith(F); E->eraseFromParent();第一条语句会发现到处提到%e替换%f))。%eEllvm::Instruction*

如果您可以写,那么说并删除用任何地方替换它%add = copy %T1也是有效的Add->replaceAllUsesWith(T1);%add%t1

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章