[llvm] 59e4e53 - [NewPM] Fix wrong perfect forwardings
Victor Campos via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 19 09:21:38 PDT 2021
Author: Victor Campos
Date: 2021-07-19T17:21:32+01:00
New Revision: 59e4e53ead25c5ef0029dbc4df7af7c2fa8d070d
URL: https://github.com/llvm/llvm-project/commit/59e4e53ead25c5ef0029dbc4df7af7c2fa8d070d
DIFF: https://github.com/llvm/llvm-project/commit/59e4e53ead25c5ef0029dbc4df7af7c2fa8d070d.diff
LOG: [NewPM] Fix wrong perfect forwardings
Some template functions were missing '&&' in function arguments,
therefore these were always taken by value after template instantiation.
This patch adds the double ampersand to introduce proper perfect
forwarding.
Reviewed By: aeubanks
Differential Revision: https://reviews.llvm.org/D106148
Added:
Modified:
llvm/include/llvm/Analysis/CGSCCPassManager.h
llvm/include/llvm/IR/PassManager.h
llvm/include/llvm/Transforms/Scalar/LoopPassManager.h
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/CGSCCPassManager.h b/llvm/include/llvm/Analysis/CGSCCPassManager.h
index 985424a74054a..e361cccef9604 100644
--- a/llvm/include/llvm/Analysis/CGSCCPassManager.h
+++ b/llvm/include/llvm/Analysis/CGSCCPassManager.h
@@ -373,12 +373,12 @@ class ModuleToPostOrderCGSCCPassAdaptor
/// templated adaptor.
template <typename CGSCCPassT>
ModuleToPostOrderCGSCCPassAdaptor
-createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT Pass) {
+createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass) {
using PassModelT = detail::PassModel<LazyCallGraph::SCC, CGSCCPassT,
PreservedAnalyses, CGSCCAnalysisManager,
LazyCallGraph &, CGSCCUpdateResult &>;
return ModuleToPostOrderCGSCCPassAdaptor(
- std::make_unique<PassModelT>(std::move(Pass)));
+ std::make_unique<PassModelT>(std::forward<CGSCCPassT>(Pass)));
}
/// A proxy from a \c FunctionAnalysisManager to an \c SCC.
@@ -491,12 +491,12 @@ class CGSCCToFunctionPassAdaptor
/// templated adaptor.
template <typename FunctionPassT>
CGSCCToFunctionPassAdaptor
-createCGSCCToFunctionPassAdaptor(FunctionPassT Pass) {
+createCGSCCToFunctionPassAdaptor(FunctionPassT &&Pass) {
using PassModelT =
detail::PassModel<Function, FunctionPassT, PreservedAnalyses,
FunctionAnalysisManager>;
return CGSCCToFunctionPassAdaptor(
- std::make_unique<PassModelT>(std::move(Pass)));
+ std::make_unique<PassModelT>(std::forward<FunctionPassT>(Pass)));
}
/// A helper that repeats an SCC pass each time an indirect call is refined to
@@ -536,13 +536,14 @@ class DevirtSCCRepeatedPass : public PassInfoMixin<DevirtSCCRepeatedPass> {
/// A function to deduce a function pass type and wrap it in the
/// templated adaptor.
template <typename CGSCCPassT>
-DevirtSCCRepeatedPass createDevirtSCCRepeatedPass(CGSCCPassT Pass,
+DevirtSCCRepeatedPass createDevirtSCCRepeatedPass(CGSCCPassT &&Pass,
int MaxIterations) {
using PassModelT = detail::PassModel<LazyCallGraph::SCC, CGSCCPassT,
PreservedAnalyses, CGSCCAnalysisManager,
LazyCallGraph &, CGSCCUpdateResult &>;
- return DevirtSCCRepeatedPass(std::make_unique<PassModelT>(std::move(Pass)),
- MaxIterations);
+ return DevirtSCCRepeatedPass(
+ std::make_unique<PassModelT>(std::forward<CGSCCPassT>(Pass)),
+ MaxIterations);
}
// Clear out the debug logging macro.
diff --git a/llvm/include/llvm/IR/PassManager.h b/llvm/include/llvm/IR/PassManager.h
index b9c844c6b1c25..8e592bfb0c785 100644
--- a/llvm/include/llvm/IR/PassManager.h
+++ b/llvm/include/llvm/IR/PassManager.h
@@ -539,12 +539,12 @@ class PassManager : public PassInfoMixin<
template <typename PassT>
std::enable_if_t<!std::is_same<PassT, PassManager>::value>
- addPass(PassT Pass) {
+ addPass(PassT &&Pass) {
using PassModelT =
detail::PassModel<IRUnitT, PassT, PreservedAnalyses, AnalysisManagerT,
ExtraArgTs...>;
- Passes.emplace_back(new PassModelT(std::move(Pass)));
+ Passes.emplace_back(new PassModelT(std::forward<PassT>(Pass)));
}
/// When adding a pass manager pass that has the same type as this pass
@@ -1206,13 +1206,13 @@ class ModuleToFunctionPassAdaptor
/// templated adaptor.
template <typename FunctionPassT>
ModuleToFunctionPassAdaptor
-createModuleToFunctionPassAdaptor(FunctionPassT Pass) {
+createModuleToFunctionPassAdaptor(FunctionPassT &&Pass) {
using PassModelT =
detail::PassModel<Function, FunctionPassT, PreservedAnalyses,
FunctionAnalysisManager>;
return ModuleToFunctionPassAdaptor(
- std::make_unique<PassModelT>(std::move(Pass)));
+ std::make_unique<PassModelT>(std::forward<FunctionPassT>(Pass)));
}
/// A utility pass template to force an analysis result to be available.
@@ -1284,7 +1284,8 @@ struct InvalidateAllAnalysesPass : PassInfoMixin<InvalidateAllAnalysesPass> {
template <typename PassT>
class RepeatedPass : public PassInfoMixin<RepeatedPass<PassT>> {
public:
- RepeatedPass(int Count, PassT P) : Count(Count), P(std::move(P)) {}
+ RepeatedPass(int Count, PassT &&P)
+ : Count(Count), P(std::forward<PassT>(P)) {}
template <typename IRUnitT, typename AnalysisManagerT, typename... Ts>
PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, Ts &&... Args) {
@@ -1317,8 +1318,8 @@ class RepeatedPass : public PassInfoMixin<RepeatedPass<PassT>> {
};
template <typename PassT>
-RepeatedPass<PassT> createRepeatedPass(int Count, PassT P) {
- return RepeatedPass<PassT>(Count, std::move(P));
+RepeatedPass<PassT> createRepeatedPass(int Count, PassT &&P) {
+ return RepeatedPass<PassT>(Count, std::forward<PassT>(P));
}
} // end namespace llvm
diff --git a/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h b/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h
index 69ee7c78f1893..020cfb9a6c851 100644
--- a/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h
+++ b/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h
@@ -102,23 +102,24 @@ class PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
/// passes in the pass manager later.
template <typename PassT>
std::enable_if_t<is_detected<HasRunOnLoopT, PassT>::value>
- addPass(PassT Pass) {
+ addPass(PassT &&Pass) {
using LoopPassModelT =
detail::PassModel<Loop, PassT, PreservedAnalyses, LoopAnalysisManager,
LoopStandardAnalysisResults &, LPMUpdater &>;
IsLoopNestPass.push_back(false);
- LoopPasses.emplace_back(new LoopPassModelT(std::move(Pass)));
+ LoopPasses.emplace_back(new LoopPassModelT(std::forward<PassT>(Pass)));
}
template <typename PassT>
std::enable_if_t<!is_detected<HasRunOnLoopT, PassT>::value>
- addPass(PassT Pass) {
+ addPass(PassT &&Pass) {
using LoopNestPassModelT =
detail::PassModel<LoopNest, PassT, PreservedAnalyses,
LoopAnalysisManager, LoopStandardAnalysisResults &,
LPMUpdater &>;
IsLoopNestPass.push_back(true);
- LoopNestPasses.emplace_back(new LoopNestPassModelT(std::move(Pass)));
+ LoopNestPasses.emplace_back(
+ new LoopNestPassModelT(std::forward<PassT>(Pass)));
}
// Specializations of `addPass` for `RepeatedPass`. These are necessary since
@@ -126,7 +127,7 @@ class PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
// detection of `HasRunOnLoopT`.
template <typename PassT>
std::enable_if_t<is_detected<HasRunOnLoopT, PassT>::value>
- addPass(RepeatedPass<PassT> Pass) {
+ addPass(RepeatedPass<PassT> &&Pass) {
using RepeatedLoopPassModelT =
detail::PassModel<Loop, RepeatedPass<PassT>, PreservedAnalyses,
LoopAnalysisManager, LoopStandardAnalysisResults &,
@@ -137,7 +138,7 @@ class PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,
template <typename PassT>
std::enable_if_t<!is_detected<HasRunOnLoopT, PassT>::value>
- addPass(RepeatedPass<PassT> Pass) {
+ addPass(RepeatedPass<PassT> &&Pass) {
using RepeatedLoopNestPassModelT =
detail::PassModel<LoopNest, RepeatedPass<PassT>, PreservedAnalyses,
LoopAnalysisManager, LoopStandardAnalysisResults &,
@@ -445,13 +446,13 @@ class FunctionToLoopPassAdaptor
template <typename LoopPassT>
inline std::enable_if_t<is_detected<HasRunOnLoopT, LoopPassT>::value,
FunctionToLoopPassAdaptor>
-createFunctionToLoopPassAdaptor(LoopPassT Pass, bool UseMemorySSA = false,
+createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA = false,
bool UseBlockFrequencyInfo = false) {
using PassModelT =
detail::PassModel<Loop, LoopPassT, PreservedAnalyses, LoopAnalysisManager,
LoopStandardAnalysisResults &, LPMUpdater &>;
return FunctionToLoopPassAdaptor(
- std::make_unique<PassModelT>(std::move(Pass)), UseMemorySSA,
+ std::make_unique<PassModelT>(std::forward<LoopPassT>(Pass)), UseMemorySSA,
UseBlockFrequencyInfo, false);
}
@@ -460,10 +461,10 @@ createFunctionToLoopPassAdaptor(LoopPassT Pass, bool UseMemorySSA = false,
template <typename LoopNestPassT>
inline std::enable_if_t<!is_detected<HasRunOnLoopT, LoopNestPassT>::value,
FunctionToLoopPassAdaptor>
-createFunctionToLoopPassAdaptor(LoopNestPassT Pass, bool UseMemorySSA = false,
+createFunctionToLoopPassAdaptor(LoopNestPassT &&Pass, bool UseMemorySSA = false,
bool UseBlockFrequencyInfo = false) {
LoopPassManager LPM;
- LPM.addPass(std::move(Pass));
+ LPM.addPass(std::forward<LoopNestPassT>(Pass));
using PassModelT =
detail::PassModel<Loop, LoopPassManager, PreservedAnalyses,
LoopAnalysisManager, LoopStandardAnalysisResults &,
@@ -476,7 +477,7 @@ createFunctionToLoopPassAdaptor(LoopNestPassT Pass, bool UseMemorySSA = false,
/// be in loop-nest mode if the pass manager contains only loop-nest passes.
template <>
inline FunctionToLoopPassAdaptor
-createFunctionToLoopPassAdaptor<LoopPassManager>(LoopPassManager LPM,
+createFunctionToLoopPassAdaptor<LoopPassManager>(LoopPassManager &&LPM,
bool UseMemorySSA,
bool UseBlockFrequencyInfo) {
// Check if LPM contains any loop pass and if it does not, returns an adaptor
More information about the llvm-commits
mailing list