4

パスから特定のロード命令について、対応するAlloca命令(他の前のブロックにある可能性があります)を判別しようとしています。TargetLoad(var) -> other stores/loads that use var (or dependencies on var) -> alloca(var).チェーンは、いくつかの基本ブロックにリンクされた:のようなものにすることができます。どうすればいいのか分かりますか?

DependenceAnalysisとMemoryDe​​pendenceAnalysisのメソッドを使用しようとしましたが、結果が正しくありませんでした。たとえば、MemoryDependenceAnalysis::getDependencyオプション「Def」でうまくいくはずですが、ロードではなく、ストアでのみ機能します。MemoryDependenceAnalysis::getNonLocalPointerDependencyまた、またはを使用しようとするとセグメンテーション違反が発生しますMemoryDependenceAnalysis::getPointerDependencyFrom。MemDepResult :: getDef()を使用して結果を確認しようとすると、Load命令の結果は同じ命令になります。したがって、それ自体に依存します。これは、コードで以前に定義された変数を使用しているため、奇妙です。

target_load_instructionsによって使用されるすべての変数と割り当てられたすべての変数の間の共通部分を識別するための共通部分を作成する代替手段はオプションではありません。のようなものがあるかもしれないので:alloca(a) ... c=a*b+4 .... load(c)

また、DependenceAnalysis ::dependents()は私のパスでは問題ないようです。コードの次の行は参照用です:if(DA.depends(allocaInstrArray[i],loadInstrArray[j],true))常にfalseです。そして、それはいくつかの場合に当てはまるはずです。正しく使っていないと思います。

ただし、おそらく、depends()はAllocaでは機能しないと仮定しました。そこで、配列に保持されているすべてのLoad命令間の依存関係を確認しました。一部の結果は、ロードされた変数に基づいていないはずです。例:LOAD %3 = load i32* %c, align 4 IS DEPENDENT ON %1 = load i32* %j, align 4。ご覧のとおり、1つはcをロードしており、もう1つはjをロードしています。私のTest.cppターゲットコードでは、jとcの間に依存関係はありません。たぶん、依存関係は使用される変数/メモリの場所に基づいていませんか?

提案ありがとうございます!

4

1 に答える 1

1

まず、getOperand(0)またはgetOperand(1)ICMP命令を使用します。有効な場合はisa<LoadInst>、にキャストしますLoadInstgetPointerOperand()検索される実際の変数である値*を取得します。次に、ロード命令とAlloca命令の間で同じ手順を実行します。getOperand(0)ロードに適用すると、対応するAlloca命令が得られます。最後に、依存関係を確認して、2つの結果をリンクします。

于 2013-01-29T09:48:12.677 に答える