[llvm] [StandardInstrumentations] Add ExtendedIRContext and trait registration for custom IR types (PR #153171)

via llvm-commits llvm-commits at lists.llvm.org
Fri Oct 2 05:47:01 PDT 2026


https://github.com/ankurepa updated https://github.com/llvm/llvm-project/pull/153171

>From 99f7bc2bcc460b5488c0e346ab1a9f67e3a4c542 Mon Sep 17 00:00:00 2001
From: Anja Kurepa <ankurepa at amd.com>
Date: Tue, 12 Aug 2025 14:08:06 +0200
Subject: [PATCH 1/9] [StandardInsturmentations] Add helper class to
 StandardInstrumentations

---
 .../llvm/Passes/StandardInstrumentations.h      | 16 ++++++++++++++++
 llvm/lib/Passes/StandardInstrumentations.cpp    | 17 +++++++++++++++++
 2 files changed, 33 insertions(+)

diff --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index 4ee5ab25548682..3ee3ad3a2fc948 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -629,6 +629,22 @@ class StandardInstrumentations {
   TimePassesHandler &getTimePasses() { return TimePasses; }
 };
 
+class ExtendedIRType {
+public:
+  ExtendedIRType();
+
+  ExtendedIRType(const ExtendedIRType&) = delete;
+  ExtendedIRType& operator=(const ExtendedIRType&) = delete;
+
+  ExtendedIRType(ExtendedIRType&&) = delete;
+  ExtendedIRType& operator=(ExtendedIRType&&) = delete;
+
+  virtual ~ExtendedIRType();
+  virtual std::optional<std::string> getIRName(Any IR) = 0;
+
+  std::mutex ExtendedIRTypesAccess;
+};
+
 extern template class BlockDataT<EmptyData>;
 extern template class FuncDataT<EmptyData>;
 extern template class IRDataT<EmptyData>;
diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index f165e85baf611a..94cb574d7fd523 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -237,6 +237,8 @@ void printIR(raw_ostream &OS, const MachineFunction *MF) {
   MF->print(OS);
 }
 
+static std::vector<ExtendedIRType *> ExtendedIRTypes;
+
 std::string getIRName(Any IR) {
   if (unwrapIR<Module>(IR))
     return "[module]";
@@ -254,6 +256,11 @@ std::string getIRName(Any IR) {
   if (const auto *MF = unwrapIR<MachineFunction>(IR))
     return MF->getName().str();
 
+  for (auto *ExtendedIRType : ExtendedIRTypes) {
+    if (auto IRName = ExtendedIRType->getIRName(IR))
+      return *IRName;
+  }
+
   llvm_unreachable("Unknown wrapped IR type");
 }
 
@@ -407,6 +414,16 @@ void ChangeReporter<T>::saveIRBeforePass(Any IR, StringRef PassID,
   generateIRRepresentation(IR, PassID, Data);
 }
 
+ExtendedIRType::ExtendedIRType() {
+  std::lock_guard<std::mutex> Lock(ExtendedIRTypesAccess);
+  ExtendedIRTypes.push_back(this);
+}
+
+ExtendedIRType::~ExtendedIRType(){
+  std::lock_guard<std::mutex> Lock(ExtendedIRTypesAccess);
+  llvm::erase(ExtendedIRTypes, this);
+}
+
 template <typename T>
 void ChangeReporter<T>::handleIRAfterPass(Any IR, StringRef PassID,
                                           StringRef PassName) {

>From 536b849e4b1a5206c82f8c9855b4b34b02283805 Mon Sep 17 00:00:00 2001
From: Anja Kurepa <ankurepa at amd.com>
Date: Thu, 8 Jan 2026 14:16:17 +0100
Subject: [PATCH 2/9] [StandardInsturmentations] Add helper class to
 StandardInstrumentations - part 2

---
 .../llvm/Passes/StandardInstrumentations.h    | 42 ++++++++++-------
 llvm/lib/Passes/StandardInstrumentations.cpp  | 45 ++++++++++++-------
 2 files changed, 55 insertions(+), 32 deletions(-)

diff --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index 3ee3ad3a2fc948..3fa8112e6b59df 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -594,6 +594,31 @@ class PrintCrashIRInstrumentation {
   static void SignalHandler(void *);
 };
 
+
+class ExtendedIRType {
+public:
+  ExtendedIRType() = default;
+
+  ExtendedIRType(const ExtendedIRType&) = delete;
+  ExtendedIRType& operator=(const ExtendedIRType&) = delete;
+
+  ExtendedIRType(ExtendedIRType&&) = delete;
+  ExtendedIRType& operator=(ExtendedIRType&&) = delete;
+
+  virtual ~ExtendedIRType() = default;
+  virtual std::optional<std::string> getIRName(Any IR);
+  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC);
+
+  // Register an extended IR type handler.
+  static LLVM_ABI void registerExtendedIRTypeHandler(std::function<std::optional<std::string>(Any)> Handler);
+
+  // Get IR name using registered handlers.
+  static LLVM_ABI std::optional<std::string> getExtendedIRName(Any IR);
+
+private:
+  static llvm::SmallVector<std::function<std::optional<std::string>(Any)>> ExtendedIRTypeHandlers;
+};
+
 /// This class provides an interface to register all the standard pass
 /// instrumentations and manages their state (if any).
 class StandardInstrumentations {
@@ -612,6 +637,7 @@ class StandardInstrumentations {
   IRChangedTester ChangeTester;
   VerifyInstrumentation Verify;
   DroppedVariableStatsIR DroppedStatsIR;
+  ExtendedIRType ExtendedIR;
 
   bool VerifyEach;
 
@@ -629,22 +655,6 @@ class StandardInstrumentations {
   TimePassesHandler &getTimePasses() { return TimePasses; }
 };
 
-class ExtendedIRType {
-public:
-  ExtendedIRType();
-
-  ExtendedIRType(const ExtendedIRType&) = delete;
-  ExtendedIRType& operator=(const ExtendedIRType&) = delete;
-
-  ExtendedIRType(ExtendedIRType&&) = delete;
-  ExtendedIRType& operator=(ExtendedIRType&&) = delete;
-
-  virtual ~ExtendedIRType();
-  virtual std::optional<std::string> getIRName(Any IR) = 0;
-
-  std::mutex ExtendedIRTypesAccess;
-};
-
 extern template class BlockDataT<EmptyData>;
 extern template class FuncDataT<EmptyData>;
 extern template class IRDataT<EmptyData>;
diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index 94cb574d7fd523..a5fb7661f0dc67 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -237,8 +237,6 @@ void printIR(raw_ostream &OS, const MachineFunction *MF) {
   MF->print(OS);
 }
 
-static std::vector<ExtendedIRType *> ExtendedIRTypes;
-
 std::string getIRName(Any IR) {
   if (unwrapIR<Module>(IR))
     return "[module]";
@@ -256,10 +254,8 @@ std::string getIRName(Any IR) {
   if (const auto *MF = unwrapIR<MachineFunction>(IR))
     return MF->getName().str();
 
-  for (auto *ExtendedIRType : ExtendedIRTypes) {
-    if (auto IRName = ExtendedIRType->getIRName(IR))
-      return *IRName;
-  }
+  if (auto IRName = ExtendedIRType::getExtendedIRName(IR))
+    return *IRName;
 
   llvm_unreachable("Unknown wrapped IR type");
 }
@@ -414,16 +410,6 @@ void ChangeReporter<T>::saveIRBeforePass(Any IR, StringRef PassID,
   generateIRRepresentation(IR, PassID, Data);
 }
 
-ExtendedIRType::ExtendedIRType() {
-  std::lock_guard<std::mutex> Lock(ExtendedIRTypesAccess);
-  ExtendedIRTypes.push_back(this);
-}
-
-ExtendedIRType::~ExtendedIRType(){
-  std::lock_guard<std::mutex> Lock(ExtendedIRTypesAccess);
-  llvm::erase(ExtendedIRTypes, this);
-}
-
 template <typename T>
 void ChangeReporter<T>::handleIRAfterPass(Any IR, StringRef PassID,
                                           StringRef PassName) {
@@ -2543,6 +2529,7 @@ void StandardInstrumentations::registerCallbacks(
   ChangeTester.registerCallbacks(PIC);
   PrintCrashIR.registerCallbacks(PIC);
   DroppedStatsIR.registerCallbacks(PIC);
+  ExtendedIR.registerCallbacks(PIC);
   if (MAM)
     PreservedCFGChecker.registerCallbacks(PIC, *MAM);
 
@@ -2555,6 +2542,32 @@ void StandardInstrumentations::registerCallbacks(
   TimeProfilingPasses.registerCallbacks(PIC);
 }
 
+// ExtendedIRType implementation
+llvm::SmallVector<std::function<std::optional<std::string>(Any)>> ExtendedIRType::ExtendedIRTypeHandlers;
+
+std::optional<std::string> ExtendedIRType::getIRName(Any IR) {
+  // Default implementation returns nullopt.
+  return std::nullopt;
+}
+
+void ExtendedIRType::registerCallbacks(PassInstrumentationCallbacks &PIC) {
+  registerExtendedIRTypeHandler([this](Any IR) -> std::optional<std::string> {
+    return this->getIRName(IR);
+  });
+}
+
+void ExtendedIRType::registerExtendedIRTypeHandler(std::function<std::optional<std::string>(Any)> Handler) {
+  ExtendedIRTypeHandlers.push_back(std::move(Handler));
+}
+
+std::optional<std::string> ExtendedIRType::getExtendedIRName(Any IR) {
+  for (const auto &Handler : ExtendedIRTypeHandlers) {
+    if (auto IRName = Handler(IR))
+      return IRName;
+  }
+  return std::nullopt;
+}
+
 template class ChangeReporter<std::string>;
 template class TextChangeReporter<std::string>;
 

>From 0e42e4920583ececed1d5efa2477dce6a01f5539 Mon Sep 17 00:00:00 2001
From: Anja Kurepa <ankurepa at amd.com>
Date: Tue, 24 Feb 2026 12:52:47 +0100
Subject: [PATCH 3/9] [StandardInsturmentations] Add helper class to
 StandardInstrumentations - part 3

---
 .../llvm/Passes/StandardInstrumentations.h    | 58 ++++++++++---------
 llvm/lib/Passes/StandardInstrumentations.cpp  | 40 +++----------
 2 files changed, 39 insertions(+), 59 deletions(-)

diff --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index 3fa8112e6b59df..dd00bb69190b43 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -41,6 +41,34 @@ class Function;
 class MachineFunction;
 class PassInstrumentationCallbacks;
 
+class ExtendedIRTraits {
+  public:
+  ExtendedIRTraits() = default;
+  ExtendedIRTraits(const ExtendedIRTraits&) = delete;
+  ExtendedIRTraits& operator=(const ExtendedIRTraits&) = delete;
+
+  ExtendedIRTraits(ExtendedIRTraits&&) = delete;
+  ExtendedIRTraits& operator=(ExtendedIRTraits&&) = delete;
+
+  virtual ~ExtendedIRTraits() = default;
+  virtual std::optional<std::string> getIRName(Any IR) = 0;
+};
+
+struct ExtendedIRContext {
+  ExtendedIRContext() = default;
+  ExtendedIRContext(const ExtendedIRContext&) = delete;
+  ExtendedIRContext& operator=(const ExtendedIRContext&) = delete;
+
+  ExtendedIRContext(ExtendedIRContext&&) = delete;
+  ExtendedIRContext& operator=(ExtendedIRContext&&) = delete;
+
+  llvm::SmallVector<std::unique_ptr<ExtendedIRTraits>> traits;
+  // Add an ExtendedIRTraits to the traits vector
+  void addTrait(std::unique_ptr<ExtendedIRTraits> trait) {
+    traits.push_back(std::move(trait));
+  }
+};
+
 /// Instrumentation to print IR before/after passes.
 ///
 /// Needs state to be able to print module after pass that invalidates IR unit
@@ -209,9 +237,9 @@ class PreservedCFGCheckerInstrumentation {
 // 6.  When a pass is run on an IR that is not interesting (based on options).
 // 7.  When a pass is ignored (pass manager or adapter pass).
 // 8.  To compare two IR representations (of type \p T).
-template <typename IRUnitT> class LLVM_ABI ChangeReporter {
+template <typename IRUnitT> class LLVM_ABI ChangeReporter : public ExtendedIRContext {
 protected:
-  ChangeReporter(bool RunInVerboseMode) : VerboseMode(RunInVerboseMode) {}
+  ChangeReporter(bool RunInVerboseMode) : ExtendedIRContext(), VerboseMode(RunInVerboseMode) {}
 
 public:
   virtual ~ChangeReporter();
@@ -594,31 +622,6 @@ class PrintCrashIRInstrumentation {
   static void SignalHandler(void *);
 };
 
-
-class ExtendedIRType {
-public:
-  ExtendedIRType() = default;
-
-  ExtendedIRType(const ExtendedIRType&) = delete;
-  ExtendedIRType& operator=(const ExtendedIRType&) = delete;
-
-  ExtendedIRType(ExtendedIRType&&) = delete;
-  ExtendedIRType& operator=(ExtendedIRType&&) = delete;
-
-  virtual ~ExtendedIRType() = default;
-  virtual std::optional<std::string> getIRName(Any IR);
-  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC);
-
-  // Register an extended IR type handler.
-  static LLVM_ABI void registerExtendedIRTypeHandler(std::function<std::optional<std::string>(Any)> Handler);
-
-  // Get IR name using registered handlers.
-  static LLVM_ABI std::optional<std::string> getExtendedIRName(Any IR);
-
-private:
-  static llvm::SmallVector<std::function<std::optional<std::string>(Any)>> ExtendedIRTypeHandlers;
-};
-
 /// This class provides an interface to register all the standard pass
 /// instrumentations and manages their state (if any).
 class StandardInstrumentations {
@@ -637,7 +640,6 @@ class StandardInstrumentations {
   IRChangedTester ChangeTester;
   VerifyInstrumentation Verify;
   DroppedVariableStatsIR DroppedStatsIR;
-  ExtendedIRType ExtendedIR;
 
   bool VerifyEach;
 
diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index a5fb7661f0dc67..d4ea3ebfd7d656 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -237,7 +237,7 @@ void printIR(raw_ostream &OS, const MachineFunction *MF) {
   MF->print(OS);
 }
 
-std::string getIRName(Any IR) {
+std::string getIRName(Any IR, ExtendedIRContext *Ctx = nullptr) {
   if (unwrapIR<Module>(IR))
     return "[module]";
 
@@ -254,8 +254,13 @@ std::string getIRName(Any IR) {
   if (const auto *MF = unwrapIR<MachineFunction>(IR))
     return MF->getName().str();
 
-  if (auto IRName = ExtendedIRType::getExtendedIRName(IR))
-    return *IRName;
+  if (Ctx) {
+    // Go through the traits and check if any of them apply
+    for (const auto& extendedIRTraits : Ctx->traits) {
+      if (auto IRName = extendedIRTraits->getIRName(IR))
+        return *IRName;
+    }
+  }
 
   llvm_unreachable("Unknown wrapped IR type");
 }
@@ -415,7 +420,7 @@ void ChangeReporter<T>::handleIRAfterPass(Any IR, StringRef PassID,
                                           StringRef PassName) {
   assert(!BeforeStack.empty() && "Unexpected empty stack encountered.");
 
-  std::string Name = getIRName(IR);
+  std::string Name = getIRName(IR, this);
 
   if (isIgnored(PassID)) {
     if (VerboseMode)
@@ -2529,7 +2534,6 @@ void StandardInstrumentations::registerCallbacks(
   ChangeTester.registerCallbacks(PIC);
   PrintCrashIR.registerCallbacks(PIC);
   DroppedStatsIR.registerCallbacks(PIC);
-  ExtendedIR.registerCallbacks(PIC);
   if (MAM)
     PreservedCFGChecker.registerCallbacks(PIC, *MAM);
 
@@ -2542,32 +2546,6 @@ void StandardInstrumentations::registerCallbacks(
   TimeProfilingPasses.registerCallbacks(PIC);
 }
 
-// ExtendedIRType implementation
-llvm::SmallVector<std::function<std::optional<std::string>(Any)>> ExtendedIRType::ExtendedIRTypeHandlers;
-
-std::optional<std::string> ExtendedIRType::getIRName(Any IR) {
-  // Default implementation returns nullopt.
-  return std::nullopt;
-}
-
-void ExtendedIRType::registerCallbacks(PassInstrumentationCallbacks &PIC) {
-  registerExtendedIRTypeHandler([this](Any IR) -> std::optional<std::string> {
-    return this->getIRName(IR);
-  });
-}
-
-void ExtendedIRType::registerExtendedIRTypeHandler(std::function<std::optional<std::string>(Any)> Handler) {
-  ExtendedIRTypeHandlers.push_back(std::move(Handler));
-}
-
-std::optional<std::string> ExtendedIRType::getExtendedIRName(Any IR) {
-  for (const auto &Handler : ExtendedIRTypeHandlers) {
-    if (auto IRName = Handler(IR))
-      return IRName;
-  }
-  return std::nullopt;
-}
-
 template class ChangeReporter<std::string>;
 template class TextChangeReporter<std::string>;
 

>From 01b18c9f38e740fd848fed938ea5ce9c38f7dbbb Mon Sep 17 00:00:00 2001
From: Anja Kurepa <ankurepa at amd.com>
Date: Fri, 7 Aug 2026 15:52:35 +0200
Subject: [PATCH 4/9] [StandardInsturmentations] Add helper class to
 StandardInstrumentations - Add context to registerCallback

---
 .../llvm/Passes/StandardInstrumentations.h    | 86 +++++++++++--------
 llvm/lib/Passes/StandardInstrumentations.cpp  | 65 ++++++++------
 2 files changed, 89 insertions(+), 62 deletions(-)

diff --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index dd00bb69190b43..dd083f8c3e89bf 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -40,34 +40,7 @@ class Module;
 class Function;
 class MachineFunction;
 class PassInstrumentationCallbacks;
-
-class ExtendedIRTraits {
-  public:
-  ExtendedIRTraits() = default;
-  ExtendedIRTraits(const ExtendedIRTraits&) = delete;
-  ExtendedIRTraits& operator=(const ExtendedIRTraits&) = delete;
-
-  ExtendedIRTraits(ExtendedIRTraits&&) = delete;
-  ExtendedIRTraits& operator=(ExtendedIRTraits&&) = delete;
-
-  virtual ~ExtendedIRTraits() = default;
-  virtual std::optional<std::string> getIRName(Any IR) = 0;
-};
-
-struct ExtendedIRContext {
-  ExtendedIRContext() = default;
-  ExtendedIRContext(const ExtendedIRContext&) = delete;
-  ExtendedIRContext& operator=(const ExtendedIRContext&) = delete;
-
-  ExtendedIRContext(ExtendedIRContext&&) = delete;
-  ExtendedIRContext& operator=(ExtendedIRContext&&) = delete;
-
-  llvm::SmallVector<std::unique_ptr<ExtendedIRTraits>> traits;
-  // Add an ExtendedIRTraits to the traits vector
-  void addTrait(std::unique_ptr<ExtendedIRTraits> trait) {
-    traits.push_back(std::move(trait));
-  }
-};
+struct ExtendedIRContext;
 
 /// Instrumentation to print IR before/after passes.
 ///
@@ -77,7 +50,8 @@ class PrintIRInstrumentation {
 public:
   LLVM_ABI ~PrintIRInstrumentation();
 
-  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC);
+  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC,
+                                  ExtendedIRContext *IRContext = nullptr);
 
 private:
   struct PassRunDescriptor {
@@ -128,15 +102,18 @@ class PrintIRInstrumentation {
 
   /// Used for print-at-pass-number
   unsigned CurrentPassNumber = 0;
+  ExtendedIRContext *IRContext = nullptr;
 };
 
 class OptNoneInstrumentation {
 public:
   OptNoneInstrumentation(bool DebugLogging) : DebugLogging(DebugLogging) {}
-  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC);
+  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC,
+                                  ExtendedIRContext *IRContext = nullptr);
 
 private:
   bool DebugLogging;
+  ExtendedIRContext *IRContext = nullptr;
   bool shouldRun(StringRef PassID, Any IR);
 };
 
@@ -146,7 +123,11 @@ class OptPassGateInstrumentation {
 public:
   OptPassGateInstrumentation(LLVMContext &Context) : Context(Context) {}
   LLVM_ABI bool shouldRun(StringRef PassName, Any IR);
-  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC);
+  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC,
+                                  ExtendedIRContext *IRContext = nullptr);
+
+private:
+  ExtendedIRContext *IRContext = nullptr;
 };
 
 struct PrintPassOptions {
@@ -165,10 +146,12 @@ class PrintPassInstrumentation {
 public:
   PrintPassInstrumentation(bool Enabled, PrintPassOptions Opts)
       : Enabled(Enabled), Opts(Opts) {}
-  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC);
+  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC,
+                                  ExtendedIRContext *IRContext = nullptr);
 
 private:
   bool Enabled;
+  ExtendedIRContext *IRContext = nullptr;
   PrintPassOptions Opts;
   int Indent = 0;
 };
@@ -222,6 +205,35 @@ class PreservedCFGCheckerInstrumentation {
                                   ModuleAnalysisManager &MAM);
 };
 
+class ExtendedIRTraits {
+  public:
+  ExtendedIRTraits() = default;
+  ExtendedIRTraits(const ExtendedIRTraits&) = delete;
+  ExtendedIRTraits& operator=(const ExtendedIRTraits&) = delete;
+
+  ExtendedIRTraits(ExtendedIRTraits&&) = delete;
+  ExtendedIRTraits& operator=(ExtendedIRTraits&&) = delete;
+
+  virtual ~ExtendedIRTraits() = default;
+  virtual std::optional<std::string> getIRName(Any IR) = 0;
+};
+
+struct ExtendedIRContext {
+  ExtendedIRContext() = default;
+  ExtendedIRContext(const ExtendedIRContext&) = delete;
+  ExtendedIRContext& operator=(const ExtendedIRContext&) = delete;
+
+  ExtendedIRContext(ExtendedIRContext&&) = delete;
+  ExtendedIRContext& operator=(ExtendedIRContext&&) = delete;
+
+  ExtendedIRContext* context;
+  llvm::SmallVector<std::unique_ptr<ExtendedIRTraits>> traits;
+  // Add an ExtendedIRTraits to the traits vector
+  void addTrait(std::unique_ptr<ExtendedIRTraits> trait) {
+    traits.push_back(std::move(trait));
+  }
+};
+
 // Base class for classes that report changes to the IR.
 // It presents an interface for such classes and provides calls
 // on various events as the new pass manager transforms the IR.
@@ -239,7 +251,7 @@ class PreservedCFGCheckerInstrumentation {
 // 8.  To compare two IR representations (of type \p T).
 template <typename IRUnitT> class LLVM_ABI ChangeReporter : public ExtendedIRContext {
 protected:
-  ChangeReporter(bool RunInVerboseMode) : ExtendedIRContext(), VerboseMode(RunInVerboseMode) {}
+  ChangeReporter(bool RunInVerboseMode) : VerboseMode(RunInVerboseMode) {}
 
 public:
   virtual ~ChangeReporter();
@@ -519,12 +531,15 @@ class TimeProfilingPassesHandler {
   TimeProfilingPassesHandler(const TimeProfilingPassesHandler &) = delete;
   void operator=(const TimeProfilingPassesHandler &) = delete;
 
-  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC);
+  LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC,
+                                  ExtendedIRContext *IRContext = nullptr);
 
 private:
   // Implementation of pass instrumentation callbacks.
   void runBeforePass(StringRef PassID, Any IR);
   void runAfterPass();
+
+  ExtendedIRContext *IRContext = nullptr;
 };
 
 // Class that holds transitions between basic blocks.  The transitions
@@ -652,7 +667,8 @@ class StandardInstrumentations {
   // Register all the standard instrumentation callbacks. If \p FAM is nullptr
   // then PreservedCFGChecker is not enabled.
   LLVM_ABI void registerCallbacks(PassInstrumentationCallbacks &PIC,
-                                  ModuleAnalysisManager *MAM = nullptr);
+                                  ModuleAnalysisManager *MAM = nullptr,
+                                  ExtendedIRContext *IRContext = nullptr);
 
   TimePassesHandler &getTimePasses() { return TimePasses; }
 };
diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index d4ea3ebfd7d656..b5a62a6fd92677 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -237,7 +237,7 @@ void printIR(raw_ostream &OS, const MachineFunction *MF) {
   MF->print(OS);
 }
 
-std::string getIRName(Any IR, ExtendedIRContext *Ctx = nullptr) {
+std::string getIRName(Any IR, ExtendedIRContext *Context) {
   if (unwrapIR<Module>(IR))
     return "[module]";
 
@@ -254,9 +254,9 @@ std::string getIRName(Any IR, ExtendedIRContext *Ctx = nullptr) {
   if (const auto *MF = unwrapIR<MachineFunction>(IR))
     return MF->getName().str();
 
-  if (Ctx) {
+  if (Context) {
     // Go through the traits and check if any of them apply
-    for (const auto& extendedIRTraits : Ctx->traits) {
+    for (const auto& extendedIRTraits : Context->traits) {
       if (auto IRName = extendedIRTraits->getIRName(IR))
         return *IRName;
     }
@@ -420,7 +420,7 @@ void ChangeReporter<T>::handleIRAfterPass(Any IR, StringRef PassID,
                                           StringRef PassName) {
   assert(!BeforeStack.empty() && "Unexpected empty stack encountered.");
 
-  std::string Name = getIRName(IR, this);
+  std::string Name = getIRName(IR, this->context);
 
   if (isIgnored(PassID)) {
     if (VerboseMode)
@@ -824,7 +824,7 @@ void PrintIRInstrumentation::pushPassRunDescriptor(StringRef PassID, Any IR,
                                                    unsigned PassNumber) {
   const Module *M = unwrapModule(IR);
   PassRunDescriptorStack.emplace_back(M, PassNumber, getIRFileDisplayName(IR),
-                                      getIRName(IR), PassID);
+                                      getIRName(IR, this->IRContext), PassID);
 }
 
 PrintIRInstrumentation::PassRunDescriptor
@@ -872,7 +872,7 @@ void PrintIRInstrumentation::printBeforePass(StringRef PassID, Any IR) {
 
   if (shouldPrintPassNumbers())
     dbgs() << " Running pass " << CurrentPassNumber << " " << PassID
-           << " on " << getIRName(IR) << "\n";
+           << " on " << getIRName(IR, this->IRContext) << "\n";
 
   if (shouldPrintAfterCurrentPassNumber())
     pushPassRunDescriptor(PassID, IR, CurrentPassNumber);
@@ -884,7 +884,8 @@ void PrintIRInstrumentation::printBeforePass(StringRef PassID, Any IR) {
     Stream << "; *** IR Dump Before ";
     if (shouldPrintBeforeSomePassNumber())
       Stream << CurrentPassNumber << "-";
-    Stream << PassID << " on " << getIRName(IR) << " ***\n";
+    Stream << PassID << " on " << getIRName(IR, this->IRContext)
+           << " ***\n";
     unwrapAndPrint(Stream, IR);
   };
 
@@ -1013,7 +1014,8 @@ bool PrintIRInstrumentation::shouldPrintAfterSomePassNumber() {
 }
 
 void PrintIRInstrumentation::registerCallbacks(
-    PassInstrumentationCallbacks &PIC) {
+    PassInstrumentationCallbacks &PIC, ExtendedIRContext *IRContext) {
+  this->IRContext = IRContext;
   this->PIC = &PIC;
 
   // BeforePass callback is not just for printing, it also saves a Module
@@ -1038,7 +1040,8 @@ void PrintIRInstrumentation::registerCallbacks(
 }
 
 void OptNoneInstrumentation::registerCallbacks(
-    PassInstrumentationCallbacks &PIC) {
+    PassInstrumentationCallbacks &PIC, ExtendedIRContext *IRContext) {
+  this->IRContext = IRContext;
   PIC.registerShouldRunOptionalPassCallback(
       [this](StringRef P, Any IR) { return this->shouldRun(P, IR); });
 }
@@ -1053,7 +1056,8 @@ bool OptNoneInstrumentation::shouldRun(StringRef PassID, Any IR) {
     ShouldRun = !MF->getFunction().hasOptNone();
 
   if (!ShouldRun && DebugLogging) {
-    errs() << "Skipping pass " << PassID << " on " << getIRName(IR)
+    errs() << "Skipping pass " << PassID << " on "
+           << getIRName(IR, this->IRContext)
            << " due to optnone attribute\n";
   }
   return ShouldRun;
@@ -1064,7 +1068,8 @@ bool OptPassGateInstrumentation::shouldRun(StringRef PassName, Any IR) {
     return true;
 
   bool ShouldRun =
-      Context.getOptPassGate().shouldRunPass(PassName, getIRName(IR));
+      Context.getOptPassGate().shouldRunPass(PassName,
+                         getIRName(IR, this->IRContext));
   if (!ShouldRun && !this->HasWrittenIR && !OptBisectPrintIRPath.empty()) {
     // FIXME: print IR if limit is higher than number of opt-bisect
     // invocations
@@ -1081,7 +1086,8 @@ bool OptPassGateInstrumentation::shouldRun(StringRef PassName, Any IR) {
 }
 
 void OptPassGateInstrumentation::registerCallbacks(
-    PassInstrumentationCallbacks &PIC) {
+    PassInstrumentationCallbacks &PIC, ExtendedIRContext *IRContext) {
+  this->IRContext = IRContext;
   const OptPassGate &PassGate = Context.getOptPassGate();
   if (!PassGate.isEnabled())
     return;
@@ -1104,7 +1110,8 @@ raw_ostream &PrintPassInstrumentation::print() {
 }
 
 void PrintPassInstrumentation::registerCallbacks(
-    PassInstrumentationCallbacks &PIC) {
+    PassInstrumentationCallbacks &PIC, ExtendedIRContext *IRContext) {
+  this->IRContext = IRContext;
   if (!Enabled)
     return;
 
@@ -1119,7 +1126,8 @@ void PrintPassInstrumentation::registerCallbacks(
     assert(!isSpecialPass(PassID, SpecialPasses) &&
            "Unexpectedly skipping special pass");
 
-    print() << "Skipping pass: " << PassID << " on " << getIRName(IR) << "\n";
+        print() << "Skipping pass: " << PassID << " on "
+          << getIRName(IR, this->IRContext) << "\n";
   });
   PIC.registerBeforeNonSkippedPassCallback([this, SpecialPasses](
                                                StringRef PassID, Any IR) {
@@ -1127,7 +1135,8 @@ void PrintPassInstrumentation::registerCallbacks(
       return;
 
     auto &OS = print();
-    OS << "Running pass: " << PassID << " on " << getIRName(IR);
+     OS << "Running pass: " << PassID << " on "
+       << getIRName(IR, this->IRContext);
     if (const auto *F = unwrapIR<Function>(IR)) {
       unsigned Count = F->getInstructionCount();
       OS << " (" << Count << " instruction";
@@ -1162,15 +1171,15 @@ void PrintPassInstrumentation::registerCallbacks(
 
   if (!Opts.SkipAnalyses) {
     PIC.registerBeforeAnalysisCallback([this](StringRef PassID, Any IR) {
-      print() << "Running analysis: " << PassID << " on " << getIRName(IR)
-              << "\n";
+      print() << "Running analysis: " << PassID << " on "
+              << getIRName(IR, this->IRContext) << "\n";
       Indent += 2;
     });
     PIC.registerAfterAnalysisCallback(
         [this](StringRef PassID, Any IR) { Indent -= 2; });
     PIC.registerAnalysisInvalidatedCallback([this](StringRef PassID, Any IR) {
-      print() << "Invalidating analysis: " << PassID << " on " << getIRName(IR)
-              << "\n";
+      print() << "Invalidating analysis: " << PassID << " on "
+              << getIRName(IR, this->IRContext) << "\n";
     });
     PIC.registerAnalysesClearedCallback([this](StringRef IRName) {
       print() << "Clearing all analysis results for: " << IRName << "\n";
@@ -1577,7 +1586,8 @@ void InLineChangePrinter::registerCallbacks(PassInstrumentationCallbacks &PIC) {
 TimeProfilingPassesHandler::TimeProfilingPassesHandler() {}
 
 void TimeProfilingPassesHandler::registerCallbacks(
-    PassInstrumentationCallbacks &PIC) {
+    PassInstrumentationCallbacks &PIC, ExtendedIRContext *IRContext) {
+  this->IRContext = IRContext;
   if (!getTimeTraceProfilerInstance())
     return;
   PIC.registerBeforeNonSkippedPassCallback(
@@ -1597,7 +1607,7 @@ void TimeProfilingPassesHandler::registerCallbacks(
 }
 
 void TimeProfilingPassesHandler::runBeforePass(StringRef PassID, Any IR) {
-  timeTraceProfilerBegin(PassID, getIRName(IR));
+  timeTraceProfilerBegin(PassID, getIRName(IR, this->IRContext));
 }
 
 void TimeProfilingPassesHandler::runAfterPass() { timeTraceProfilerEnd(); }
@@ -2519,12 +2529,13 @@ void PrintCrashIRInstrumentation::registerCallbacks(
 }
 
 void StandardInstrumentations::registerCallbacks(
-    PassInstrumentationCallbacks &PIC, ModuleAnalysisManager *MAM) {
-  PrintIR.registerCallbacks(PIC);
-  PrintPass.registerCallbacks(PIC);
+    PassInstrumentationCallbacks &PIC, ModuleAnalysisManager *MAM,
+    ExtendedIRContext *IRContext) {
+  PrintIR.registerCallbacks(PIC, IRContext);
+  PrintPass.registerCallbacks(PIC, IRContext);
   TimePasses.registerCallbacks(PIC);
-  OptNone.registerCallbacks(PIC);
-  OptPassGate.registerCallbacks(PIC);
+  OptNone.registerCallbacks(PIC, IRContext);
+  OptPassGate.registerCallbacks(PIC, IRContext);
   PrintChangedIR.registerCallbacks(PIC);
   PseudoProbeVerification.registerCallbacks(PIC);
   if (VerifyEach)
@@ -2543,7 +2554,7 @@ void StandardInstrumentations::registerCallbacks(
   // Its 'AfterPassCallback' is put at the front of all the
   // AfterCallbacks by its `registerCallbacks`. This is necessary
   // to ensure that other callbacks are not included in the timings.
-  TimeProfilingPasses.registerCallbacks(PIC);
+  TimeProfilingPasses.registerCallbacks(PIC, IRContext);
 }
 
 template class ChangeReporter<std::string>;

>From 0b3b70e4b96fa675fb19d3eda3131f0cea61bfd4 Mon Sep 17 00:00:00 2001
From: Anja Kurepa <ankurepa at amd.com>
Date: Fri, 21 Aug 2026 17:44:58 +0200
Subject: [PATCH 5/9] [StandardInsturmentations] Add helper class to
 StandardInstrumentations - Add context as member field

---
 llvm/include/llvm/Passes/StandardInstrumentations.h | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index dd083f8c3e89bf..2a4f678a21ecc5 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -215,7 +215,7 @@ class ExtendedIRTraits {
   ExtendedIRTraits& operator=(ExtendedIRTraits&&) = delete;
 
   virtual ~ExtendedIRTraits() = default;
-  virtual std::optional<std::string> getIRName(Any IR) = 0;
+  virtual std::optional<std::string> getIRName(Any IR) const = 0;
 };
 
 struct ExtendedIRContext {
@@ -226,7 +226,6 @@ struct ExtendedIRContext {
   ExtendedIRContext(ExtendedIRContext&&) = delete;
   ExtendedIRContext& operator=(ExtendedIRContext&&) = delete;
 
-  ExtendedIRContext* context;
   llvm::SmallVector<std::unique_ptr<ExtendedIRTraits>> traits;
   // Add an ExtendedIRTraits to the traits vector
   void addTrait(std::unique_ptr<ExtendedIRTraits> trait) {
@@ -249,9 +248,10 @@ struct ExtendedIRContext {
 // 6.  When a pass is run on an IR that is not interesting (based on options).
 // 7.  When a pass is ignored (pass manager or adapter pass).
 // 8.  To compare two IR representations (of type \p T).
-template <typename IRUnitT> class LLVM_ABI ChangeReporter : public ExtendedIRContext {
+template <typename IRUnitT> class LLVM_ABI ChangeReporter {
 protected:
   ChangeReporter(bool RunInVerboseMode) : VerboseMode(RunInVerboseMode) {}
+  void setContext(ExtendedIRContext *Context) { context = Context; }
 
 public:
   virtual ~ChangeReporter();
@@ -293,6 +293,9 @@ template <typename IRUnitT> class LLVM_ABI ChangeReporter : public ExtendedIRCon
 
   // Run in verbose mode, printing everything?
   const bool VerboseMode;
+
+  // Optional extended context used to resolve custom IR names.
+  ExtendedIRContext *context = nullptr;
 };
 
 // An abstract template base class that handles printing banners and

>From 1920be607267577a770bdc584f42972e06b31c91 Mon Sep 17 00:00:00 2001
From: Anja Kurepa <ankurepa at amd.com>
Date: Fri, 28 Aug 2026 15:42:30 +0200
Subject: [PATCH 6/9] [StandardInsturmentations] Add helper class to
 StandardInstrumentations - remove 'this' pointer

---
 llvm/lib/Passes/StandardInstrumentations.cpp | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index e052869cdcb177..4a3d51857494d3 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -421,7 +421,7 @@ void ChangeReporter<T>::handleIRAfterPass(Any IR, StringRef PassID,
                                           StringRef PassName) {
   assert(!BeforeStack.empty() && "Unexpected empty stack encountered.");
 
-  std::string Name = getIRName(IR, this->context);
+  std::string Name = getIRName(IR, context);
 
   if (isIgnored(PassID)) {
     if (VerboseMode)
@@ -825,7 +825,7 @@ void PrintIRInstrumentation::pushPassRunDescriptor(StringRef PassID, Any IR,
                                                    unsigned PassNumber) {
   const Module *M = unwrapModule(IR);
   PassRunDescriptorStack.emplace_back(M, PassNumber, getIRFileDisplayName(IR),
-                                      getIRName(IR, this->IRContext), PassID);
+                                      getIRName(IR, IRContext), PassID);
 }
 
 PrintIRInstrumentation::PassRunDescriptor
@@ -873,7 +873,7 @@ void PrintIRInstrumentation::printBeforePass(StringRef PassID, Any IR) {
 
   if (shouldPrintPassNumbers())
     dbgs() << " Running pass " << CurrentPassNumber << " " << PassID
-           << " on " << getIRName(IR, this->IRContext) << "\n";
+           << " on " << getIRName(IR, IRContext) << "\n";
 
   if (shouldPrintAfterCurrentPassNumber())
     pushPassRunDescriptor(PassID, IR, CurrentPassNumber);
@@ -885,7 +885,7 @@ void PrintIRInstrumentation::printBeforePass(StringRef PassID, Any IR) {
     Stream << "; *** IR Dump Before ";
     if (shouldPrintBeforeSomePassNumber())
       Stream << CurrentPassNumber << "-";
-    Stream << PassID << " on " << getIRName(IR, this->IRContext)
+    Stream << PassID << " on " << getIRName(IR, IRContext)
            << " ***\n";
     unwrapAndPrint(Stream, IR);
   };
@@ -1058,7 +1058,7 @@ bool OptNoneInstrumentation::shouldRun(StringRef PassID, Any IR) {
 
   if (!ShouldRun && DebugLogging) {
     errs() << "Skipping pass " << PassID << " on "
-           << getIRName(IR, this->IRContext)
+           << getIRName(IR, IRContext)
            << " due to optnone attribute\n";
   }
   return ShouldRun;
@@ -1070,7 +1070,7 @@ bool OptPassGateInstrumentation::shouldRun(StringRef PassName, Any IR) {
 
   bool ShouldRun =
       Context.getOptPassGate().shouldRunPass(PassName,
-                         getIRName(IR, this->IRContext));
+                         getIRName(IR, IRContext));
   if (!ShouldRun && !this->HasWrittenIR && !OptBisectPrintIRPath.empty()) {
     // FIXME: print IR if limit is higher than number of opt-bisect
     // invocations
@@ -1137,7 +1137,7 @@ void PrintPassInstrumentation::registerCallbacks(
 
     auto &OS = print();
      OS << "Running pass: " << PassID << " on "
-       << getIRName(IR, this->IRContext);
+      << getIRName(IR, this->IRContext);
     if (const auto *F = unwrapIR<Function>(IR)) {
       unsigned Count = F->getInstructionCount();
       OS << " (" << Count << " instruction";
@@ -1608,7 +1608,7 @@ void TimeProfilingPassesHandler::registerCallbacks(
 }
 
 void TimeProfilingPassesHandler::runBeforePass(StringRef PassID, Any IR) {
-  timeTraceProfilerBegin(PassID, getIRName(IR, this->IRContext));
+  timeTraceProfilerBegin(PassID, getIRName(IR, IRContext));
 }
 
 void TimeProfilingPassesHandler::runAfterPass() { timeTraceProfilerEnd(); }

>From efabb81a87f2fc71df015acd8098ef995f174447 Mon Sep 17 00:00:00 2001
From: Anja Kurepa <ankurepa at amd.com>
Date: Thu, 17 Sep 2026 10:12:14 +0200
Subject: [PATCH 7/9] [StandardInsturmentations] Add helper class to
 StandardInstrumentations - formatting

---
 llvm/lib/Passes/StandardInstrumentations.cpp | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index 4a3d51857494d3..8f6d7e7cd9f504 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -1069,8 +1069,7 @@ bool OptPassGateInstrumentation::shouldRun(StringRef PassName, Any IR) {
     return true;
 
   bool ShouldRun =
-      Context.getOptPassGate().shouldRunPass(PassName,
-                         getIRName(IR, IRContext));
+      Context.getOptPassGate().shouldRunPass(PassName, getIRName(IR, IRContext));
   if (!ShouldRun && !this->HasWrittenIR && !OptBisectPrintIRPath.empty()) {
     // FIXME: print IR if limit is higher than number of opt-bisect
     // invocations
@@ -1136,8 +1135,8 @@ void PrintPassInstrumentation::registerCallbacks(
       return;
 
     auto &OS = print();
-     OS << "Running pass: " << PassID << " on "
-      << getIRName(IR, this->IRContext);
+    OS << "Running pass: " << PassID << " on "
+       << getIRName(IR, this->IRContext);
     if (const auto *F = unwrapIR<Function>(IR)) {
       unsigned Count = F->getInstructionCount();
       OS << " (" << Count << " instruction";

>From cd055eebdcffdbfc34c7205b034e206a7c77517b Mon Sep 17 00:00:00 2001
From: Anja Kurepa <ankurepa at amd.com>
Date: Mon, 28 Sep 2026 14:10:49 +0200
Subject: [PATCH 8/9] [StandardInsturmentations] Add helper class to
 StandardInstrumentations - Rework comments

---
 .../llvm/Passes/StandardInstrumentations.h    |  5 ++-
 llvm/lib/Passes/StandardInstrumentations.cpp  | 38 +++++++++----------
 2 files changed, 22 insertions(+), 21 deletions(-)

diff --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index d6960ef8b30d23..fb61a594a5f5b9 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -220,6 +220,8 @@ class ExtendedIRTraits {
   virtual std::optional<std::string> getIRName(IRUnitRef IR) const = 0;
 };
 
+// Stores custom IR-name traits used to specialize instrumentation output for
+// non-standard IR representations.
 struct ExtendedIRContext {
   ExtendedIRContext() = default;
   ExtendedIRContext(const ExtendedIRContext&) = delete;
@@ -229,7 +231,7 @@ struct ExtendedIRContext {
   ExtendedIRContext& operator=(ExtendedIRContext&&) = delete;
 
   llvm::SmallVector<std::unique_ptr<ExtendedIRTraits>> traits;
-  // Add an ExtendedIRTraits to the traits vector
+  // Register an ExtendedIRTraits implementation for this IR context.
   void addTrait(std::unique_ptr<ExtendedIRTraits> trait) {
     traits.push_back(std::move(trait));
   }
@@ -301,7 +303,6 @@ template <typename IRUnitT> class LLVM_ABI ChangeReporter {
   // Run in verbose mode, printing everything?
   const bool VerboseMode;
 
-  // Optional extended context used to resolve custom IR names.
   ExtendedIRContext *context = nullptr;
 };
 
diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index c91a9a568562cb..3e0da94c906f61 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -1168,25 +1168,25 @@ void PrintPassInstrumentation::registerCallbacks(
         if (isSpecialPass(PassID, SpecialPasses))
           return;
 
-    auto &OS = print();
-    OS << "Running pass: " << PassID << " on "
-       << getIRName(IR, this->IRContext);
-    if (const auto *F = unwrapIR<Function>(IR)) {
-      unsigned Count = F->getInstructionCount();
-      OS << " (" << Count << " instruction";
-      if (Count != 1)
-        OS << 's';
-      OS << ')';
-    } else if (const auto *C = unwrapIR<LazyCallGraph::SCC>(IR)) {
-      int Count = C->size();
-      OS << " (" << Count << " node";
-      if (Count != 1)
-        OS << 's';
-      OS << ')';
-    }
-    OS << "\n";
-    Indent += 2;
-  });
+        auto &OS = print();
+        OS << "Running pass: " << PassID << " on "
+           << getIRName(IR, this->IRContext);
+        if (const auto *F = dyn_cast<Function>(IR)) {
+          unsigned Count = F->getInstructionCount();
+          OS << " (" << Count << " instruction";
+          if (Count != 1)
+            OS << 's';
+          OS << ')';
+        } else if (const auto *C = dyn_cast<LazyCallGraph::SCC>(IR)) {
+          int Count = C->size();
+          OS << " (" << Count << " node";
+          if (Count != 1)
+            OS << 's';
+          OS << ')';
+        }
+        OS << "\n";
+        Indent += 2;
+      });
   PIC.registerAfterPassCallback(
       [this, SpecialPasses](StringRef PassID, IRUnitRef IR,
                             const PreservedAnalyses &) {

>From 48639cb2b7444e61e0c82a8e9f56daf159fffc01 Mon Sep 17 00:00:00 2001
From: Anja Kurepa <ankurepa at amd.com>
Date: Fri, 2 Oct 2026 14:49:51 +0200
Subject: [PATCH 9/9] [StandardInsturmentations] Add helper class to
 StandardInstrumentations - Formatting fix

---
 .../llvm/Passes/StandardInstrumentations.h    | 18 ++++++------
 llvm/lib/Passes/StandardInstrumentations.cpp  | 29 +++++++++----------
 2 files changed, 23 insertions(+), 24 deletions(-)

diff --git a/llvm/include/llvm/Passes/StandardInstrumentations.h b/llvm/include/llvm/Passes/StandardInstrumentations.h
index fb61a594a5f5b9..7c47a93f4e24d8 100644
--- a/llvm/include/llvm/Passes/StandardInstrumentations.h
+++ b/llvm/include/llvm/Passes/StandardInstrumentations.h
@@ -208,13 +208,13 @@ class PreservedCFGCheckerInstrumentation {
 };
 
 class ExtendedIRTraits {
-  public:
+public:
   ExtendedIRTraits() = default;
-  ExtendedIRTraits(const ExtendedIRTraits&) = delete;
-  ExtendedIRTraits& operator=(const ExtendedIRTraits&) = delete;
+  ExtendedIRTraits(const ExtendedIRTraits &) = delete;
+  ExtendedIRTraits &operator=(const ExtendedIRTraits &) = delete;
 
-  ExtendedIRTraits(ExtendedIRTraits&&) = delete;
-  ExtendedIRTraits& operator=(ExtendedIRTraits&&) = delete;
+  ExtendedIRTraits(ExtendedIRTraits &&) = delete;
+  ExtendedIRTraits &operator=(ExtendedIRTraits &&) = delete;
 
   virtual ~ExtendedIRTraits() = default;
   virtual std::optional<std::string> getIRName(IRUnitRef IR) const = 0;
@@ -224,11 +224,11 @@ class ExtendedIRTraits {
 // non-standard IR representations.
 struct ExtendedIRContext {
   ExtendedIRContext() = default;
-  ExtendedIRContext(const ExtendedIRContext&) = delete;
-  ExtendedIRContext& operator=(const ExtendedIRContext&) = delete;
+  ExtendedIRContext(const ExtendedIRContext &) = delete;
+  ExtendedIRContext &operator=(const ExtendedIRContext &) = delete;
 
-  ExtendedIRContext(ExtendedIRContext&&) = delete;
-  ExtendedIRContext& operator=(ExtendedIRContext&&) = delete;
+  ExtendedIRContext(ExtendedIRContext &&) = delete;
+  ExtendedIRContext &operator=(ExtendedIRContext &&) = delete;
 
   llvm::SmallVector<std::unique_ptr<ExtendedIRTraits>> traits;
   // Register an ExtendedIRTraits implementation for this IR context.
diff --git a/llvm/lib/Passes/StandardInstrumentations.cpp b/llvm/lib/Passes/StandardInstrumentations.cpp
index 3e0da94c906f61..2dbbf23c9eeab6 100644
--- a/llvm/lib/Passes/StandardInstrumentations.cpp
+++ b/llvm/lib/Passes/StandardInstrumentations.cpp
@@ -271,7 +271,7 @@ std::string getIRName(IRUnitRef IR, ExtendedIRContext *Context) {
 
   if (Context) {
     // Go through the traits and check if any of them apply
-    for (const auto& extendedIRTraits : Context->traits) {
+    for (const auto &extendedIRTraits : Context->traits) {
       if (auto IRName = extendedIRTraits->getIRName(IR))
         return *IRName;
     }
@@ -906,8 +906,8 @@ void PrintIRInstrumentation::printBeforePass(StringRef PassID, IRUnitRef IR) {
   ++CurrentPassNumber;
 
   if (shouldPrintPassNumbers())
-    dbgs() << " Running pass " << CurrentPassNumber << " " << PassID
-           << " on " << getIRName(IR, IRContext) << "\n";
+    dbgs() << " Running pass " << CurrentPassNumber << " " << PassID << " on "
+           << getIRName(IR, IRContext) << "\n";
 
   if (shouldPrintAfterCurrentPassNumber())
     pushPassRunDescriptor(PassID, IR, CurrentPassNumber);
@@ -919,8 +919,7 @@ void PrintIRInstrumentation::printBeforePass(StringRef PassID, IRUnitRef IR) {
     Stream << "; *** IR Dump Before ";
     if (shouldPrintBeforeSomePassNumber())
       Stream << CurrentPassNumber << "-";
-    Stream << PassID << " on " << getIRName(IR, IRContext)
-           << " ***\n";
+    Stream << PassID << " on " << getIRName(IR, IRContext) << " ***\n";
     unwrapAndPrint(Stream, IR);
   };
 
@@ -1091,8 +1090,7 @@ bool OptNoneInstrumentation::shouldRun(StringRef PassID, IRUnitRef IR) {
     ShouldRun = !MF->getFunction().hasOptNone();
 
   if (!ShouldRun && DebugLogging) {
-    errs() << "Skipping pass " << PassID << " on "
-           << getIRName(IR, IRContext)
+    errs() << "Skipping pass " << PassID << " on " << getIRName(IR, IRContext)
            << " due to optnone attribute\n";
   }
   return ShouldRun;
@@ -1102,8 +1100,8 @@ bool OptPassGateInstrumentation::shouldRun(StringRef PassName, IRUnitRef IR) {
   if (isIgnored(PassName))
     return true;
 
-  bool ShouldRun =
-      Context.getOptPassGate().shouldRunPass(PassName, getIRName(IR, IRContext));
+  bool ShouldRun = Context.getOptPassGate().shouldRunPass(
+      PassName, getIRName(IR, IRContext));
   if (!ShouldRun && !this->HasWrittenIR && !OptBisectPrintIRPath.empty()) {
     // FIXME: print IR if limit is higher than number of opt-bisect
     // invocations
@@ -1160,8 +1158,8 @@ void PrintPassInstrumentation::registerCallbacks(
     assert(!isSpecialPass(PassID, SpecialPasses) &&
            "Unexpectedly skipping special pass");
 
-        print() << "Skipping pass: " << PassID << " on "
-          << getIRName(IR, this->IRContext) << "\n";
+    print() << "Skipping pass: " << PassID << " on "
+            << getIRName(IR, this->IRContext) << "\n";
   });
   PIC.registerBeforeNonSkippedPassCallback(
       [this, SpecialPasses](StringRef PassID, IRUnitRef IR) {
@@ -1211,10 +1209,11 @@ void PrintPassInstrumentation::registerCallbacks(
     });
     PIC.registerAfterAnalysisCallback(
         [this](StringRef PassID, IRUnitRef IR) { Indent -= 2; });
-    PIC.registerAnalysisInvalidatedCallback([this](StringRef PassID, IRUnitRef IR) {
-      print() << "Invalidating analysis: " << PassID << " on "
-              << getIRName(IR, this->IRContext) << "\n";
-    });
+    PIC.registerAnalysisInvalidatedCallback(
+        [this](StringRef PassID, IRUnitRef IR) {
+          print() << "Invalidating analysis: " << PassID << " on "
+                  << getIRName(IR, this->IRContext) << "\n";
+        });
     PIC.registerAnalysesClearedCallback([this](StringRef IRName) {
       print() << "Clearing all analysis results for: " << IRName << "\n";
     });



More information about the llvm-commits mailing list