コマンドを使用するclang -emit-llvm -S test.c -o test.ll
と、IR ファイルに「phi」命令がありません。どうすれば入手できますか?
パス「-mem2reg」または「-gvn」を使用して「phi」命令を取得できることを知っています。しかし、彼らはいくつかの最適化を行います。最適化せずに「ファイ」を取得したいだけです。
「最適化を行う」とはどういう意味かわかりませんが、mem2reg
まさにそれが必要なようです。ドキュメントでの説明は次のとおりです。
このファイルは、メモリ参照をレジスタ参照にプロモートします。ロードとストアのみを使用する alloca 命令を促進します。alloca は、ドミネーター フロンティアを使用して phi ノードを配置し、関数を深さ優先順にトラバースして、必要に応じてロードとストアを書き換えることによって変換されます。これは、「枝刈りされた」SSA フォームを構築するための標準的な SSA 構築アルゴリズムです。
Clang 自体は、最適化された LLVM IR を生成しません。これは、(s を使用して) ローカルがメモリに保持される、かなり単純な IR を生成しますalloca
。最適化はopt
LLVM IR レベルで行われます。最も重要な最適化の 1 つは、mem2reg
ローカルがメモリではなく LLVM の SSA 値で表現されるようにすることです。