[llvm] [NewPM] Use perfect forwarding in `run`, `getResult` and `getResultImpl` (PR #124501)
via llvm-commits
llvm-commits at lists.llvm.org
Sun Jan 26 20:18:16 PST 2025
https://github.com/caozhanhao created https://github.com/llvm/llvm-project/pull/124501
Use perfect forwarding in `run`, `getResult` and `getResultImpl`.
>From b9f6a4e4da774774b5fbc9314f5ace5e85504bf9 Mon Sep 17 00:00:00 2001
From: caozhanhao <cao2013zh at 163.com>
Date: Mon, 27 Jan 2025 11:44:11 +0800
Subject: [PATCH] [NewPM] Use perfect forwarding in `run` and `getResult`
---
llvm/include/llvm/IR/PassManager.h | 10 +++++-----
llvm/include/llvm/IR/PassManagerImpl.h | 12 ++++++------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/llvm/include/llvm/IR/PassManager.h b/llvm/include/llvm/IR/PassManager.h
index b5230047b0e128..087cba381d13a6 100644
--- a/llvm/include/llvm/IR/PassManager.h
+++ b/llvm/include/llvm/IR/PassManager.h
@@ -188,7 +188,7 @@ class PassManager : public PassInfoMixin<
/// Run all of the passes in this manager over the given unit of IR.
/// ExtraArgs are passed to each pass.
PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM,
- ExtraArgTs... ExtraArgs);
+ ExtraArgTs &&... ExtraArgs);
template <typename PassT>
LLVM_ATTRIBUTE_MINSIZE std::enable_if_t<!std::is_same_v<PassT, PassManager>>
@@ -407,11 +407,11 @@ template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {
///
/// Runs the analysis if a cached result is not available.
template <typename PassT>
- typename PassT::Result &getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs) {
+ typename PassT::Result &getResult(IRUnitT &IR, ExtraArgTs &&... ExtraArgs) {
assert(AnalysisPasses.count(PassT::ID()) &&
"This analysis pass was not registered prior to being queried");
ResultConceptT &ResultConcept =
- getResultImpl(PassT::ID(), IR, ExtraArgs...);
+ getResultImpl(PassT::ID(), IR, std::forward<ExtraArgTs>(ExtraArgs)...);
using ResultModelT =
detail::AnalysisResultModel<IRUnitT, PassT, typename PassT::Result,
@@ -508,7 +508,7 @@ template <typename IRUnitT, typename... ExtraArgTs> class AnalysisManager {
/// Get an analysis result, running the pass if necessary.
ResultConceptT &getResultImpl(AnalysisKey *ID, IRUnitT &IR,
- ExtraArgTs... ExtraArgs);
+ ExtraArgTs &&... ExtraArgs);
/// Get a cached analysis result or return null.
ResultConceptT *getCachedResultImpl(AnalysisKey *ID, IRUnitT &IR) const {
@@ -778,7 +778,7 @@ class OuterAnalysisManagerProxy
/// Nothing to see here, it just forwards the \c OuterAM reference into the
/// result.
Result run(IRUnitT &, AnalysisManager<IRUnitT, ExtraArgTs...> &,
- ExtraArgTs...) {
+ ExtraArgTs &&...) {
return Result(*OuterAM);
}
diff --git a/llvm/include/llvm/IR/PassManagerImpl.h b/llvm/include/llvm/IR/PassManagerImpl.h
index 67e3fbe4f3068c..d6d643f11d0f93 100644
--- a/llvm/include/llvm/IR/PassManagerImpl.h
+++ b/llvm/include/llvm/IR/PassManagerImpl.h
@@ -27,7 +27,7 @@ namespace llvm {
template <typename IRUnitT, typename AnalysisManagerT, typename... ExtraArgTs>
PreservedAnalyses PassManager<IRUnitT, AnalysisManagerT, ExtraArgTs...>::run(
- IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs) {
+ IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs &&... ExtraArgs) {
class StackTraceEntry : public PrettyStackTraceEntry {
const PassInstrumentation &PI;
IRUnitT &IR;
@@ -62,7 +62,7 @@ PreservedAnalyses PassManager<IRUnitT, AnalysisManagerT, ExtraArgTs...>::run(
// AnalysisManager's arguments out of the whole ExtraArgs set.
PassInstrumentation PI =
detail::getAnalysisResult<PassInstrumentationAnalysis>(
- AM, IR, std::tuple<ExtraArgTs...>(ExtraArgs...));
+ AM, IR, std::forward_as_tuple(std::forward<ExtraArgTs>(ExtraArgs)...));
// RemoveDIs: if requested, convert debug-info to DbgRecord representation
// for duration of these passes.
@@ -78,7 +78,7 @@ PreservedAnalyses PassManager<IRUnitT, AnalysisManagerT, ExtraArgTs...>::run(
if (!PI.runBeforePass<IRUnitT>(*Pass, IR))
continue;
- PreservedAnalyses PassPA = Pass->run(IR, AM, ExtraArgs...);
+ PreservedAnalyses PassPA = Pass->run(IR, AM, std::forward<ExtraArgTs>(ExtraArgs)...);
// Update the analysis manager as each pass runs and potentially
// invalidates analyses.
@@ -135,7 +135,7 @@ AnalysisManager<IRUnitT, ExtraArgTs...>::clear(IRUnitT &IR,
template <typename IRUnitT, typename... ExtraArgTs>
inline typename AnalysisManager<IRUnitT, ExtraArgTs...>::ResultConceptT &
AnalysisManager<IRUnitT, ExtraArgTs...>::getResultImpl(
- AnalysisKey *ID, IRUnitT &IR, ExtraArgTs... ExtraArgs) {
+ AnalysisKey *ID, IRUnitT &IR, ExtraArgTs &&... ExtraArgs) {
typename AnalysisResultMapT::iterator RI;
bool Inserted;
std::tie(RI, Inserted) = AnalysisResults.insert(std::make_pair(
@@ -148,12 +148,12 @@ AnalysisManager<IRUnitT, ExtraArgTs...>::getResultImpl(
PassInstrumentation PI;
if (ID != PassInstrumentationAnalysis::ID()) {
- PI = getResult<PassInstrumentationAnalysis>(IR, ExtraArgs...);
+ PI = getResult<PassInstrumentationAnalysis>(IR, std::forward<ExtraArgTs>(ExtraArgs)...);
PI.runBeforeAnalysis(P, IR);
}
AnalysisResultListT &ResultList = AnalysisResultLists[&IR];
- ResultList.emplace_back(ID, P.run(IR, *this, ExtraArgs...));
+ ResultList.emplace_back(ID, P.run(IR, *this, std::forward<ExtraArgTs>(ExtraArgs)...));
PI.runAfterAnalysis(P, IR);
More information about the llvm-commits
mailing list