LLVM を使用して、命令がフロー制御 (if/switch/for) 内に存在するかどうかを調べようとしていますが、IR レベルでこれを行う必要があります。疑似コードは以下のようなものです。
if cond
inst
endif
関数の SCC を見ていますが、命令がフロー制御内に存在するかどうかを確実に推測する方法がわかりません。
この IR の万華鏡の例から例をとります。
declare double @foo()
declare double @bar()
define double @baz(double %x) {
entry:
%ifcond = fcmp one double %x, 0.000000e+00
%0 = call double @foo()
br i1 %ifcond, label %then, label %else
then: ; preds = %entry
%calltmp = call double @foo()
br label %ifcont
else: ; preds = %entry
%calltmp1 = call double @bar()
br label %ifcont
ifcont: ; preds = %else, %then
%iftmp = phi double [ %calltmp, %then ], [ %calltmp1, %else ]
%1 = call double @foo()
ret double %iftmp
}
上記の IR で、関数 foo へのすべての呼び出しを調べたいとしましょう。したがって、エントリ ブロックには %0 の呼び出しが 1 つあり、then: ブロックに 1 つあり、別の foo の呼び出しと ifcont: ブロックの最後の呼び出しがあります。
問題は、then: ブロック内の呼び出しが if ブロックから生成されたコードに含まれているが、どうすればそれを推測できるかということです。つまり、entry ブロックと ifcont ブロックは実行されますが、then: ブロックは条件によっては実行されない場合があります。
誰かが私にいくつかの指針を教えてもらえますか? ありがとう
編集: もう少し考えてみると、ドミネーター ツリーがこれを判断するのに役立つかもしれませんが、これに対するアルゴリズムはまだありません。