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:
parent
bcad7af28b
commit
33327c4fc5
@ -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.
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user