Simple N^2 alias anlysis accuracy checker
authorChris Lattner <sabre@nondot.org>
Thu, 6 Feb 2003 21:29:49 +0000 (21:29 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 6 Feb 2003 21:29:49 +0000 (21:29 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5498 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/AliasAnalysisEvaluator.cpp [new file with mode: 0644]

diff --git a/lib/Analysis/AliasAnalysisEvaluator.cpp b/lib/Analysis/AliasAnalysisEvaluator.cpp
new file mode 100644 (file)
index 0000000..d702ca9
--- /dev/null
@@ -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<AliasAnalysis>();
+      AU.setPreservesAll();
+    }
+    
+    bool doInitialization(Module &M) { No = May = Must = 0; return false; }
+    bool runOnFunction(Function &F);
+    bool doFinalization(Module &M);
+  };
+
+  RegisterOpt<AAEval>
+  X("aa-eval", "Exhaustive Alias Analysis Precision Evaluator");
+}
+
+bool AAEval::runOnFunction(Function &F) {
+  AliasAnalysis &AA = getAnalysis<AliasAnalysis>();
+  
+  std::vector<Value *> Pointers;
+
+  for (Function::aiterator I = F.abegin(), E = F.aend(); I != E; ++I)
+    if (isa<PointerType>(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<PointerType>((*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<Value *>::iterator I1 = Pointers.begin(), E = Pointers.end();
+       I1 != E; ++I1)
+    for (std::vector<Value *>::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 (" <<Must*100/Sum<<"%)\n";
+  return false;
+}