パスから特定のロード命令について、対応するAlloca命令(他の前のブロックにある可能性があります)を判別しようとしています。TargetLoad(var) -> other stores/loads that use var (or dependencies on var) -> alloca(var).
チェーンは、いくつかの基本ブロックにリンクされた:のようなものにすることができます。どうすればいいのか分かりますか?
DependenceAnalysisとMemoryDependenceAnalysisのメソッドを使用しようとしましたが、結果が正しくありませんでした。たとえば、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の間に依存関係はありません。たぶん、依存関係は使用される変数/メモリの場所に基づいていませんか?
提案ありがとうございます!