4

当我使用命令clang -emit-llvm -S test.c -o test.ll时,IR 文件中没有任何“phi”指令。我怎么才能得到它?

我知道我可以使用 pass "-mem2reg" 或 "-gvn" 来获取 "phi" 指令。但他们会做一些优化。我只想在没有任何优化的情况下获得“phi”。

4

1 回答 1

11

我不确定您所说的“进行一些优化”是什么意思,但在我看来这正是mem2reg您所需要的。以下是文档中的描述

该文件将内存引用提升为寄存器引用。它促进了仅具有加载和存储作为用途的 alloca 指令。通过使用支配边界来放置 phi 节点来转换 alloca,然后以深度优先顺序遍历函数以根据需要重写加载和存储。这只是标准的 SSA 构造算法来构造“修剪”的 SSA 形式。

Clang 本身不会产生优化的 LLVM IR。它产生相当简单的 IR,其中局部变量保存在内存中(使用allocas)。优化是opt在 LLVM IR 级别上完成的,最重要的优化之一确实mem2reg是确保本地变量在 LLVM 的 SSA 值而不是内存中表示。

于 2013-12-03T05:33:33.453 回答