[PM/AA] Hoist the AA counter pass into a header to match the analysis
authorChandler Carruth <chandlerc@gmail.com>
Fri, 14 Aug 2015 02:05:41 +0000 (02:05 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Fri, 14 Aug 2015 02:05:41 +0000 (02:05 +0000)
pattern.

Also hoist the creation routine out of the generic header and into the
pass header now that we have one.

I've worked to not make any changes, even formatting ones here. I'll
clean up the formatting and other things in a follow-up patch now that
the code is in the right place.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@245004 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Analysis/AliasAnalysisCounter.h [new file with mode: 0644]
include/llvm/Analysis/Passes.h
include/llvm/LinkAllPasses.h
lib/Analysis/AliasAnalysisCounter.cpp

diff --git a/include/llvm/Analysis/AliasAnalysisCounter.h b/include/llvm/Analysis/AliasAnalysisCounter.h
new file mode 100644 (file)
index 0000000..7a4e04b
--- /dev/null
@@ -0,0 +1,124 @@
+//===- AliasAnalysisCounter.h - Alias Analysis Query Counter ----*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+/// \file
+/// This declares an alias analysis which counts and prints queries made
+/// through it. By inserting this between other AAs you can track when specific
+/// layers of LLVM's AA get queried.
+///
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_ANALYSIS_ALIASANALYSISCOUNTER_H
+#define LLVM_ANALYSIS_ALIASANALYSISCOUNTER_H
+
+#include "llvm/Analysis/AliasAnalysis.h"
+#include "llvm/IR/Module.h"
+#include "llvm/Pass.h"
+#include "llvm/Support/raw_ostream.h"
+
+namespace llvm {
+
+  class AliasAnalysisCounter : public ModulePass, public AliasAnalysis {
+    unsigned No, May, Partial, Must;
+    unsigned NoMR, JustRef, JustMod, MR;
+    Module *M;
+  public:
+    static char ID; // Class identification, replacement for typeinfo
+    AliasAnalysisCounter() : ModulePass(ID) {
+      initializeAliasAnalysisCounterPass(*PassRegistry::getPassRegistry());
+      No = May = Partial = Must = 0;
+      NoMR = JustRef = JustMod = MR = 0;
+    }
+
+    void printLine(const char *Desc, unsigned Val, unsigned Sum) {
+      errs() <<  "  " << Val << " " << Desc << " responses ("
+             << Val*100/Sum << "%)\n";
+    }
+    ~AliasAnalysisCounter() override {
+      unsigned AASum = No+May+Partial+Must;
+      unsigned MRSum = NoMR+JustRef+JustMod+MR;
+      if (AASum + MRSum) { // Print a report if any counted queries occurred...
+        errs() << "\n===== Alias Analysis Counter Report =====\n"
+               << "  Analysis counted:\n"
+               << "  " << AASum << " Total Alias Queries Performed\n";
+        if (AASum) {
+          printLine("no alias",     No, AASum);
+          printLine("may alias",   May, AASum);
+          printLine("partial alias", Partial, AASum);
+          printLine("must alias", Must, AASum);
+          errs() << "  Alias Analysis Counter Summary: " << No*100/AASum << "%/"
+                 << May*100/AASum << "%/"
+                 << Partial*100/AASum << "%/"
+                 << Must*100/AASum<<"%\n\n";
+        }
+
+        errs() << "  " << MRSum << " Total MRI_Mod/MRI_Ref Queries Performed\n";
+        if (MRSum) {
+          printLine("no mod/ref",    NoMR, MRSum);
+          printLine("ref",        JustRef, MRSum);
+          printLine("mod",        JustMod, MRSum);
+          printLine("mod/ref",         MR, MRSum);
+          errs() << "  MRI_Mod/MRI_Ref Analysis Counter Summary: "
+                 << NoMR * 100 / MRSum << "%/" << JustRef * 100 / MRSum << "%/"
+                 << JustMod * 100 / MRSum << "%/" << MR * 100 / MRSum
+                 << "%\n\n";
+        }
+      }
+    }
+
+    bool runOnModule(Module &M) override {
+      this->M = &M;
+      InitializeAliasAnalysis(this, &M.getDataLayout());
+      return false;
+    }
+
+    void getAnalysisUsage(AnalysisUsage &AU) const override {
+      AliasAnalysis::getAnalysisUsage(AU);
+      AU.addRequired<AliasAnalysis>();
+      AU.setPreservesAll();
+    }
+
+    /// getAdjustedAnalysisPointer - This method is used when a pass implements
+    /// an analysis interface through multiple inheritance.  If needed, it
+    /// should override this to adjust the this pointer as needed for the
+    /// specified pass info.
+    void *getAdjustedAnalysisPointer(AnalysisID PI) override {
+      if (PI == &AliasAnalysis::ID)
+        return (AliasAnalysis*)this;
+      return this;
+    }
+    
+    // FIXME: We could count these too...
+    bool pointsToConstantMemory(const MemoryLocation &Loc,
+                                bool OrLocal) override {
+      return getAnalysis<AliasAnalysis>().pointsToConstantMemory(Loc, OrLocal);
+    }
+
+    // Forwarding functions: just delegate to a real AA implementation, counting
+    // the number of responses...
+    AliasResult alias(const MemoryLocation &LocA,
+                      const MemoryLocation &LocB) override;
+
+    ModRefInfo getModRefInfo(ImmutableCallSite CS,
+                             const MemoryLocation &Loc) override;
+    ModRefInfo getModRefInfo(ImmutableCallSite CS1,
+                             ImmutableCallSite CS2) override {
+      return AliasAnalysis::getModRefInfo(CS1,CS2);
+    }
+  };
+
+  //===--------------------------------------------------------------------===//
+  //
+  // createAliasAnalysisCounterPass - This pass counts alias queries and how the
+  // alias analysis implementation responds.
+  //
+  ModulePass *createAliasAnalysisCounterPass();
+
+}
+
+#endif
index becaa7e1d69ffbfe9a4ce739e229a275dc27580c..c85d751a81066430ac0dd57a99d8a0559cde7c9b 100644 (file)
@@ -31,13 +31,6 @@ namespace llvm {
   //
   Pass *createGlobalsModRefPass();
 
-  //===--------------------------------------------------------------------===//
-  //
-  // createAliasAnalysisCounterPass - This pass counts alias queries and how the
-  // alias analysis implementation responds.
-  //
-  ModulePass *createAliasAnalysisCounterPass();
-
   //===--------------------------------------------------------------------===//
   //
   // createAAEvalPass - This pass implements a simple N^2 alias analysis
index 87ec4468d6fb5b875c07f73e028535d8af12efbe..4b58ee3ab28777416e31200d929708ab4abdd1b5 100644 (file)
@@ -17,6 +17,7 @@
 
 #include "llvm/ADT/Statistic.h"
 #include "llvm/Analysis/AliasSetTracker.h"
+#include "llvm/Analysis/AliasAnalysisCounter.h"
 #include "llvm/Analysis/BasicAliasAnalysis.h"
 #include "llvm/Analysis/CallPrinter.h"
 #include "llvm/Analysis/DomPrinter.h"
index 6c53b41d3a10040ff45625b4b38f3feee4d8773e..821badeb42ff84893c20e33c3e456d1c38739153 100644 (file)
@@ -12,7 +12,7 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "llvm/Analysis/Passes.h"
+#include "llvm/Analysis/AliasAnalysisCounter.h"
 #include "llvm/Analysis/AliasAnalysis.h"
 #include "llvm/IR/Module.h"
 #include "llvm/Pass.h"
@@ -27,97 +27,6 @@ PrintAll("count-aa-print-all-queries", cl::ReallyHidden, cl::init(true));
 static cl::opt<bool>
 PrintAllFailures("count-aa-print-all-failed-queries", cl::ReallyHidden);
 
-namespace {
-  class AliasAnalysisCounter : public ModulePass, public AliasAnalysis {
-    unsigned No, May, Partial, Must;
-    unsigned NoMR, JustRef, JustMod, MR;
-    Module *M;
-  public:
-    static char ID; // Class identification, replacement for typeinfo
-    AliasAnalysisCounter() : ModulePass(ID) {
-      initializeAliasAnalysisCounterPass(*PassRegistry::getPassRegistry());
-      No = May = Partial = Must = 0;
-      NoMR = JustRef = JustMod = MR = 0;
-    }
-
-    void printLine(const char *Desc, unsigned Val, unsigned Sum) {
-      errs() <<  "  " << Val << " " << Desc << " responses ("
-             << Val*100/Sum << "%)\n";
-    }
-    ~AliasAnalysisCounter() override {
-      unsigned AASum = No+May+Partial+Must;
-      unsigned MRSum = NoMR+JustRef+JustMod+MR;
-      if (AASum + MRSum) { // Print a report if any counted queries occurred...
-        errs() << "\n===== Alias Analysis Counter Report =====\n"
-               << "  Analysis counted:\n"
-               << "  " << AASum << " Total Alias Queries Performed\n";
-        if (AASum) {
-          printLine("no alias",     No, AASum);
-          printLine("may alias",   May, AASum);
-          printLine("partial alias", Partial, AASum);
-          printLine("must alias", Must, AASum);
-          errs() << "  Alias Analysis Counter Summary: " << No*100/AASum << "%/"
-                 << May*100/AASum << "%/"
-                 << Partial*100/AASum << "%/"
-                 << Must*100/AASum<<"%\n\n";
-        }
-
-        errs() << "  " << MRSum << " Total MRI_Mod/MRI_Ref Queries Performed\n";
-        if (MRSum) {
-          printLine("no mod/ref",    NoMR, MRSum);
-          printLine("ref",        JustRef, MRSum);
-          printLine("mod",        JustMod, MRSum);
-          printLine("mod/ref",         MR, MRSum);
-          errs() << "  MRI_Mod/MRI_Ref Analysis Counter Summary: "
-                 << NoMR * 100 / MRSum << "%/" << JustRef * 100 / MRSum << "%/"
-                 << JustMod * 100 / MRSum << "%/" << MR * 100 / MRSum
-                 << "%\n\n";
-        }
-      }
-    }
-
-    bool runOnModule(Module &M) override {
-      this->M = &M;
-      InitializeAliasAnalysis(this, &M.getDataLayout());
-      return false;
-    }
-
-    void getAnalysisUsage(AnalysisUsage &AU) const override {
-      AliasAnalysis::getAnalysisUsage(AU);
-      AU.addRequired<AliasAnalysis>();
-      AU.setPreservesAll();
-    }
-
-    /// getAdjustedAnalysisPointer - This method is used when a pass implements
-    /// an analysis interface through multiple inheritance.  If needed, it
-    /// should override this to adjust the this pointer as needed for the
-    /// specified pass info.
-    void *getAdjustedAnalysisPointer(AnalysisID PI) override {
-      if (PI == &AliasAnalysis::ID)
-        return (AliasAnalysis*)this;
-      return this;
-    }
-    
-    // FIXME: We could count these too...
-    bool pointsToConstantMemory(const MemoryLocation &Loc,
-                                bool OrLocal) override {
-      return getAnalysis<AliasAnalysis>().pointsToConstantMemory(Loc, OrLocal);
-    }
-
-    // Forwarding functions: just delegate to a real AA implementation, counting
-    // the number of responses...
-    AliasResult alias(const MemoryLocation &LocA,
-                      const MemoryLocation &LocB) override;
-
-    ModRefInfo getModRefInfo(ImmutableCallSite CS,
-                             const MemoryLocation &Loc) override;
-    ModRefInfo getModRefInfo(ImmutableCallSite CS1,
-                             ImmutableCallSite CS2) override {
-      return AliasAnalysis::getModRefInfo(CS1,CS2);
-    }
-  };
-}
-
 char AliasAnalysisCounter::ID = 0;
 INITIALIZE_AG_PASS(AliasAnalysisCounter, AliasAnalysis, "count-aa",
                    "Count Alias Analysis Query Responses", false, true, false)