diff options
author | Chris Lattner <sabre@nondot.org> | 2003-02-03 21:16:17 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2003-02-03 21:16:17 +0000 |
commit | dc1ad196e1915e9dc6e3ba8271a0bdafd214e769 (patch) | |
tree | a2fca54448fb3b894d02f84b108ba508bedc3cea /lib/Analysis/AliasAnalysis.cpp | |
parent | 1e88369afe93bba2727b28e803e75ab7df30a20a (diff) |
Add statistics to basicAA pass
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5480 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Analysis/AliasAnalysis.cpp')
-rw-r--r-- | lib/Analysis/AliasAnalysis.cpp | 35 |
1 files changed, 28 insertions, 7 deletions
diff --git a/lib/Analysis/AliasAnalysis.cpp b/lib/Analysis/AliasAnalysis.cpp index 98577c8dc4..789843c45b 100644 --- a/lib/Analysis/AliasAnalysis.cpp +++ b/lib/Analysis/AliasAnalysis.cpp @@ -25,9 +25,15 @@ #include "llvm/Constants.h" #include "llvm/GlobalValue.h" #include "llvm/DerivedTypes.h" +#include "Support/Statistic.h" // Register the AliasAnalysis interface, providing a nice name to refer to. -static RegisterAnalysisGroup<AliasAnalysis> X("Alias Analysis"); +namespace { + RegisterAnalysisGroup<AliasAnalysis> Z("Alias Analysis"); + Statistic<> NumNoAlias ("basic-aa", "Number of 'no alias' replies"); + Statistic<> NumMayAlias ("basic-aa", "Number of 'may alias' replies"); + Statistic<> NumMustAlias("basic-aa", "Number of 'must alias' replies"); +} // CanModify - Define a little visitor class that is used to check to see if // arbitrary chunks of code can modify a specified pointer. @@ -139,6 +145,21 @@ static const Value *getUnderlyingObject(const Value *V) { return 0; } +static inline AliasAnalysis::Result MustAlias() { + ++NumMustAlias; + return AliasAnalysis::MustAlias; +} + +static inline AliasAnalysis::Result MayAlias() { + ++NumMayAlias; + return AliasAnalysis::MayAlias; +} + +static inline AliasAnalysis::Result NoAlias() { + ++NumNoAlias; + return AliasAnalysis::NoAlias; +} + // alias - Provide a bunch of ad-hoc rules to disambiguate in common cases, such // as array references. Note that this function is heavily tail recursive. // Hopefully we have a smart C++ compiler. :) @@ -152,11 +173,11 @@ AliasAnalysis::Result BasicAliasAnalysis::alias(const Value *V1, V2 = CPR->getValue(); // Are we checking for alias of the same value? - if (V1 == V2) return MustAlias; + if (V1 == V2) return ::MustAlias(); if ((!isa<PointerType>(V1->getType()) || !isa<PointerType>(V2->getType())) && V1->getType() != Type::LongTy && V2->getType() != Type::LongTy) - return NoAlias; // Scalars cannot alias each other + return ::NoAlias(); // Scalars cannot alias each other // Strip off cast instructions... if (const Instruction *I = dyn_cast<CastInst>(V1)) @@ -195,7 +216,7 @@ AliasAnalysis::Result BasicAliasAnalysis::alias(const Value *V1, // if (AllConstant && alias(GEP1->getOperand(0), GEP2->getOperand(1)) != MayAlias) - return NoAlias; + return ::NoAlias(); } // Figure out what objects these things are pointing to if we can... @@ -205,16 +226,16 @@ AliasAnalysis::Result BasicAliasAnalysis::alias(const Value *V1, // Pointing at a discernable object? if (O1 && O2) { // If they are two different objects, we know that we have no alias... - if (O1 != O2) return NoAlias; + if (O1 != O2) return ::NoAlias(); // If they are the same object, they we can look at the indexes. If they // index off of the object is the same for both pointers, they must alias. // If they are provably different, they must not alias. Otherwise, we can't // tell anything. } else if (O1 && isa<ConstantPointerNull>(V2)) { - return NoAlias; // Unique values don't alias null + return ::NoAlias(); // Unique values don't alias null } else if (O2 && isa<ConstantPointerNull>(V1)) { - return NoAlias; // Unique values don't alias null + return ::NoAlias(); // Unique values don't alias null } return MayAlias; |