4

CFG (とりわけ) に 2 つの基本ブロック A と B があり、A から B へのエッジがあるとします。次の手順を実行する必要があります。

  • そのエッジを横切るライブ値のセット S を取得します (これは過大評価である可能性があります。つまり、もうライブではない値が含まれている可能性があります)。
  • それらのそれぞれを別の値にマップします (S->S')
  • 置換 - B とその後継 - S の値のすべての使用をマップされた値 (S') に置き換える

LLVM は 1 番目と 3 番目のポイントを実行する簡単な方法を提供しますか? そうでない場合、それを行う方法について何か提案はありますか?

注: LLVM メーリング リストにクロスポストされました

4

1 に答える 1

3

あなたの質問に対する明確な答えはありませんが、次の監督が頭に浮かびました。何らかの形でお役に立てば幸いです。

まず、 LLVM Programmers Manual の「 BasicBlock 内の命令の繰り返し」「def-use & use-def チェーンの繰り返し」を確認します。基本ブロックの命令とこの値のユーザーを反復する方法を示します。

エッジ全体で生きている値を知る必要があるため、「関数内の BasicBlocks を反復処理する」をチェックし、たとえばconst BasicBlock* llvm::Instructionを使用して、ユーザー (反復処理を介して) が配置されている場所を特定しようとします。 ::getParent()const .

ユーザーが配置されている情報が十分でない場合は、[ドミネーターとポストドミネーターの分析] を利用することをお勧めします。以下を確認してください。

これは、ブロックまたは命令間の支配関係を判断するのに役立ち、セットの作成に役立つ可能性があります。

于 2011-08-30T19:49:19.217 に答える