1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-18 18:42:46 +02:00

[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
This commit is contained in:
Victor Campos 2021-07-16 14:16:36 +01:00
parent bcad7af28b
commit 33327c4fc5
3 changed files with 28 additions and 25 deletions

View File

@ -373,12 +373,12 @@ private:
/// 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 @@ private:
/// 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 @@ private:
/// 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.

View File

@ -539,12 +539,12 @@ public:
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 @@ private:
/// 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 @@ private:
};
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

View File

@ -102,23 +102,24 @@ public:
/// 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 @@ public:
// 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 @@ public:
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 @@ private:
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