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

Replacing RHS of an instruction with an instruction in LLVM

问题来了,

假设,我有以下指令

%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”的建议

背景: 我的 Lazy Code Motion 分析需要这种实现方式

%add = %T1 //psuedo code as I do not know how to this

LLVM IR 中没有赋值运算符,因此您不能这样写 as-is,但好消息是您永远不需要这样做。

%name = add i32 %this, %that 是一条指令,在内存中是一条 llvm::Instruction*。如果您在该指令上调用 I->getName(),您将获得名称“name”。 LLVM 根本没有赋值运算符,印刷文本形式中的等号是虚构的,以使其更易于阅读。不需要赋值运算符,因为 LLVM 是 SSA 形式,每个寄存器在创建时都被赋值一次,永远不能被改变或重新赋值。

这里有两种常见的情况。假设您有 %a = add i32 %b, %c,并且您希望将 %c 的这一用法替换为 %d。您可以调用 I->setOperand(1, D) (其中 D 是 %dllvm::Value*。在另一种情况下,假设您有 %e = add i32 %f, 0 并且您想要将其删除。呼叫E->replaceAllUsesWith(F); E->eraseFromParent();。第一条语句会在所有提到 %e 的地方找到并将其替换为 %f,该语句将删除 now-unused %e 并释放其内存(需要 E是一个 llvm::Instruction*,而不是一个常量(从未删除)或参数(删除它需要更改函数的类型))。

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