From 9798ca55e1c5e07b175dbb7bbae3b50dbffeec94 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 6 Feb 2003 21:29:49 +0000 Subject: [PATCH] Simple N^2 alias anlysis accuracy checker git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5498 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Analysis/AliasAnalysisEvaluator.cpp | 74 +++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 lib/Analysis/AliasAnalysisEvaluator.cpp diff --git a/lib/Analysis/AliasAnalysisEvaluator.cpp b/lib/Analysis/AliasAnalysisEvaluator.cpp new file mode 100644 index 00000000000..d702ca99a78 --- /dev/null +++ b/lib/Analysis/AliasAnalysisEvaluator.cpp @@ -0,0 +1,74 @@ +//===- AliasAnalysisEvaluator.cpp - Alias Analysis Accuracy Evaluator -----===// +// +// This file implements a simple N^2 alias analysis accuracy evaluator. +// Basically, for each function in the program, it simply queries to see how the +// alias analysis implementation answers alias queries between each pair of +// pointers in the function. +// +// This is inspired and adapted from code by: Naveen Neelakantam, Francesco +// Spadini, and Wojciech Stryjewski. +// +//===----------------------------------------------------------------------===// + +#include "llvm/Analysis/AliasAnalysis.h" +#include "llvm/Pass.h" +#include "llvm/Function.h" +#include "llvm/Support/InstIterator.h" +#include "llvm/Type.h" + +namespace { + class AAEval : public FunctionPass { + unsigned No, May, Must; + + public: + virtual void getAnalysisUsage(AnalysisUsage &AU) const { + AU.addRequired(); + AU.setPreservesAll(); + } + + bool doInitialization(Module &M) { No = May = Must = 0; return false; } + bool runOnFunction(Function &F); + bool doFinalization(Module &M); + }; + + RegisterOpt + X("aa-eval", "Exhaustive Alias Analysis Precision Evaluator"); +} + +bool AAEval::runOnFunction(Function &F) { + AliasAnalysis &AA = getAnalysis(); + + std::vector Pointers; + + for (Function::aiterator I = F.abegin(), E = F.aend(); I != E; ++I) + if (isa(I->getType())) // Add all pointer arguments + Pointers.push_back(I); + + for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) + if (isa((*I)->getType())) // Add all pointer instructions + Pointers.push_back(*I); + + // iterate over the worklist, and run the full (n^2)/2 disambiguations + for (std::vector::iterator I1 = Pointers.begin(), E = Pointers.end(); + I1 != E; ++I1) + for (std::vector::iterator I2 = Pointers.begin(); I2 != I1; ++I2) + switch (AA.alias(*I1, *I2)) { + case AliasAnalysis::NoAlias: ++No; break; + case AliasAnalysis::MayAlias: ++May; break; + case AliasAnalysis::MustAlias: ++Must; break; + default: + std::cerr << "Unknown alias query result!\n"; + } + + return false; +} + +bool AAEval::doFinalization(Module &M) { + unsigned Sum = No+May+Must; + std::cerr << "===== Alias Analysis Evaluator Report =====\n"; + std::cerr << " " << Sum << " Total Alias Queries Performed\n"; + std::cerr << " " << No << " no alias responses (" << No*100/Sum << "%)\n"; + std::cerr << " " << May << " may alias responses (" << May*100/Sum << "%)\n"; + std::cerr << " " << Must << " must alias responses (" <