Skip to content

Commit

Permalink
Instantiate fewer templates in PassManager::addPass()
Browse files Browse the repository at this point in the history
We create many instantiations of PassManager::addPass() in
PassBuilder.cpp.  vector::emplace_back() and make_unique() are both
templated and would have many instantiations based on the number of
times we instantiate addPass().  Now we directly construct the
unique_ptr with the type as the actual unique_ptr type in the vector we
are adding it to, so we only have one unique_ptr constructor
instantiation across all addPass() instantiations and only the
non-templated push_back().

This makes PassBuilder.cpp slightly faster to build.

Reviewed By: rnk

Differential Revision: https://reviews.llvm.org/D110775
  • Loading branch information
aeubanks committed Sep 30, 2021
1 parent 7653482 commit fc7604a
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 8 deletions.
7 changes: 5 additions & 2 deletions llvm/include/llvm/IR/PassManager.h
Expand Up @@ -554,7 +554,10 @@ class PassManager : public PassInfoMixin<
detail::PassModel<IRUnitT, PassT, PreservedAnalyses, AnalysisManagerT,
ExtraArgTs...>;

Passes.emplace_back(new PassModelT(std::forward<PassT>(Pass)));
// Do not use make_unique or emplace_back, they cause too many template
// instantiations, causing terrible compile times.
Passes.push_back(std::unique_ptr<PassConceptT>(
new PassModelT(std::forward<PassT>(Pass))));
}

/// When adding a pass manager pass that has the same type as this pass
Expand All @@ -566,7 +569,7 @@ class PassManager : public PassInfoMixin<
std::enable_if_t<std::is_same<PassT, PassManager>::value>
addPass(PassT &&Pass) {
for (auto &P : Pass.Passes)
Passes.emplace_back(std::move(P));
Passes.push_back(std::move(P));
}

/// Returns if the pass manager contains any passes.
Expand Down
16 changes: 10 additions & 6 deletions llvm/include/llvm/Transforms/Scalar/LoopPassManager.h
Expand Up @@ -109,7 +109,10 @@ class PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
detail::PassModel<Loop, PassT, PreservedAnalyses, LoopAnalysisManager,
LoopStandardAnalysisResults &, LPMUpdater &>;
IsLoopNestPass.push_back(false);
LoopPasses.emplace_back(new LoopPassModelT(std::forward<PassT>(Pass)));
// Do not use make_unique or emplace_back, they cause too many template
// instantiations, causing terrible compile times.
LoopPasses.push_back(std::unique_ptr<LoopPassConceptT>(
new LoopPassModelT(std::forward<PassT>(Pass))));
}

template <typename PassT>
Expand All @@ -120,8 +123,8 @@ class PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
LoopAnalysisManager, LoopStandardAnalysisResults &,
LPMUpdater &>;
IsLoopNestPass.push_back(true);
LoopNestPasses.emplace_back(
new LoopNestPassModelT(std::forward<PassT>(Pass)));
LoopNestPasses.push_back(std::unique_ptr<LoopNestPassConceptT>(
new LoopNestPassModelT(std::forward<PassT>(Pass))));
}

// Specializations of `addPass` for `RepeatedPass`. These are necessary since
Expand All @@ -135,7 +138,8 @@ class PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
LoopAnalysisManager, LoopStandardAnalysisResults &,
LPMUpdater &>;
IsLoopNestPass.push_back(false);
LoopPasses.emplace_back(new RepeatedLoopPassModelT(std::move(Pass)));
LoopPasses.push_back(std::unique_ptr<LoopPassConceptT>(
new RepeatedLoopPassModelT(std::move(Pass))));
}

template <typename PassT>
Expand All @@ -146,8 +150,8 @@ class PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
LoopAnalysisManager, LoopStandardAnalysisResults &,
LPMUpdater &>;
IsLoopNestPass.push_back(true);
LoopNestPasses.emplace_back(
new RepeatedLoopNestPassModelT(std::move(Pass)));
LoopNestPasses.push_back(std::unique_ptr<LoopNestPassConceptT>(
new RepeatedLoopNestPassModelT(std::move(Pass))));
}

bool isEmpty() const { return LoopPasses.empty() && LoopNestPasses.empty(); }
Expand Down

0 comments on commit fc7604a

Please sign in to comment.