私は現在、静的コード アナライザーを構築しており、Clang、llvm を使用したいと考えていました。私が出力として欲しかったのは、ACコードを入力として与えるときのSSA形式のLLVM-IRです(テキストファイルとして)。このページ( clang を llvm IR にコンパイルする方法) のページを見つけたので、LLVM-IR を取得しました。LLVM のリファレンス ページには、「LLVM は Static Single Assignment (SSA) ベースの表現であり、.. ." . なので、もうSSA形式かと思っていたのですが、アウトプットを調べてみると、こんな感じでした。
; label:3
(...)
%or.cond = or i1 %7, %8
br i1 %or.cond, label %13, label %9
; label:9
(...)
%or.cond1 = and i1 %11, %12
br i1 %or.cond1, label %16, label %13
これは、以下の if ステートメントを表しています。
if (tx < offset || ty < offset || tx >= (width-offset) || ty >= (width-offset))
しかし、私の知る限り、SSA 形式の場合、同じレジスタを 2 回割り当てるべきではありません。これはSSA形式ではないと思いますか? または私は何かを逃していますか?
とにかく、これは私が探していた SSA 形式ではないと仮定して、mem2reg 最適化を使用する必要があることを検索して発見しました。しかし、上記のコードはすでにレジスタ形式になっていると思いますが、とにかく、以下の 2 つのコマンドを実行すると、
clang-3.6 -emit-llvm -o foo.bc -c foo.cl opt -mem2reg -dce foo.bc
2 番目のコマンドでは、セグメンテーション エラーが発生します。だから私はここで立ち往生しているので、誰か私が何か間違ったことをしたか、SSA-Form IR を生成する方法を教えてもらえますか?