diff --git a/include/llvm/IR/LegacyPassManagers.h b/include/llvm/IR/LegacyPassManagers.h index f7c15500212..0bc25756e02 100644 --- a/include/llvm/IR/LegacyPassManagers.h +++ b/include/llvm/IR/LegacyPassManagers.h @@ -410,8 +410,10 @@ public: /// Emit a remark signifying that the number of IR instructions in the module /// changed. + /// \p F is optionally passed by passes which run on Functions, and thus + /// always know whether or not a non-empty function is available. void emitInstrCountChangedRemark(Pass *P, Module &M, int64_t Delta, - unsigned CountBefore); + unsigned CountBefore, Function *F = nullptr); protected: // Top level manager. diff --git a/lib/Analysis/LoopPass.cpp b/lib/Analysis/LoopPass.cpp index f60b1815ce4..3629ae90da5 100644 --- a/lib/Analysis/LoopPass.cpp +++ b/lib/Analysis/LoopPass.cpp @@ -226,7 +226,7 @@ bool LPPassManager::runOnFunction(Function &F) { if (NewSize != FunctionSize) { int64_t Delta = static_cast(NewSize) - static_cast(FunctionSize); - emitInstrCountChangedRemark(P, M, Delta, InstrCount); + emitInstrCountChangedRemark(P, M, Delta, InstrCount, &F); InstrCount = static_cast(InstrCount) + Delta; FunctionSize = NewSize; } diff --git a/lib/IR/LegacyPassManager.cpp b/lib/IR/LegacyPassManager.cpp index cfec2c98f20..a413f6ed925 100644 --- a/lib/IR/LegacyPassManager.cpp +++ b/lib/IR/LegacyPassManager.cpp @@ -143,7 +143,8 @@ unsigned PMDataManager::initSizeRemarkInfo(Module &M) { void PMDataManager::emitInstrCountChangedRemark(Pass *P, Module &M, int64_t Delta, - unsigned CountBefore) { + unsigned CountBefore, + Function *F) { // If it's a pass manager, don't emit a remark. (This hinges on the assumption // that the only passes that return non-null with getAsPMDataManager are pass // managers.) The reason we have to do this is to avoid emitting remarks for @@ -151,19 +152,22 @@ void PMDataManager::emitInstrCountChangedRemark(Pass *P, Module &M, if (P->getAsPMDataManager()) return; - // We need a function containing at least one basic block in order to output - // remarks. Since it's possible that the first function in the module doesn't - // actually contain a basic block, we have to go and find one that's suitable - // for emitting remarks. - auto It = std::find_if(M.begin(), M.end(), - [](const Function &Fn) { return !Fn.empty(); }); + // Do we have a function we can use to emit a remark? + if (F == nullptr) { + // We need a function containing at least one basic block in order to output + // remarks. Since it's possible that the first function in the module + // doesn't actually contain a basic block, we have to go and find one that's + // suitable for emitting remarks. + auto It = std::find_if(M.begin(), M.end(), + [](const Function &Fn) { return !Fn.empty(); }); - // Didn't find a function. Quit. - if (It == M.end()) - return; + // Didn't find a function. Quit. + if (It == M.end()) + return; - // We found a function containing at least one basic block. - Function *F = &*It; + // We found a function containing at least one basic block. + F = &*It; + } int64_t CountAfter = static_cast(CountBefore) + Delta; BasicBlock &BB = *F->begin(); OptimizationRemarkAnalysis R("size-info", "IRSizeChange", @@ -1306,7 +1310,7 @@ bool BBPassManager::runOnFunction(Function &F) { if (NewSize != BBSize) { int64_t Delta = static_cast(NewSize) - static_cast(BBSize); - emitInstrCountChangedRemark(BP, M, Delta, InstrCount); + emitInstrCountChangedRemark(BP, M, Delta, InstrCount, &F); InstrCount = static_cast(InstrCount) + Delta; BBSize = NewSize; } @@ -1543,7 +1547,7 @@ bool FPPassManager::runOnFunction(Function &F) { if (NewSize != FunctionSize) { int64_t Delta = static_cast(NewSize) - static_cast(FunctionSize); - emitInstrCountChangedRemark(FP, M, Delta, InstrCount); + emitInstrCountChangedRemark(FP, M, Delta, InstrCount, &F); InstrCount = static_cast(InstrCount) + Delta; FunctionSize = NewSize; }