c++ - 如何将 PHI 节点添加到每个基本 block 的开头

标签 c++ llvm compiler-optimization

我想向每个具有多个前驱的基本 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 instructioncreate 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/

相关文章:

llvm - 什么是异常处理个性函数?

LLVM 内在函数

java - 将消息从 C++ 记录到 Java

c++ - 为什么这个元组到引用元组 (std::tie) 的转换有效?

c++ - 为什么断言宏仅用于调试构建

c++ - LLVM IR 中的一切都是指针吗?

c - GDB : Can gdb handle decoding it automatically? 中优化的值

Android 中的 Java 代码编译器优化

C++ : Can the compiler optimize this code segment?

c++ - undefined reference to operator<<.... 是什么意思?在 C++ 中