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