diff --git a/llvm/include/llvm/Transforms/IPO/FunctionSpecialization.h b/llvm/include/llvm/Transforms/IPO/FunctionSpecialization.h --- a/llvm/include/llvm/Transforms/IPO/FunctionSpecialization.h +++ b/llvm/include/llvm/Transforms/IPO/FunctionSpecialization.h @@ -127,11 +127,7 @@ std::function GetTTI; std::function GetAC; - // The number of functions specialised, used for collecting statistics and - // also in the cost model. - unsigned NbFunctionsSpecialized = 0; - - SmallPtrSet SpecializedFuncs; + SmallPtrSet Specializations; SmallPtrSet FullySpecialized; DenseMap FunctionMetrics; @@ -144,13 +140,9 @@ : Solver(Solver), M(M), FAM(FAM), GetTLI(GetTLI), GetTTI(GetTTI), GetAC(GetAC) {} - ~FunctionSpecializer() { - // Eliminate dead code. - removeDeadFunctions(); - cleanUpSSA(); - } + ~FunctionSpecializer(); - bool isClonedFunction(Function *F) { return SpecializedFuncs.count(F); } + bool isClonedFunction(Function *F) { return Specializations.count(F); } bool run(); diff --git a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp --- a/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp +++ b/llvm/lib/Transforms/IPO/FunctionSpecialization.cpp @@ -64,7 +64,7 @@ #define DEBUG_TYPE "function-specialization" -STATISTIC(NumFuncSpecialized, "Number of functions specialized"); +STATISTIC(NumSpecsCreated, "Number of specializations created"); static cl::opt ForceFunctionSpecialization( "force-function-specialization", cl::init(false), cl::Hidden, @@ -234,7 +234,7 @@ /// Remove any ssa_copy intrinsics that may have been introduced. void FunctionSpecializer::cleanUpSSA() { - for (Function *F : SpecializedFuncs) + for (Function *F : Specializations) removeSSACopy(*F); } @@ -253,6 +253,16 @@ } }; +FunctionSpecializer::~FunctionSpecializer() { + LLVM_DEBUG( + if (NumSpecsCreated > 0) + dbgs() << "FnSpecialization: Created " << NumSpecsCreated + << " specializations in module " << M.getName() << "\n"); + // Eliminate dead code. + removeDeadFunctions(); + cleanUpSSA(); +} + /// Attempt to specialize functions in the module to enable constant /// propagation across function boundaries. /// @@ -358,11 +368,6 @@ } promoteConstantStackValues(); - LLVM_DEBUG(if (NbFunctionsSpecialized) dbgs() - << "FnSpecialization: Specialized " << NbFunctionsSpecialized - << " functions in module " << M.getName() << "\n"); - - NumFuncSpecialized += NbFunctionsSpecialized; return true; } @@ -506,7 +511,7 @@ return false; // Do not specialize the cloned function again. - if (SpecializedFuncs.contains(F)) + if (Specializations.contains(F)) return false; // If we're optimizing the function for size, we shouldn't specialize it. @@ -540,8 +545,8 @@ Solver.markBlockExecutable(&Clone->front()); // Mark all the specialized functions - SpecializedFuncs.insert(Clone); - NbFunctionsSpecialized++; + Specializations.insert(Clone); + ++NumSpecsCreated; return Clone; } diff --git a/llvm/test/Transforms/FunctionSpecialization/function-specialization-stats.ll b/llvm/test/Transforms/FunctionSpecialization/function-specialization-stats.ll --- a/llvm/test/Transforms/FunctionSpecialization/function-specialization-stats.ll +++ b/llvm/test/Transforms/FunctionSpecialization/function-specialization-stats.ll @@ -1,7 +1,7 @@ ; REQUIRES: asserts ; RUN: opt -stats -passes="ipsccp" -S -force-function-specialization < %s 2>&1 | FileCheck %s -; CHECK: 2 function-specialization - Number of functions specialized +; CHECK: 2 function-specialization - Number of specializations created define i64 @main(i64 %x, i1 %flag) { entry: