Home | History | Annotate | Line # | Download | only in Analysis
      1 //===- AliasAnalysisEvaluator.h - Alias Analysis Accuracy Evaluator -------===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 /// \file
      9 ///
     10 /// This file implements a simple N^2 alias analysis accuracy evaluator. The
     11 /// analysis result is a set of statistics of how many times the AA
     12 /// infrastructure provides each kind of alias result and mod/ref result when
     13 /// queried with all pairs of pointers in the function.
     14 ///
     15 /// It can be used to evaluate a change in an alias analysis implementation,
     16 /// algorithm, or the AA pipeline infrastructure itself. It acts like a stable
     17 /// and easily tested consumer of all AA information exposed.
     18 ///
     19 /// This is inspired and adapted from code by: Naveen Neelakantam, Francesco
     20 /// Spadini, and Wojciech Stryjewski.
     21 ///
     22 //===----------------------------------------------------------------------===//
     23 
     24 #ifndef LLVM_ANALYSIS_ALIASANALYSISEVALUATOR_H
     25 #define LLVM_ANALYSIS_ALIASANALYSISEVALUATOR_H
     26 
     27 #include "llvm/IR/Function.h"
     28 #include "llvm/IR/PassManager.h"
     29 
     30 namespace llvm {
     31 class AAResults;
     32 
     33 class AAEvaluator : public PassInfoMixin<AAEvaluator> {
     34   int64_t FunctionCount;
     35   int64_t NoAliasCount, MayAliasCount, PartialAliasCount, MustAliasCount;
     36   int64_t NoModRefCount, ModCount, RefCount, ModRefCount;
     37   int64_t MustCount, MustRefCount, MustModCount, MustModRefCount;
     38 
     39 public:
     40   AAEvaluator()
     41       : FunctionCount(), NoAliasCount(), MayAliasCount(), PartialAliasCount(),
     42         MustAliasCount(), NoModRefCount(), ModCount(), RefCount(),
     43         ModRefCount(), MustCount(), MustRefCount(), MustModCount(),
     44         MustModRefCount() {}
     45   AAEvaluator(AAEvaluator &&Arg)
     46       : FunctionCount(Arg.FunctionCount), NoAliasCount(Arg.NoAliasCount),
     47         MayAliasCount(Arg.MayAliasCount),
     48         PartialAliasCount(Arg.PartialAliasCount),
     49         MustAliasCount(Arg.MustAliasCount), NoModRefCount(Arg.NoModRefCount),
     50         ModCount(Arg.ModCount), RefCount(Arg.RefCount),
     51         ModRefCount(Arg.ModRefCount), MustCount(Arg.MustCount),
     52         MustRefCount(Arg.MustRefCount), MustModCount(Arg.MustModCount),
     53         MustModRefCount(Arg.MustModRefCount) {
     54     Arg.FunctionCount = 0;
     55   }
     56   ~AAEvaluator();
     57 
     58   /// Run the pass over the function.
     59   PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
     60 
     61 private:
     62   // Allow the legacy pass to run this using an internal API.
     63   friend class AAEvalLegacyPass;
     64 
     65   void runInternal(Function &F, AAResults &AA);
     66 };
     67 
     68 /// Create a wrapper of the above for the legacy pass manager.
     69 FunctionPass *createAAEvalPass();
     70 
     71 }
     72 
     73 #endif
     74