我想向每个具有多个前驱的基本 block 添加一个 phi 节点。例如,在store之前添加phi节点。我对 llvm IR 很陌生,我知道有一些函数调用可以用来做类似的事情,比如 replaceAllUsesWith()
。但我不知 Prop 体如何使用它。非常感谢任何帮助!
<label>:7: ; preds = %6, %0
store i32 999, i32* %3, align 4
ret i32 0
最佳答案
将 phi 节点添加到基本 block 的开头非常简单:Find the first instruction和 create a phi node before that instruction 。这会在任何现有 phi 之后、任何“真实”指令之前创建一个新的 phi。它会失败,因为基本 block 是空的,我认为这不是你的情况。您必须调用addIncomingValue()视情况而定。
我想您随后会想要使用该 block 中的 phi。您可以循环BasicBlock::getInstList()并使用 getNumOperands() 检查每条指令和 getOperand() ,并使用 setOperand() 更改相关指令操作数。这就是 ReplaceAllUsesOf() 的作用,只不过它替换了所有用途,甚至是您的 phi 和其他 block 中的用途。
关于c++ - 如何将 PHI 节点添加到每个基本 block 的开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57386116/