J'essaie de trouver l'alias entre un opérande de pointeur d'instruction de magasin et des arguments de fonction. Ce code,Analyse d'alias dans 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;
}
};
}
Mais je reçois MayAlias résultat même si l'opérande de pointeur de l'instruction de mémorisation ne référence pas l'argument de la fonction. Y a-t-il un problème avec la logique? Y at-il des fichiers dans le code source LLVM qui contiennent du code pour faire quelque chose de similaire. Merci :)