From 3a15cee0840f1cf5e901b790a5b8b0aa2f65b294 Mon Sep 17 00:00:00 2001 From: Andrew Trick Date: Thu, 8 Feb 2018 11:27:46 -0800 Subject: [PATCH] -sil-print-all (et al.) should print specialized functions when they are created. --- .../SILOptimizer/PassManager/PassManager.h | 6 ++++++ .../swift/SILOptimizer/PassManager/Transforms.h | 2 ++ lib/SILOptimizer/PassManager/PassManager.cpp | 17 +++++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/include/swift/SILOptimizer/PassManager/PassManager.h b/include/swift/SILOptimizer/PassManager/PassManager.h index ba505f3b4fa..fbda728a57a 100644 --- a/include/swift/SILOptimizer/PassManager/PassManager.h +++ b/include/swift/SILOptimizer/PassManager/PassManager.h @@ -155,6 +155,9 @@ public: CompletedPassesMap.clear(); } + /// \brief Notify the pass manager of a newly create function for tracing. + void notifyOfNewFunction(SILFunction *F, SILTransform *T); + /// \brief Add the function \p F to the function pass worklist. /// If not null, the function \p DerivedFrom is the function from which \p F /// is derived. This is used to avoid an infinite amount of functions pushed @@ -291,6 +294,9 @@ private: /// Return true if all analyses are unlocked. bool analysesUnlocked(); + /// Dumps information about the pass with index \p TransIdx to llvm::dbgs(). + void dumpPassInfo(const char *Title, SILTransform *Tr, SILFunction *F); + /// Dumps information about the pass with index \p TransIdx to llvm::dbgs(). void dumpPassInfo(const char *Title, unsigned TransIdx, SILFunction *F = nullptr); diff --git a/include/swift/SILOptimizer/PassManager/Transforms.h b/include/swift/SILOptimizer/PassManager/Transforms.h index 79b5130b57a..b88a8397b01 100644 --- a/include/swift/SILOptimizer/PassManager/Transforms.h +++ b/include/swift/SILOptimizer/PassManager/Transforms.h @@ -114,6 +114,7 @@ namespace swift { /// The number should be small anyway, but bugs in optimizations could cause /// an infinite loop in the passmanager. void notifyAddFunction(SILFunction *F, SILFunction *DerivedFrom) { + PM->notifyOfNewFunction(F, this); PM->addFunctionToWorklist(F, DerivedFrom); PM->notifyAnalysisOfFunction(F); } @@ -171,6 +172,7 @@ namespace swift { /// Inform the pass manager of an added function. void notifyAddFunction(SILFunction *F) { + PM->notifyOfNewFunction(F, this); PM->notifyAnalysisOfFunction(F); } }; diff --git a/lib/SILOptimizer/PassManager/PassManager.cpp b/lib/SILOptimizer/PassManager/PassManager.cpp index d4d321f82b9..40688d17f0a 100644 --- a/lib/SILOptimizer/PassManager/PassManager.cpp +++ b/lib/SILOptimizer/PassManager/PassManager.cpp @@ -283,6 +283,16 @@ static bool breakBeforeRunning(StringRef fnName, SILFunctionTransform *SFT) { && (SFT->getID() == SILBreakOnPass || SFT->getTag() == SILBreakOnPass); } +void SILPassManager::dumpPassInfo(const char *Title, SILTransform *Tr, + SILFunction *F) { + llvm::dbgs() << " " << Title << " #" << NumPassesRun << ", stage " + << StageName << ", pass : " << Tr->getID() + << " (" << Tr->getTag() << ")"; + if (F) + llvm::dbgs() << ", Function: " << F->getName(); + llvm::dbgs() << '\n'; +} + void SILPassManager::dumpPassInfo(const char *Title, unsigned TransIdx, SILFunction *F) { SILTransform *Tr = Transformations[TransIdx]; @@ -541,6 +551,13 @@ SILPassManager::~SILPassManager() { } } +void SILPassManager::notifyOfNewFunction(SILFunction *F, SILTransform *T) { + if (doPrintAfter(T, F, SILPrintAll)) { + dumpPassInfo("*** New SIL function in ", T, F); + F->dump(getOptions().EmitVerboseSIL); + } +} + void SILPassManager::addFunctionToWorklist(SILFunction *F, SILFunction *DerivedFrom) { assert(F && F->isDefinition() && (isMandatoryPipeline || F->shouldOptimize())