1dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===- CGSCCPassManager.cpp - Managing & running CGSCC passes -------------===//
2dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//
3dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//                     The LLVM Compiler Infrastructure
4dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//
5dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// This file is distributed under the University of Illinois Open Source
6dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// License. See LICENSE.TXT for details.
7dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//
8dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines//===----------------------------------------------------------------------===//
9dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
10dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Analysis/CGSCCPassManager.h"
11dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/CommandLine.h"
12dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines#include "llvm/Support/Debug.h"
13dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
14dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesusing namespace llvm;
15dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
16dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hineschar CGSCCAnalysisManagerModuleProxy::PassID;
17dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
18dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesCGSCCAnalysisManagerModuleProxy::Result
19ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesCGSCCAnalysisManagerModuleProxy::run(Module &M) {
20dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert(CGAM->empty() && "CGSCC analyses ran prior to the module proxy!");
21dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Result(*CGAM);
22dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
23dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
24dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesCGSCCAnalysisManagerModuleProxy::Result::~Result() {
25dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Clear out the analysis manager if we're being destroyed -- it means we
26dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // didn't even see an invalidate call when we got invalidated.
27dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  CGAM->clear();
28dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
29dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
30dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesbool CGSCCAnalysisManagerModuleProxy::Result::invalidate(
31ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    Module &M, const PreservedAnalyses &PA) {
32dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // If this proxy isn't marked as preserved, then we can't even invalidate
33dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // individual CGSCC analyses, there may be an invalid set of SCC objects in
34dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // the cache making it impossible to incrementally preserve them.
35dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Just clear the entire manager.
36dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!PA.preserved(ID()))
37dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    CGAM->clear();
38dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
39dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Return false to indicate that this result is still a valid proxy.
40dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return false;
41dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
43dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hineschar ModuleAnalysisManagerCGSCCProxy::PassID;
44dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
45dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hineschar FunctionAnalysisManagerCGSCCProxy::PassID;
46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
47dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesFunctionAnalysisManagerCGSCCProxy::Result
48ebe69fe11e48d322045d5949c83283927a0d790bStephen HinesFunctionAnalysisManagerCGSCCProxy::run(LazyCallGraph::SCC &C) {
49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  assert(FAM->empty() && "Function analyses ran prior to the CGSCC proxy!");
50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return Result(*FAM);
51dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
52dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen HinesFunctionAnalysisManagerCGSCCProxy::Result::~Result() {
54dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Clear out the analysis manager if we're being destroyed -- it means we
55dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // didn't even see an invalidate call when we got invalidated.
56dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  FAM->clear();
57dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
58dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
59dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesbool FunctionAnalysisManagerCGSCCProxy::Result::invalidate(
60ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines    LazyCallGraph::SCC &C, const PreservedAnalyses &PA) {
61dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // If this proxy isn't marked as preserved, then we can't even invalidate
62dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // individual function analyses, there may be an invalid set of Function
63dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // objects in the cache making it impossible to incrementally preserve them.
64dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Just clear the entire manager.
65dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  if (!PA.preserved(ID()))
66dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines    FAM->clear();
67dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
68dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  // Return false to indicate that this result is still a valid proxy.
69dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines  return false;
70dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines}
71dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines
72dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hineschar CGSCCAnalysisManagerFunctionProxy::PassID;
73