[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