From: Victor Campos Date: Fri, 16 Jul 2021 13:16:36 +0000 (+0100) Subject: [NewPM] Fix wrong perfect forwardings X-Git-Tag: llvmorg-14-init~1035 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=59e4e53ead25c5ef0029dbc4df7af7c2fa8d070d;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/llvm/include/llvm/Analysis/CGSCCPassManager.h b/llvm/include/llvm/Analysis/CGSCCPassManager.h index 985424a..e361ccc 100644 --- a/llvm/include/llvm/Analysis/CGSCCPassManager.h +++ b/llvm/include/llvm/Analysis/CGSCCPassManager.h @@ -373,12 +373,12 @@ private: /// templated adaptor. template ModuleToPostOrderCGSCCPassAdaptor -createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT Pass) { +createModuleToPostOrderCGSCCPassAdaptor(CGSCCPassT &&Pass) { using PassModelT = detail::PassModel; return ModuleToPostOrderCGSCCPassAdaptor( - std::make_unique(std::move(Pass))); + std::make_unique(std::forward(Pass))); } /// A proxy from a \c FunctionAnalysisManager to an \c SCC. @@ -491,12 +491,12 @@ private: /// templated adaptor. template CGSCCToFunctionPassAdaptor -createCGSCCToFunctionPassAdaptor(FunctionPassT Pass) { +createCGSCCToFunctionPassAdaptor(FunctionPassT &&Pass) { using PassModelT = detail::PassModel; return CGSCCToFunctionPassAdaptor( - std::make_unique(std::move(Pass))); + std::make_unique(std::forward(Pass))); } /// A helper that repeats an SCC pass each time an indirect call is refined to @@ -536,13 +536,14 @@ private: /// A function to deduce a function pass type and wrap it in the /// templated adaptor. template -DevirtSCCRepeatedPass createDevirtSCCRepeatedPass(CGSCCPassT Pass, +DevirtSCCRepeatedPass createDevirtSCCRepeatedPass(CGSCCPassT &&Pass, int MaxIterations) { using PassModelT = detail::PassModel; - return DevirtSCCRepeatedPass(std::make_unique(std::move(Pass)), - MaxIterations); + return DevirtSCCRepeatedPass( + std::make_unique(std::forward(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 b9c844c..8e592bf 100644 --- a/llvm/include/llvm/IR/PassManager.h +++ b/llvm/include/llvm/IR/PassManager.h @@ -539,12 +539,12 @@ public: template std::enable_if_t::value> - addPass(PassT Pass) { + addPass(PassT &&Pass) { using PassModelT = detail::PassModel; - Passes.emplace_back(new PassModelT(std::move(Pass))); + Passes.emplace_back(new PassModelT(std::forward(Pass))); } /// When adding a pass manager pass that has the same type as this pass @@ -1206,13 +1206,13 @@ private: /// templated adaptor. template ModuleToFunctionPassAdaptor -createModuleToFunctionPassAdaptor(FunctionPassT Pass) { +createModuleToFunctionPassAdaptor(FunctionPassT &&Pass) { using PassModelT = detail::PassModel; return ModuleToFunctionPassAdaptor( - std::make_unique(std::move(Pass))); + std::make_unique(std::forward(Pass))); } /// A utility pass template to force an analysis result to be available. @@ -1284,7 +1284,8 @@ struct InvalidateAllAnalysesPass : PassInfoMixin { template class RepeatedPass : public PassInfoMixin> { public: - RepeatedPass(int Count, PassT P) : Count(Count), P(std::move(P)) {} + RepeatedPass(int Count, PassT &&P) + : Count(Count), P(std::forward(P)) {} template PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, Ts &&... Args) { @@ -1317,8 +1318,8 @@ private: }; template -RepeatedPass createRepeatedPass(int Count, PassT P) { - return RepeatedPass(Count, std::move(P)); +RepeatedPass createRepeatedPass(int Count, PassT &&P) { + return RepeatedPass(Count, std::forward(P)); } } // end namespace llvm diff --git a/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h b/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h index 69ee7c7..020cfb9 100644 --- a/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h +++ b/llvm/include/llvm/Transforms/Scalar/LoopPassManager.h @@ -102,23 +102,24 @@ public: /// passes in the pass manager later. template std::enable_if_t::value> - addPass(PassT Pass) { + addPass(PassT &&Pass) { using LoopPassModelT = detail::PassModel; IsLoopNestPass.push_back(false); - LoopPasses.emplace_back(new LoopPassModelT(std::move(Pass))); + LoopPasses.emplace_back(new LoopPassModelT(std::forward(Pass))); } template std::enable_if_t::value> - addPass(PassT Pass) { + addPass(PassT &&Pass) { using LoopNestPassModelT = detail::PassModel; IsLoopNestPass.push_back(true); - LoopNestPasses.emplace_back(new LoopNestPassModelT(std::move(Pass))); + LoopNestPasses.emplace_back( + new LoopNestPassModelT(std::forward(Pass))); } // Specializations of `addPass` for `RepeatedPass`. These are necessary since @@ -126,7 +127,7 @@ public: // detection of `HasRunOnLoopT`. template std::enable_if_t::value> - addPass(RepeatedPass Pass) { + addPass(RepeatedPass &&Pass) { using RepeatedLoopPassModelT = detail::PassModel, PreservedAnalyses, LoopAnalysisManager, LoopStandardAnalysisResults &, @@ -137,7 +138,7 @@ public: template std::enable_if_t::value> - addPass(RepeatedPass Pass) { + addPass(RepeatedPass &&Pass) { using RepeatedLoopNestPassModelT = detail::PassModel, PreservedAnalyses, LoopAnalysisManager, LoopStandardAnalysisResults &, @@ -445,13 +446,13 @@ private: template inline std::enable_if_t::value, FunctionToLoopPassAdaptor> -createFunctionToLoopPassAdaptor(LoopPassT Pass, bool UseMemorySSA = false, +createFunctionToLoopPassAdaptor(LoopPassT &&Pass, bool UseMemorySSA = false, bool UseBlockFrequencyInfo = false) { using PassModelT = detail::PassModel; return FunctionToLoopPassAdaptor( - std::make_unique(std::move(Pass)), UseMemorySSA, + std::make_unique(std::forward(Pass)), UseMemorySSA, UseBlockFrequencyInfo, false); } @@ -460,10 +461,10 @@ createFunctionToLoopPassAdaptor(LoopPassT Pass, bool UseMemorySSA = false, template inline std::enable_if_t::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(Pass)); using PassModelT = detail::PassModel inline FunctionToLoopPassAdaptor -createFunctionToLoopPassAdaptor(LoopPassManager LPM, +createFunctionToLoopPassAdaptor(LoopPassManager &&LPM, bool UseMemorySSA, bool UseBlockFrequencyInfo) { // Check if LPM contains any loop pass and if it does not, returns an adaptor