SILOptimizer: add a mandatory generic-specialization pass.

This pass is only used for functions with performance annotations (@_noLocks, @_noAllocation).
It runs in the mandatory pipeline and specializes all function calls in performance-annotated functions and functions which are called from such functions.
In addition, the pass also does some other related optimizations: devirtualization, constant-folding Builtin.canBeClass, inlining of transparent functions and memory access optimizations.
This commit is contained in:
Erik Eckstein
2021-10-25 14:15:46 +02:00
parent dc8d4821dc
commit 569a520db2
5 changed files with 197 additions and 35 deletions

View File

@@ -1829,11 +1829,12 @@ ReabstractionInfo::ReabstractionInfo(ModuleDecl *targetModule,
GenericFuncSpecializer::GenericFuncSpecializer(
SILOptFunctionBuilder &FuncBuilder, SILFunction *GenericFunc,
SubstitutionMap ParamSubs,
const ReabstractionInfo &ReInfo)
const ReabstractionInfo &ReInfo,
bool isMandatory)
: FuncBuilder(FuncBuilder), M(GenericFunc->getModule()),
GenericFunc(GenericFunc),
ParamSubs(ParamSubs),
ReInfo(ReInfo) {
ReInfo(ReInfo), isMandatory(isMandatory) {
assert((GenericFunc->isDefinition() || ReInfo.isPrespecialized()) &&
"Expected definition or pre-specialized entry-point to specialize!");
@@ -1888,7 +1889,7 @@ void ReabstractionInfo::verify() const {
SILFunction *
GenericFuncSpecializer::tryCreateSpecialization(bool forcePrespecialization) {
// Do not create any new specializations at Onone.
if (!GenericFunc->shouldOptimize() && !forcePrespecialization)
if (!GenericFunc->shouldOptimize() && !forcePrespecialization && !isMandatory)
return nullptr;
LLVM_DEBUG(llvm::dbgs() << "Creating a specialization: "
@@ -2564,7 +2565,8 @@ void swift::trySpecializeApplyOfGeneric(
SILOptFunctionBuilder &FuncBuilder,
ApplySite Apply, DeadInstructionSet &DeadApplies,
SmallVectorImpl<SILFunction *> &NewFunctions,
OptRemark::Emitter &ORE) {
OptRemark::Emitter &ORE,
bool isMandatory) {
assert(Apply.hasSubstitutions() && "Expected an apply with substitutions!");
auto *F = Apply.getFunction();
auto *RefF =
@@ -2683,7 +2685,7 @@ void swift::trySpecializeApplyOfGeneric(
GenericFuncSpecializer FuncSpecializer(FuncBuilder,
RefF, Apply.getSubstitutionMap(),
ReInfo);
ReInfo, isMandatory);
SILFunction *SpecializedF = prespecializedF
? prespecializedF
: FuncSpecializer.lookupSpecialization();