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