2

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: ブロックは条件によっては実行されない場合があります。

誰かが私にいくつかの指針を教えてもらえますか? ありがとう

編集: もう少し考えてみると、ドミネーター ツリーがこれを判断するのに役立つかもしれませんが、これに対するアルゴリズムはまだありません。

4

1 に答える 1

5

ウィキペディアからの命令ポストドミネーションの定義は次のとおりです。

上記のドミナンスの定義と同様に、ノード z は、n から始まるグラフの出口ノードへのすべてのパスが z を通らなければならない場合、ノード n を事後支配すると言われます。

あなたの場合、関数の最初の命令をポストドミネートする呼び出しを探しているようです。このような呼び出しは、ポストドミネーションの定義により、最初の命令からすべてのパスで到達する必要があります。これはあなたが必要とするものですか?

DominatorTree支配後の分析をサポートすると思われるパスを実行できます。

于 2013-03-10T00:18:52.407 に答える