2012-03-07 11 views
3

ストア命令のポインタオペランドと関数引数の間のエイリアスを見つけようとしています。これはコードですLLVMでのエイリアス解析

virtual void getAnalysisUsage(AnalysisUsage &AU) const { 

    AU.addRequiredTransitive<AliasAnalysis>(); 
    AU.addPreserved<AliasAnalysis>(); 
} 

virtual bool runOnFunction(Function &F) { 

    AliasAnalysis &AA = getAnalysis<AliasAnalysis>(); 

    for(Function::iterator i=F.begin();i!=F.end();++i){ 
     for(BasicBlock::iterator j=i->begin();j!=i->end();++j) 
     { 
      if(dyn_cast<StoreInst>(j)){ 
       const StoreInst *SI=dyn_cast<StoreInst>(j); 

       AliasAnalysis::Location LocA = AA.getLocation(SI); 

       const Value *si_v= SI->getPointerOperand(); 

       for(Function::arg_iterator k=F.arg_begin(); k!=F.arg_end();++k) 
       { 
        Value *v=dyn_cast<Value>(k); 

        AliasAnalysis::Location loc=AliasAnalysis::Location(v); 
        AliasAnalysis::AliasResult ar=AA.alias(LocA,loc); 

        switch(ar) 
        { 
        case 0:errs()<< "NoAlias\n"; 
        break; 
        ///< No dependencies. 
        case 1:errs()<<"MayAlias\n"; ///< Anything goes 
        break; 
        case 2: errs()<<"PartialAlias\n";///< Pointers differ, but pointees overlap. 
        break; 

        case 3: errs()<<"MustAlias\n"; 
        } 
       } 
    } 

    return true; 
} 
}; 
} 

ストア命令のポインタオペランドが関数の引数を参照していない場合でもMayAliasの結果が得られます。ロジックに何か問題はありますか?同様のことをするためのコードを含むLLVMソースコードのファイルはありますか?ありがとう:)

答えて

5

AAグループのデフォルトのエイリアス解析方法はbasicaaで、常に "may alias"を返します。 optにデフォルトを使用させる代わりに、AAメソッド(--globalsmodref-aa、-scev-aa、..)を指定してみてください。

このようなもの:opt -globalsmodref-aa -your_pass ...

関連する問題