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