当我使用命令clang -emit-llvm -S test.c -o test.ll
时,IR 文件中没有任何“phi”指令。我怎么才能得到它?
我知道我可以使用 pass "-mem2reg" 或 "-gvn" 来获取 "phi" 指令。但他们会做一些优化。我只想在没有任何优化的情况下获得“phi”。
我不确定您所说的“进行一些优化”是什么意思,但在我看来这正是mem2reg
您所需要的。以下是文档中的描述:
该文件将内存引用提升为寄存器引用。它促进了仅具有加载和存储作为用途的 alloca 指令。通过使用支配边界来放置 phi 节点来转换 alloca,然后以深度优先顺序遍历函数以根据需要重写加载和存储。这只是标准的 SSA 构造算法来构造“修剪”的 SSA 形式。
Clang 本身不会产生优化的 LLVM IR。它产生相当简单的 IR,其中局部变量保存在内存中(使用alloca
s)。优化是opt
在 LLVM IR 级别上完成的,最重要的优化之一确实mem2reg
是确保本地变量在 LLVM 的 SSA 值而不是内存中表示。