当我使用命令clang -emit-llvm -S test.c -o test.ll
时,IR文件中没有任何“phi”指令。我怎么能得到它?
我知道我可以使用传递“-mem2reg”或“-gvn”来获取“phi”指令。但他们会做一些优化。我只是想在没有任何优化的情况下获得“phi”。
答案 0 :(得分:11)
我不确定“做一些优化”是什么意思,但在我看来,mem2reg
正好你需要什么。以下是它的described in the documentation:
此文件将内存引用提升为寄存器引用。它 促进只有加载和存储作为用途的alloca指令。 通过使用支配者边界来转换分配物 节点,然后以深度优先的顺序遍历函数以重写 适当地加载和存储。这只是标准的SSA 构造算法构造“修剪”的SSA形式。
Clang本身不会产生优化的LLVM IR。它产生相当简单的IR,其中locals保存在内存中(使用alloca
s)。优化由opt
在LLVM IR级别完成,其中一个最重要的优化确实是mem2reg
,这确保了本地化以LLVM的SSA值而不是内存表示。