[flang-commits] [clang] [flang] [llvm] [polly] [Plugins] Pass options to a pass plugin in -load-pass-plugin (PR #226773)

via flang-commits flang-commits at lists.llvm.org
Sun Sep 27 01:44:01 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-flang-driver

Author: Fangrui Song (MaskRay)

<details>
<summary>Changes</summary>

A pass plugin's cl::opt is global, so opt, llc, and clang-linker-wrapper
load plugins from a cl::opt callback while parsing argv, so that the
plugin's options later on the command line are recognized.

Accept `-load-pass-plugin=plugin.so,-opt1,-opt2`: the plugin loads after
cl::ParseCommandLineOptions and its options are parsed after it loads.
A plugin's options elsewhere on the command line are rejected.

Rename PassPlugin::Load to PassPlugin::load, which accepts
"<file>[,<option>...]".

Polly's tests pass `-polly-*` options after `%loadNPMPolly`. When Polly
is not linked into tools, also load LLVMPolly with -load, which
registers its options while parsing.

cl::callback will be removed to enable migration to TableGen based
representation
https://discourse.llvm.org/t/rfc-declare-library-command-line-options-in-tablegen-one-struct-per-library/91877/5

LLM-aided

---

Patch is 30.48 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/226773.diff


28 Files Affected:

- (modified) clang/docs/InternalsManual.md (+1-1) 
- (modified) clang/lib/Frontend/CompilerInstance.cpp (+1-1) 
- (modified) clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-llvm-help.c (+1-1) 
- (modified) clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp (+8-10) 
- (modified) flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp (+1-1) 
- (modified) llvm/docs/NewPassManager.md (+3-2) 
- (modified) llvm/docs/ReleaseNotes.md (+6) 
- (modified) llvm/docs/WritingAnLLVMNewPMPass.md (+1-1) 
- (modified) llvm/include/llvm/Plugins/PassPlugin.h (+5-4) 
- (modified) llvm/lib/LTO/LTOBackend.cpp (+1-1) 
- (modified) llvm/lib/Plugins/PassPlugin.cpp (+18-1) 
- (modified) llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg-blockaddress.ll (+3-3) 
- (modified) llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg1.ll (+3-3) 
- (modified) llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg2-dead-block-order.ll (+3-3) 
- (modified) llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg3-phis.ll (+3-3) 
- (modified) llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg4-multiple-duplicate-cfg-updates.ll (+3-3) 
- (modified) llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg5-del-phis-for-dead-block.ll (+3-3) 
- (modified) llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg6-dead-self-loop.ll (+3-3) 
- (modified) llvm/test/Feature/codegen-plugin-passes.mir (+1-1) 
- (modified) llvm/test/Feature/codegen-plugin.ll (+2-2) 
- (modified) llvm/test/Feature/load_extension.ll (+1-1) 
- (modified) llvm/test/lit.cfg.py (+16-19) 
- (modified) llvm/tools/llc/lib/llcdriver.cpp (+13-10) 
- (modified) llvm/tools/opt/optdriver.cpp (+13-11) 
- (modified) llvm/unittests/Analysis/PluginInlineAdvisorAnalysisTest.cpp (+1-1) 
- (modified) llvm/unittests/Analysis/PluginInlineOrderAnalysisTest.cpp (+1-1) 
- (modified) llvm/unittests/Passes/Plugins/PluginsTest.cpp (+5-5) 
- (modified) polly/test/lit.site.cfg.in (+5-2) 


``````````diff
diff --git a/clang/docs/InternalsManual.md b/clang/docs/InternalsManual.md
index 8d5549cb168bed..53144018be55e7 100644
--- a/clang/docs/InternalsManual.md
+++ b/clang/docs/InternalsManual.md
@@ -883,7 +883,7 @@ desired.
   void EmitAssemblyHelper::EmitAssemblyWithNewPassManager(/*...*/) {
     // ...
 +   for (auto &PluginFN : CodeGenOpts.PassPlugins)
-+     if (auto PassPlugin = PassPlugin::Load(PluginFN))
++     if (auto PassPlugin = PassPlugin::load(PluginFN))
 +        PassPlugin->registerPassBuilderCallbacks(PB);
   }
 ```
diff --git a/clang/lib/Frontend/CompilerInstance.cpp b/clang/lib/Frontend/CompilerInstance.cpp
index 87abcd38c1a927..28f61b7cff9f65 100644
--- a/clang/lib/Frontend/CompilerInstance.cpp
+++ b/clang/lib/Frontend/CompilerInstance.cpp
@@ -1115,7 +1115,7 @@ void CompilerInstance::LoadRequestedPlugins() {
 
   // Load and store pass plugins for the back-end.
   for (const std::string &Path : getCodeGenOpts().PassPlugins) {
-    if (auto PassPlugin = llvm::PassPlugin::Load(Path)) {
+    if (auto PassPlugin = llvm::PassPlugin::load(Path)) {
       PassPlugins.emplace_back(std::make_unique<llvm::PassPlugin>(*PassPlugin));
     } else {
       getDiagnostics().Report(diag::err_fe_unable_to_load_plugin)
diff --git a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-llvm-help.c b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-llvm-help.c
index ffd1cf78bcd9ad..a4a65a81bb8926 100644
--- a/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-llvm-help.c
+++ b/clang/test/OffloadTools/clang-linker-wrapper/linker-wrapper-llvm-help.c
@@ -7,4 +7,4 @@
 // Look for a few options supported only after -mllvm and --offload-opt.
 //     CHECK: OPTIONS:
 // CHECK-DAG: --passes=<string>
-// CHECK-DAG: --load-pass-plugin=<string>
+// CHECK-DAG: --load-pass-plugin=<file[,option...]>
diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
index a5ebd7d2ad06ba..33e10ba797691c 100644
--- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
+++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp
@@ -91,9 +91,11 @@ static cl::opt<std::string> RemarksFormat(
     cl::desc("The format used for serializing remarks (default: YAML)"),
     cl::value_desc("format"), cl::init("yaml"));
 
-static cl::list<std::string>
-    PassPlugins("load-pass-plugin",
-                cl::desc("Load passes from plugin library"));
+static cl::list<std::string> PassPlugins(
+    "load-pass-plugin",
+    cl::desc("Load passes from plugin library. The plugin's options follow "
+             "its file name, separated by commas"),
+    cl::value_desc("file[,option...]"));
 
 static cl::opt<std::string> PassPipeline(
     "passes",
@@ -1532,14 +1534,10 @@ int main(int Argc, char **Argv) {
     NewArgv.push_back(Arg->getValue());
   for (const opt::Arg *Arg : Args.filtered(OPT_offload_opt_eq_minus))
     NewArgv.push_back(Arg->getValue());
-  SmallVector<PassPlugin, 1> PluginList;
-  PassPlugins.setCallback([&](const std::string &PluginPath) {
-    auto Plugin = PassPlugin::Load(PluginPath);
-    if (!Plugin)
-      reportFatalUsageError(Plugin.takeError());
-    PluginList.emplace_back(Plugin.get());
-  });
   cl::ParseCommandLineOptions(NewArgv.size(), &NewArgv[0]);
+  for (const std::string &Spec : PassPlugins)
+    if (Error E = PassPlugin::load(Spec).takeError())
+      reportFatalUsageError(std::move(E));
 
   Verbose = Args.hasArg(OPT_verbose);
   DryRun = Args.hasArg(OPT_dry_run);
diff --git a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
index 0396889fc57a4d..aa06cc6ebb036a 100644
--- a/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
+++ b/flang/lib/FrontendTool/ExecuteCompilerInvocation.cpp
@@ -182,7 +182,7 @@ bool executeCompilerInvocation(CompilerInstance *flang) {
   for (const std::string &path :
        flang->getInvocation().getCodeGenOpts().LLVMPassPlugins) {
     if (llvm::Expected<llvm::PassPlugin> passPlugin =
-            llvm::PassPlugin::Load(path)) {
+            llvm::PassPlugin::load(path)) {
       flang->addPassPlugin(std::make_unique<llvm::PassPlugin>(*passPlugin));
     } else {
       unsigned diagID = flang->getDiagnostics().getCustomDiagID(
diff --git a/llvm/docs/NewPassManager.md b/llvm/docs/NewPassManager.md
index f9b819c2591c88..78b88baf0dff96 100644
--- a/llvm/docs/NewPassManager.md
+++ b/llvm/docs/NewPassManager.md
@@ -174,8 +174,9 @@ backend adding passes to various parts of the pipeline.
 
 Pass plugins can also add passes into default pipelines. Different tools have
 different ways of loading dynamic pass plugins. For example, `opt
--load-pass-plugin=path/to/plugin.so` loads a pass plugin into `opt`. For
-information on writing a pass plugin, see {doc}`WritingAnLLVMNewPMPass`.
+-load-pass-plugin=path/to/plugin.so` loads a pass plugin into `opt`, and
+`-load-pass-plugin=path/to/plugin.so,-opt1,-opt2` also passes the plugin's
+options `-opt1` and `-opt2`. For information on writing a pass plugin, see {doc}`WritingAnLLVMNewPMPass`.
 
 ## Using Analyses
 
diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md
index 41b2fa83d380f9..ed5af868daa8f0 100644
--- a/llvm/docs/ReleaseNotes.md
+++ b/llvm/docs/ReleaseNotes.md
@@ -330,6 +330,12 @@ Makes programs 10x faster by doing Special New Thing.
 
 ### Changes to the LLVM tools
 
+* `opt`, `llc`, and `clang-linker-wrapper` accept
+  `-load-pass-plugin=plugin.so,-opt1,-opt2`, which passes options to the pass
+  plugin after it is loaded. A plugin's options elsewhere on the command line
+  are no longer accepted. `PassPlugin::Load` is renamed to `PassPlugin::load`,
+  which accepts the same specification.
+
 * llvm-mca no longer defaults -mcpu to "native"
 
 * llvm-rc now supports `/showIncludes` to report header and resource-file
diff --git a/llvm/docs/WritingAnLLVMNewPMPass.md b/llvm/docs/WritingAnLLVMNewPMPass.md
index 065c6b5bb02387..4ea4578ae53b9f 100644
--- a/llvm/docs/WritingAnLLVMNewPMPass.md
+++ b/llvm/docs/WritingAnLLVMNewPMPass.md
@@ -273,7 +273,7 @@ To make `PassBuilder` aware of dynamically linked pass plugins:
 
 ```c++
 // Load plugin dynamically.
-auto Plugin = PassPlugin::Load(PathToPlugin);
+auto Plugin = PassPlugin::load(PathToPlugin);
 if (!Plugin)
   report_error();
 // Register plugin extensions in PassBuilder.
diff --git a/llvm/include/llvm/Plugins/PassPlugin.h b/llvm/include/llvm/Plugins/PassPlugin.h
index e8da9c51c0a852..0f1fbb21b74ae9 100644
--- a/llvm/include/llvm/Plugins/PassPlugin.h
+++ b/llvm/include/llvm/Plugins/PassPlugin.h
@@ -70,12 +70,13 @@ struct PassPluginLibraryInfo {
 /// its interface defined by the \c PassPluginLibraryInfo it exposes.
 class PassPlugin {
 public:
-  /// Attempts to load a pass plugin from a given file.
+  /// Attempts to load a pass plugin specified as "<file>[,<option>...]", then
+  /// parses the options, which the plugin defines as cl::opt.
   ///
   /// \returns Returns an error if either the library cannot be found or loaded,
-  /// there is no public entry point, or the plugin implements the wrong API
-  /// version.
-  LLVM_ABI static Expected<PassPlugin> Load(const std::string &Filename);
+  /// there is no public entry point, the plugin implements the wrong API
+  /// version, or an option is invalid.
+  LLVM_ABI static Expected<PassPlugin> load(StringRef Spec);
 
   /// Get the filename of the loaded plugin.
   StringRef getFilename() const { return Filename; }
diff --git a/llvm/lib/LTO/LTOBackend.cpp b/llvm/lib/LTO/LTOBackend.cpp
index d9a6551139d374..0d253647ae46c8 100644
--- a/llvm/lib/LTO/LTOBackend.cpp
+++ b/llvm/lib/LTO/LTOBackend.cpp
@@ -207,7 +207,7 @@ static void RegisterPassPlugins(const Config &Conf, PassBuilder &PB) {
 
   // Load requested pass plugins and let them register pass builder callbacks
   for (auto &PluginFN : Conf.PassPluginFilenames) {
-    auto PassPlugin = PassPlugin::Load(PluginFN);
+    auto PassPlugin = PassPlugin::load(PluginFN);
     if (!PassPlugin)
       reportFatalUsageError(PassPlugin.takeError());
     PassPlugin->registerPassBuilderCallbacks(PB);
diff --git a/llvm/lib/Plugins/PassPlugin.cpp b/llvm/lib/Plugins/PassPlugin.cpp
index 84d55fc513b789..f56f2d7d1b767e 100644
--- a/llvm/lib/Plugins/PassPlugin.cpp
+++ b/llvm/lib/Plugins/PassPlugin.cpp
@@ -7,13 +7,19 @@
 //===----------------------------------------------------------------------===//
 
 #include "llvm/Plugins/PassPlugin.h"
+#include "llvm/ADT/STLExtras.h"
+#include "llvm/Support/CommandLine.h"
+#include "llvm/Support/StringSaver.h"
 #include "llvm/Support/raw_ostream.h"
 
 #include <cstdint>
 
 using namespace llvm;
 
-Expected<PassPlugin> PassPlugin::Load(const std::string &Filename) {
+Expected<PassPlugin> PassPlugin::load(StringRef Spec) {
+  SmallVector<StringRef, 0> Parts;
+  Spec.split(Parts, ',');
+  std::string Filename = Parts[0].str();
   std::string Error;
   auto Library =
       sys::DynamicLibrary::getPermanentLibrary(Filename.c_str(), &Error);
@@ -45,5 +51,16 @@ Expected<PassPlugin> PassPlugin::Load(const std::string &Filename) {
             Twine(LLVM_PLUGIN_API_VERSION) + ".",
         inconvertibleErrorCode());
 
+  if (Parts.size() == 1)
+    return P;
+  BumpPtrAllocator Alloc;
+  StringSaver Saver(Alloc);
+  SmallVector<const char *, 0> Argv = {Filename.c_str()};
+  for (StringRef Option : drop_begin(Parts))
+    Argv.push_back(Saver.save(Option).data());
+  std::string Msg;
+  raw_string_ostream OS(Msg);
+  if (!cl::ParseCommandLineOptions(Argv.size(), Argv.data(), "", &OS))
+    return createStringError(StringRef(Msg).trim());
   return P;
 }
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg-blockaddress.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg-blockaddress.ll
index f9cf6472a4c311..ef0ca4d6be37cd 100644
--- a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg-blockaddress.ll
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg-blockaddress.ll
@@ -1,7 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v1 -passes=tut-simplifycfg -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v2 -passes=tut-simplifycfg -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v3 -passes=tut-simplifycfg -S < %s | FileCheck %s
 
 define ptr @simp1(i32 %x) {
 ; CHECK-LABEL: @simp1(
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg1.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg1.ll
index 35dac1dba927bc..9ea6661010c195 100644
--- a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg1.ll
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg1.ll
@@ -1,7 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v1 -passes=tut-simplifycfg -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v2 -passes=tut-simplifycfg -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v3 -passes=tut-simplifycfg -S < %s | FileCheck %s
 
 define i32 @simp1() {
 ; CHECK-LABEL: @simp1(
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg2-dead-block-order.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg2-dead-block-order.ll
index aa078179d2e3bf..d0e2e95ff79c80 100644
--- a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg2-dead-block-order.ll
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg2-dead-block-order.ll
@@ -1,7 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v1 -passes=tut-simplifycfg -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v2 -passes=tut-simplifycfg -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v3 -passes=tut-simplifycfg -S < %s | FileCheck %s
 
 define i32 @remove_dead_blocks() {
 ; CHECK-LABEL: @remove_dead_blocks(
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg3-phis.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg3-phis.ll
index a4474d09df3209..e50ba55f74bded 100644
--- a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg3-phis.ll
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg3-phis.ll
@@ -1,7 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v1 -passes=tut-simplifycfg -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v2 -passes=tut-simplifycfg -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v3 -passes=tut-simplifycfg -S < %s | FileCheck %s
 
 define i32 @phi_cond_branch_eliminated() {
 ; CHECK-LABEL: @phi_cond_branch_eliminated(
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg4-multiple-duplicate-cfg-updates.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg4-multiple-duplicate-cfg-updates.ll
index 13ccb8b10dc41d..5bae31e62e9586 100644
--- a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg4-multiple-duplicate-cfg-updates.ll
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg4-multiple-duplicate-cfg-updates.ll
@@ -1,7 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 < %s -S -verify-dom-info | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 < %s -S -verify-dom-info | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 < %s -S -verify-dom-info | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v1 -passes=tut-simplifycfg < %s -S -verify-dom-info | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v2 -passes=tut-simplifycfg < %s -S -verify-dom-info | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v3 -passes=tut-simplifycfg < %s -S -verify-dom-info | FileCheck %s
 
 ; Check that we do not crash when we remove edges multiple times in
 ; the DomTreeUpdater.
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg5-del-phis-for-dead-block.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg5-del-phis-for-dead-block.ll
index 1f1c1016b3fc8d..d0109a7537eadb 100644
--- a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg5-del-phis-for-dead-block.ll
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg5-del-phis-for-dead-block.ll
@@ -1,7 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 < %s -S -verify-dom-info | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 < %s -S -verify-dom-info | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 < %s -S -verify-dom-info | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v1 -passes=tut-simplifycfg < %s -S -verify-dom-info | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v2 -passes=tut-simplifycfg < %s -S -verify-dom-info | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v3 -passes=tut-simplifycfg < %s -S -verify-dom-info | FileCheck %s
 
 define void @test() {
 ; CHECK-LABEL: @test(
diff --git a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg6-dead-self-loop.ll b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg6-dead-self-loop.ll
index e40076e6de3aab..ba190cdf10d07a 100644
--- a/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg6-dead-self-loop.ll
+++ b/llvm/test/Examples/IRTransforms/SimplifyCFG/tut-simplify-cfg6-dead-self-loop.ll
@@ -1,7 +1,7 @@
 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v1 -S < %s | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v2 -S < %s | FileCheck %s
-; RUN: opt %loadexampleirtransforms -passes=tut-simplifycfg -tut-simplifycfg-version=v3 -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v1 -passes=tut-simplifycfg -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v2 -passes=tut-simplifycfg -S < %s | FileCheck %s
+; RUN: opt %{loadexampleirtransforms,}-tut-simplifycfg-version=v3 -passes=tut-simplifycfg -S < %s | FileCheck %s
 
 define i32 @simp1() {
 ; CHECK-LABEL: @simp1(
diff --git a/llvm/test/Feature/codegen-plugin-passes.mir b/llvm/test/Feature/codegen-plugin-passes.mir
index 4b4ac5c54e59c0..2de83968eeb792 100644
--- a/llvm/test/Feature/codegen-plugin-passes.mir
+++ b/llvm/test/Feature/codegen-plugin-passes.mir
@@ -4,7 +4,7 @@
 # UNSUPPORTED: target={{.*windows.*}}
 # Plugins are currently broken on AIX, at least in the CI.
 # XFAIL: target={{.*}}-aix{{.*}}
-# RUN: llc -mtriple=x86_64-- %loadnewpmbye -passes=goodbye -wave-goodbye %s -o /dev/null 2>&1 | FileCheck %s
+# RUN: llc -mtriple=x86_64-- %{loadnewpmbye,}-wave-goodbye -passes=goodbye %s -o /dev/null 2>&1 | FileCheck %s
 # RUN: llc -mtriple=x86_64-- %loadnewpmbye -passes=goodbye --print-pipeline-passes -filetype=null %s | FileCheck %s --check-prefix=PIPELINE
 
 # CHECK: Bye: somefunk
diff --git a/llvm/test/Feature/codegen-plugin.ll b/llvm/test/Feature/codegen-plugin.ll
index cd36ef14d8ec33..74d4e1de3cc051 100644
--- a/llvm/test/Feature/codegen-plugin.ll
+++ b/llvm/test/Feature/codegen-plugin.ll
@@ -1,7 +1,7 @@
 ; REQUIRES: x86-registered-target
 ; RUN: llc < %s %loadnewpmbye | FileCheck %s --check-prefix=CHECK-ASM
-; RUN: llc < %s %loadnewpmbye -last-words | FileCheck %s --check-prefix=CHECK-ACTIVE
-; RUN: not llc < %s %loadnewpmbye -last-words -filetype=obj 2>&1 | FileCheck %s --check-prefix=CHECK-ERR
+; RUN: llc < %s %{loadnewpmbye,}-last-words | FileCheck %s --check-prefix=CHECK-ACTIVE
+; RUN: not llc < %s %{loadnewpmbye,}-last-words -filetype=obj 2>&1 | FileCheck %s --check-prefix=CHECK-ERR
 ; REQUIRES: plugins, examples
 ; UNSUPPORTED: target={{.*windows.*}}
 ; Plugins are currently broken on AIX, at least in the CI.
diff --git a/llvm/test/Feature/load_extension.ll b/llvm/test/Feature/load_extension.ll
index 6f99e99cb63458..6ceb9c2534f014 100644
--- a/llvm/test/Feature/load_extension.ll
+++ b/llvm/test/Feature/load_extension.ll
@@ -1,6 +1,6 @@
 ; REQUIRES: x86-registered-target
 ; RUN: opt %s %loadnewpmbye %loadbye -passes="goodbye" -wave-goodbye -disable-output 2>&1 | FileCheck %s
-; RUN: opt %s %loadnewpmbye -passes="goodbye" -wa...
[truncated]

``````````

</details>


https://github.com/llvm/llvm-project/pull/226773


More information about the flang-commits mailing list