52 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8//9// This is an analysis pass to track a set of passes that have been run, so that10// we can avoid running a pass again if there is no change since the last run of11// the pass.12//13//===----------------------------------------------------------------------===//14 15#include "llvm/Analysis/LastRunTrackingAnalysis.h"16#include "llvm/ADT/Statistic.h"17#include "llvm/Support/CommandLine.h"18 19using namespace llvm;20 21#define DEBUG_TYPE "last-run-tracking"22STATISTIC(NumSkippedPasses, "Number of skipped passes");23STATISTIC(NumLRTQueries, "Number of LastRunTracking queries");24 25static cl::opt<bool>26 DisableLastRunTracking("disable-last-run-tracking", cl::Hidden,27 cl::desc("Disable last run tracking"),28 cl::init(false));29 30bool 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 44void LastRunTrackingInfo::updateImpl(PassID ID, bool Changed,45 CompatibilityCheckFn CheckFn) {46 if (Changed)47 TrackedPasses.clear();48 TrackedPasses[ID] = std::move(CheckFn);49}50 51AnalysisKey LastRunTrackingAnalysis::Key;52