Hello everyone, I am trying to find the alias between a store instruction's pointer operand and function arguments. This is the code, 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; } }; } But I get MayAlias result even if the store instruction's pointer operand is not referencing the function argument. Is there something wrong with the logic? Are there any files in the LLVM source code that contain code to do something similar. Thanks:) -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20120307/4b1b3d3c/attachment.html>
Hi Borya,> But I get MayAlias result even if the store instruction's pointer operand is not > referencing the function argument. Is there something wrong with the logic? Are > there any files in the LLVM source code that contain code to do something similar.the default alias analysis is no-aa which does what the name suggests :) Did schedule basic-aa (for example) before your pass? Ciao, Duncan.
That's the reason I have defined getAnalysisUsage method. Isn't that the right way to do it? borya043 wrote:> > Hello everyone, > I am trying to find the alias between a store instruction's pointer > operand > and function arguments. This is the code, > 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; > } > }; > } > > But I get MayAlias result even if the store instruction's pointer operand > is not referencing the function argument. Is there something wrong with > the logic? Are there any files in the LLVM source code that contain code > to > do something similar. > Thanks:) > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > >-- View this message in context: http://old.nabble.com/Alias-analysis-result-tp33458451p33462761.html Sent from the LLVM - Dev mailing list archive at Nabble.com.
Hi,> That's the reason I have defined getAnalysisUsage method. Isn't that the > right way to do it?no, that gives you access to whatever alias analysis has been computed, but it doesn't specify what kind of alias analysis should be computed (there are several). Try something like this: opt -load=my_pass.so -basic-aa -run_my_pass ... Ciao, Duncan.