diff options
author | Chris Lattner <sabre@nondot.org> | 2004-11-26 21:05:39 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2004-11-26 21:05:39 +0000 |
commit | 1ed80b66b192ce695431b14eecc5121ef057251b (patch) | |
tree | 6433189176ec0c1bf70842be3b710833213dd273 /lib/Analysis/AliasAnalysisEvaluator.cpp | |
parent | 15ee8adb00535834ad7962939868b4a9583577ca (diff) |
When evaluating an AA, pass in size info
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18264 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/AliasAnalysisEvaluator.cpp')
-rw-r--r-- | lib/Analysis/AliasAnalysisEvaluator.cpp | 66 |
1 files changed, 38 insertions, 28 deletions
diff --git a/lib/Analysis/AliasAnalysisEvaluator.cpp b/lib/Analysis/AliasAnalysisEvaluator.cpp index af0a25a409..fc8b25ac34 100644 --- a/lib/Analysis/AliasAnalysisEvaluator.cpp +++ b/lib/Analysis/AliasAnalysisEvaluator.cpp @@ -23,6 +23,7 @@ #include "llvm/DerivedTypes.h" #include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Assembly/Writer.h" +#include "llvm/Target/TargetData.h" #include "llvm/Support/InstIterator.h" #include "llvm/Support/CommandLine.h" #include <iostream> @@ -92,6 +93,8 @@ PrintModRefResults(const char *Msg, bool P, Instruction *I, Value *Ptr, bool AAEval::runOnFunction(Function &F) { AliasAnalysis &AA = getAnalysis<AliasAnalysis>(); + + const TargetData &TD = AA.getTargetData(); std::set<Value *> Pointers; std::set<CallSite> CallSites; @@ -118,9 +121,17 @@ bool AAEval::runOnFunction(Function &F) { // iterate over the worklist, and run the full (n^2)/2 disambiguations for (std::set<Value *>::iterator I1 = Pointers.begin(), E = Pointers.end(); - I1 != E; ++I1) - for (std::set<Value *>::iterator I2 = Pointers.begin(); I2 != I1; ++I2) - switch (AA.alias(*I1, 0, *I2, 0)) { + I1 != E; ++I1) { + unsigned I1Size = 0; + const Type *I1ElTy = cast<PointerType>((*I1)->getType())->getElementType(); + if (I1ElTy->isSized()) I1Size = TD.getTypeSize(I1ElTy); + + for (std::set<Value *>::iterator I2 = Pointers.begin(); I2 != I1; ++I2) { + unsigned I2Size = 0; + const Type *I2ElTy =cast<PointerType>((*I2)->getType())->getElementType(); + if (I2ElTy->isSized()) I2Size = TD.getTypeSize(I2ElTy); + + switch (AA.alias(*I1, I1Size, *I2, I2Size)) { case AliasAnalysis::NoAlias: PrintResults("NoAlias", PrintNoAlias, *I1, *I2, F.getParent()); ++NoAlias; break; @@ -133,37 +144,36 @@ bool AAEval::runOnFunction(Function &F) { default: std::cerr << "Unknown alias query result!\n"; } + } + } // Mod/ref alias analysis: compare all pairs of calls and values for (std::set<Value *>::iterator V = Pointers.begin(), Ve = Pointers.end(); V != Ve; ++V) { unsigned Size = 0; - if (const PointerType *PTy = dyn_cast<PointerType>((*V)->getType())) - if (!(Size = PTy->getElementType()->getPrimitiveSize())) - if (isa<PointerType>(PTy->getElementType())) - Size = 4; // This is a hack, but it's good enough for eval. - - if (Size) - for (std::set<CallSite>::iterator C = CallSites.begin(), - Ce = CallSites.end(); C != Ce; ++C) { - Instruction *I = C->getInstruction(); - switch (AA.getModRefInfo(*C, *V, Size)) { - case AliasAnalysis::NoModRef: - PrintModRefResults("NoModRef", PrintNoModRef, I, *V, F.getParent()); - ++NoModRef; break; - case AliasAnalysis::Mod: - PrintModRefResults(" Mod", PrintMod, I, *V, F.getParent()); - ++Mod; break; - case AliasAnalysis::Ref: - PrintModRefResults(" Ref", PrintRef, I, *V, F.getParent()); - ++Ref; break; - case AliasAnalysis::ModRef: - PrintModRefResults(" ModRef", PrintModRef, I, *V, F.getParent()); - ++ModRef; break; - default: - std::cerr << "Unknown alias query result!\n"; - } + const Type *ElTy = cast<PointerType>((*V)->getType())->getElementType(); + if (ElTy->isSized()) Size = TD.getTypeSize(ElTy); + + for (std::set<CallSite>::iterator C = CallSites.begin(), + Ce = CallSites.end(); C != Ce; ++C) { + Instruction *I = C->getInstruction(); + switch (AA.getModRefInfo(*C, *V, Size)) { + case AliasAnalysis::NoModRef: + PrintModRefResults("NoModRef", PrintNoModRef, I, *V, F.getParent()); + ++NoModRef; break; + case AliasAnalysis::Mod: + PrintModRefResults(" Mod", PrintMod, I, *V, F.getParent()); + ++Mod; break; + case AliasAnalysis::Ref: + PrintModRefResults(" Ref", PrintRef, I, *V, F.getParent()); + ++Ref; break; + case AliasAnalysis::ModRef: + PrintModRefResults(" ModRef", PrintModRef, I, *V, F.getParent()); + ++ModRef; break; + default: + std::cerr << "Unknown alias query result!\n"; } + } } return false; |