xref: /llvm-project/llvm/lib/Analysis/LastRunTrackingAnalysis.cpp (revision cacbe71af7b1075f8ad1f84e002d1fcc83e85713)
1*cacbe71aSYingwei Zheng //===- LastRunTrackingAnalysis.cpp - Avoid running redundant pass -*- C++ -*-=//
2*cacbe71aSYingwei Zheng //
3*cacbe71aSYingwei Zheng // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*cacbe71aSYingwei Zheng // See https://llvm.org/LICENSE.txt for license information.
5*cacbe71aSYingwei Zheng // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*cacbe71aSYingwei Zheng //
7*cacbe71aSYingwei Zheng //===----------------------------------------------------------------------===//
8*cacbe71aSYingwei Zheng //
9*cacbe71aSYingwei Zheng // This is an analysis pass to track a set of passes that have been run, so that
10*cacbe71aSYingwei Zheng // we can avoid running a pass again if there is no change since the last run of
11*cacbe71aSYingwei Zheng // the pass.
12*cacbe71aSYingwei Zheng //
13*cacbe71aSYingwei Zheng //===----------------------------------------------------------------------===//
14*cacbe71aSYingwei Zheng 
15*cacbe71aSYingwei Zheng #include "llvm/Analysis/LastRunTrackingAnalysis.h"
16*cacbe71aSYingwei Zheng #include "llvm/ADT/Statistic.h"
17*cacbe71aSYingwei Zheng #include "llvm/Support/CommandLine.h"
18*cacbe71aSYingwei Zheng 
19*cacbe71aSYingwei Zheng using namespace llvm;
20*cacbe71aSYingwei Zheng 
21*cacbe71aSYingwei Zheng #define DEBUG_TYPE "last-run-tracking"
22*cacbe71aSYingwei Zheng STATISTIC(NumSkippedPasses, "Number of skipped passes");
23*cacbe71aSYingwei Zheng STATISTIC(NumLRTQueries, "Number of LastRunTracking queries");
24*cacbe71aSYingwei Zheng 
25*cacbe71aSYingwei Zheng static cl::opt<bool>
26*cacbe71aSYingwei Zheng     DisableLastRunTracking("disable-last-run-tracking", cl::Hidden,
27*cacbe71aSYingwei Zheng                            cl::desc("Disable last run tracking"),
28*cacbe71aSYingwei Zheng                            cl::init(false));
29*cacbe71aSYingwei Zheng 
30*cacbe71aSYingwei Zheng bool LastRunTrackingInfo::shouldSkipImpl(PassID ID, OptionPtr Ptr) const {
31*cacbe71aSYingwei Zheng   if (DisableLastRunTracking)
32*cacbe71aSYingwei Zheng     return false;
33*cacbe71aSYingwei Zheng   ++NumLRTQueries;
34*cacbe71aSYingwei Zheng   auto Iter = TrackedPasses.find(ID);
35*cacbe71aSYingwei Zheng   if (Iter == TrackedPasses.end())
36*cacbe71aSYingwei Zheng     return false;
37*cacbe71aSYingwei Zheng   if (!Iter->second || Iter->second(Ptr)) {
38*cacbe71aSYingwei Zheng     ++NumSkippedPasses;
39*cacbe71aSYingwei Zheng     return true;
40*cacbe71aSYingwei Zheng   }
41*cacbe71aSYingwei Zheng   return false;
42*cacbe71aSYingwei Zheng }
43*cacbe71aSYingwei Zheng 
44*cacbe71aSYingwei Zheng void LastRunTrackingInfo::updateImpl(PassID ID, bool Changed,
45*cacbe71aSYingwei Zheng                                      CompatibilityCheckFn CheckFn) {
46*cacbe71aSYingwei Zheng   if (Changed)
47*cacbe71aSYingwei Zheng     TrackedPasses.clear();
48*cacbe71aSYingwei Zheng   TrackedPasses[ID] = std::move(CheckFn);
49*cacbe71aSYingwei Zheng }
50*cacbe71aSYingwei Zheng 
51*cacbe71aSYingwei Zheng AnalysisKey LastRunTrackingAnalysis::Key;
52