[clang] Add test for CWG190 "Layout-compatible POD-struct types" (#121668)
[llvm-project.git] / llvm / lib / Analysis / LastRunTrackingAnalysis.cpp
blob9add9a598f2b036a86cf0afade194923dff26fbc
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.
13 //===----------------------------------------------------------------------===//
15 #include "llvm/Analysis/LastRunTrackingAnalysis.h"
16 #include "llvm/ADT/Statistic.h"
17 #include "llvm/Support/CommandLine.h"
19 using namespace llvm;
21 #define DEBUG_TYPE "last-run-tracking"
22 STATISTIC(NumSkippedPasses, "Number of skipped passes");
23 STATISTIC(NumLRTQueries, "Number of LastRunTracking queries");
25 static cl::opt<bool>
26 DisableLastRunTracking("disable-last-run-tracking", cl::Hidden,
27 cl::desc("Disable last run tracking"),
28 cl::init(false));
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;
41 return false;
44 void LastRunTrackingInfo::updateImpl(PassID ID, bool Changed,
45 CompatibilityCheckFn CheckFn) {
46 if (Changed)
47 TrackedPasses.clear();
48 TrackedPasses[ID] = std::move(CheckFn);
51 AnalysisKey LastRunTrackingAnalysis::Key;