diff options
Diffstat (limited to 'lib/Analysis/CallGraphSCCPass.cpp')
| -rw-r--r-- | lib/Analysis/CallGraphSCCPass.cpp | 62 | 
1 files changed, 35 insertions, 27 deletions
| diff --git a/lib/Analysis/CallGraphSCCPass.cpp b/lib/Analysis/CallGraphSCCPass.cpp index a2dda58a6a2f..f2211edba216 100644 --- a/lib/Analysis/CallGraphSCCPass.cpp +++ b/lib/Analysis/CallGraphSCCPass.cpp @@ -120,6 +120,7 @@ bool CGPassManager::RunPassOnSCC(Pass *P, CallGraphSCC &CurSCC,                                   bool &DevirtualizedCall) {    bool Changed = false;    PMDataManager *PM = P->getAsPMDataManager(); +  Module &M = CG.getModule();    if (!PM) {      CallGraphSCCPass *CGSP = (CallGraphSCCPass*)P; @@ -129,8 +130,17 @@ bool CGPassManager::RunPassOnSCC(Pass *P, CallGraphSCC &CurSCC,      }      { +      unsigned InstrCount = 0; +      bool EmitICRemark = M.shouldEmitInstrCountChangedRemark();        TimeRegion PassTimer(getPassTimer(CGSP)); +      if (EmitICRemark) +        InstrCount = initSizeRemarkInfo(M);        Changed = CGSP->runOnSCC(CurSCC); + +      // If the pass modified the module, it may have modified the instruction +      // count of the module. Try emitting a remark. +      if (EmitICRemark) +        emitInstrCountChangedRemark(P, M, InstrCount);      }      // After the CGSCCPass is done, when assertions are enabled, use @@ -162,8 +172,8 @@ bool CGPassManager::RunPassOnSCC(Pass *P, CallGraphSCC &CurSCC,    // The function pass(es) modified the IR, they may have clobbered the    // callgraph.    if (Changed && CallGraphUpToDate) { -    DEBUG(dbgs() << "CGSCCPASSMGR: Pass Dirtied SCC: " -                 << P->getPassName() << '\n'); +    LLVM_DEBUG(dbgs() << "CGSCCPASSMGR: Pass Dirtied SCC: " << P->getPassName() +                      << '\n');      CallGraphUpToDate = false;    }    return Changed; @@ -181,12 +191,11 @@ bool CGPassManager::RunPassOnSCC(Pass *P, CallGraphSCC &CurSCC,  bool CGPassManager::RefreshCallGraph(const CallGraphSCC &CurSCC, CallGraph &CG,                                       bool CheckingMode) {    DenseMap<Value*, CallGraphNode*> CallSites; -   -  DEBUG(dbgs() << "CGSCCPASSMGR: Refreshing SCC with " << CurSCC.size() -               << " nodes:\n"; -        for (CallGraphNode *CGN : CurSCC) -          CGN->dump(); -        ); + +  LLVM_DEBUG(dbgs() << "CGSCCPASSMGR: Refreshing SCC with " << CurSCC.size() +                    << " nodes:\n"; +             for (CallGraphNode *CGN +                  : CurSCC) CGN->dump(););    bool MadeChange = false;    bool DevirtualizedCall = false; @@ -307,8 +316,8 @@ bool CGPassManager::RefreshCallGraph(const CallGraphSCC &CurSCC, CallGraph &CG,              // one.              if (!ExistingNode->getFunction()) {                DevirtualizedCall = true; -              DEBUG(dbgs() << "  CGSCCPASSMGR: Devirtualized call to '" -                           << Callee->getName() << "'\n"); +              LLVM_DEBUG(dbgs() << "  CGSCCPASSMGR: Devirtualized call to '" +                                << Callee->getName() << "'\n");              }            } else {              CalleeNode = CG.getCallsExternalNode(); @@ -363,17 +372,15 @@ bool CGPassManager::RefreshCallGraph(const CallGraphSCC &CurSCC, CallGraph &CG,        CallSites.clear();    } -  DEBUG(if (MadeChange) { -          dbgs() << "CGSCCPASSMGR: Refreshed SCC is now:\n"; -          for (CallGraphNode *CGN : CurSCC) -            CGN->dump(); -          if (DevirtualizedCall) -            dbgs() << "CGSCCPASSMGR: Refresh devirtualized a call!\n"; - -         } else { -           dbgs() << "CGSCCPASSMGR: SCC Refresh didn't change call graph.\n"; -         } -        ); +  LLVM_DEBUG(if (MadeChange) { +    dbgs() << "CGSCCPASSMGR: Refreshed SCC is now:\n"; +    for (CallGraphNode *CGN : CurSCC) +      CGN->dump(); +    if (DevirtualizedCall) +      dbgs() << "CGSCCPASSMGR: Refresh devirtualized a call!\n"; +  } else { +    dbgs() << "CGSCCPASSMGR: SCC Refresh didn't change call graph.\n"; +  });    (void)MadeChange;    return DevirtualizedCall; @@ -472,16 +479,17 @@ bool CGPassManager::runOnModule(Module &M) {      unsigned Iteration = 0;      bool DevirtualizedCall = false;      do { -      DEBUG(if (Iteration) -              dbgs() << "  SCCPASSMGR: Re-visiting SCC, iteration #" -                     << Iteration << '\n'); +      LLVM_DEBUG(if (Iteration) dbgs() +                 << "  SCCPASSMGR: Re-visiting SCC, iteration #" << Iteration +                 << '\n');        DevirtualizedCall = false;        Changed |= RunAllPassesOnSCC(CurSCC, CG, DevirtualizedCall);      } while (Iteration++ < MaxIterations && DevirtualizedCall);      if (DevirtualizedCall) -      DEBUG(dbgs() << "  CGSCCPASSMGR: Stopped iteration after " << Iteration -                   << " times, due to -max-cg-scc-iterations\n"); +      LLVM_DEBUG(dbgs() << "  CGSCCPASSMGR: Stopped iteration after " +                        << Iteration +                        << " times, due to -max-cg-scc-iterations\n");      MaxSCCIterations.updateMax(Iteration);    } @@ -648,7 +656,7 @@ Pass *CallGraphSCCPass::createPrinterPass(raw_ostream &OS,  bool CallGraphSCCPass::skipSCC(CallGraphSCC &SCC) const {    return !SCC.getCallGraph().getModule()                .getContext() -              .getOptBisect() +              .getOptPassGate()                .shouldRunPass(this, SCC);  } | 
