summaryrefslogtreecommitdiff
path: root/lib/Analysis/AliasAnalysisEvaluator.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2004-11-26 21:05:39 +0000
committerChris Lattner <sabre@nondot.org>2004-11-26 21:05:39 +0000
commit1ed80b66b192ce695431b14eecc5121ef057251b (patch)
tree6433189176ec0c1bf70842be3b710833213dd273 /lib/Analysis/AliasAnalysisEvaluator.cpp
parent15ee8adb00535834ad7962939868b4a9583577ca (diff)
downloadllvm-1ed80b66b192ce695431b14eecc5121ef057251b.tar.gz
llvm-1ed80b66b192ce695431b14eecc5121ef057251b.tar.bz2
llvm-1ed80b66b192ce695431b14eecc5121ef057251b.tar.xz
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.cpp66
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;