[llvm] [Scalar] Simplify addPass and createFunctionToLoopPassAdaptor (NFC) (PR #137505)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Apr 27 00:41:02 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-transforms
Author: Kazu Hirata (kazutakahirata)
<details>
<summary>Changes</summary>
We can use "constexpt if" to combine the two variants of functions.
---
Full diff: https://github.com/llvm/llvm-project/pull/137505.diff
1 Files Affected:
- (modified) llvm/include/llvm/Transforms/Scalar/LoopPassManager.h (+47-58)
``````````diff
diff --git a/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h b/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h
index f55022fbff07c..e1e1cbfdbf7a4 100644
--- a/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h
+++ b/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h
@@ -102,32 +102,26 @@ class PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
/// loop-nests instead. Also append whether \p Pass is loop-nest pass or not
/// to the end of \var IsLoopNestPass so we can easily identify the types of
/// passes in the pass manager later.
- template <typename PassT>
- LLVM_ATTRIBUTE_MINSIZE
- std::enable_if_t<is_detected<HasRunOnLoopT, PassT>::value>
- addPass(PassT &&Pass) {
- using LoopPassModelT =
- detail::PassModel<Loop, PassT, LoopAnalysisManager,
- LoopStandardAnalysisResults &, LPMUpdater &>;
- IsLoopNestPass.push_back(false);
- // 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>
- LLVM_ATTRIBUTE_MINSIZE
- std::enable_if_t<!is_detected<HasRunOnLoopT, PassT>::value>
- addPass(PassT &&Pass) {
- using LoopNestPassModelT =
- detail::PassModel<LoopNest, PassT, LoopAnalysisManager,
- LoopStandardAnalysisResults &, LPMUpdater &>;
- IsLoopNestPass.push_back(true);
- // Do not use make_unique or emplace_back, they cause too many template
- // instantiations, causing terrible compile times.
- LoopNestPasses.push_back(std::unique_ptr<LoopNestPassConceptT>(
- new LoopNestPassModelT(std::forward<PassT>(Pass))));
+ template <typename PassT> LLVM_ATTRIBUTE_MINSIZE void addPass(PassT &&Pass) {
+ if constexpr (is_detected<HasRunOnLoopT, PassT>::value) {
+ using LoopPassModelT =
+ detail::PassModel<Loop, PassT, LoopAnalysisManager,
+ LoopStandardAnalysisResults &, LPMUpdater &>;
+ IsLoopNestPass.push_back(false);
+ // 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))));
+ } else {
+ using LoopNestPassModelT =
+ detail::PassModel<LoopNest, PassT, LoopAnalysisManager,
+ LoopStandardAnalysisResults &, LPMUpdater &>;
+ IsLoopNestPass.push_back(true);
+ // Do not use make_unique or emplace_back, they cause too many template
+ // instantiations, causing terrible compile times.
+ LoopNestPasses.push_back(std::unique_ptr<LoopNestPassConceptT>(
+ new LoopNestPassModelT(std::forward<PassT>(Pass))));
+ }
}
bool isEmpty() const { return LoopPasses.empty() && LoopNestPasses.empty(); }
@@ -442,42 +436,37 @@ class FunctionToLoopPassAdaptor
/// adaptor.
///
/// If \p Pass is a loop pass, the returned adaptor will be in loop mode.
-template <typename LoopPassT>
-inline std::enable_if_t<is_detected<HasRunOnLoopT, LoopPassT>::value,
- FunctionToLoopPassAdaptor>
-createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA = false,
- bool UseBlockFrequencyInfo = false,
- bool UseBranchProbabilityInfo = false) {
- using PassModelT =
- detail::PassModel<Loop, LoopPassT, LoopAnalysisManager,
- LoopStandardAnalysisResults &, LPMUpdater &>;
- // Do not use make_unique, it causes too many template instantiations,
- // causing terrible compile times.
- return FunctionToLoopPassAdaptor(
- std::unique_ptr<FunctionToLoopPassAdaptor::PassConceptT>(
- new PassModelT(std::forward<LoopPassT>(Pass))),
- UseMemorySSA, UseBlockFrequencyInfo, UseBranchProbabilityInfo, false);
-}
-
+///
/// If \p Pass is a loop-nest pass, \p Pass will first be wrapped into a
/// \c LoopPassManager and the returned adaptor will be in loop-nest mode.
-template <typename LoopNestPassT>
-inline std::enable_if_t<!is_detected<HasRunOnLoopT, LoopNestPassT>::value,
- FunctionToLoopPassAdaptor>
-createFunctionToLoopPassAdaptor(LoopNestPassT &&Pass, bool UseMemorySSA = false,
+template <typename LoopPassT>
+inline FunctionToLoopPassAdaptor
+createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA = false,
bool UseBlockFrequencyInfo = false,
bool UseBranchProbabilityInfo = false) {
- LoopPassManager LPM;
- LPM.addPass(std::forward<LoopNestPassT>(Pass));
- using PassModelT =
- detail::PassModel<Loop, LoopPassManager, LoopAnalysisManager,
- LoopStandardAnalysisResults &, LPMUpdater &>;
- // Do not use make_unique, it causes too many template instantiations,
- // causing terrible compile times.
- return FunctionToLoopPassAdaptor(
- std::unique_ptr<FunctionToLoopPassAdaptor::PassConceptT>(
- new PassModelT(std::move(LPM))),
- UseMemorySSA, UseBlockFrequencyInfo, UseBranchProbabilityInfo, true);
+ if constexpr (is_detected<HasRunOnLoopT, LoopPassT>::value) {
+ using PassModelT =
+ detail::PassModel<Loop, LoopPassT, LoopAnalysisManager,
+ LoopStandardAnalysisResults &, LPMUpdater &>;
+ // Do not use make_unique, it causes too many template instantiations,
+ // causing terrible compile times.
+ return FunctionToLoopPassAdaptor(
+ std::unique_ptr<FunctionToLoopPassAdaptor::PassConceptT>(
+ new PassModelT(std::forward<LoopPassT>(Pass))),
+ UseMemorySSA, UseBlockFrequencyInfo, UseBranchProbabilityInfo, false);
+ } else {
+ LoopPassManager LPM;
+ LPM.addPass(std::forward<LoopPassT>(Pass));
+ using PassModelT =
+ detail::PassModel<Loop, LoopPassManager, LoopAnalysisManager,
+ LoopStandardAnalysisResults &, LPMUpdater &>;
+ // Do not use make_unique, it causes too many template instantiations,
+ // causing terrible compile times.
+ return FunctionToLoopPassAdaptor(
+ std::unique_ptr<FunctionToLoopPassAdaptor::PassConceptT>(
+ new PassModelT(std::move(LPM))),
+ UseMemorySSA, UseBlockFrequencyInfo, UseBranchProbabilityInfo, true);
+ }
}
/// If \p Pass is an instance of \c LoopPassManager, the returned adaptor will
``````````
</details>
https://github.com/llvm/llvm-project/pull/137505
More information about the llvm-commits
mailing list