[llvm] [utils][MCA] Add a helper script to create input-file-based tests (PR #190074)
Min-Yih Hsu via llvm-commits
llvm-commits at lists.llvm.org
Fri Apr 3 09:14:28 PDT 2026
https://github.com/mshockwave updated https://github.com/llvm/llvm-project/pull/190074
>From b25a03eb058de12dd2ef7c00eea8d726289de203 Mon Sep 17 00:00:00 2001
From: Min-Yih Hsu <min.hsu at sifive.com>
Date: Wed, 1 Apr 2026 11:26:13 -0700
Subject: [PATCH 1/4] [utils][MCA] Add a helper script to create
input-file-based tests
---
llvm/utils/create-stencil-mca-tests.py | 57 ++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
create mode 100755 llvm/utils/create-stencil-mca-tests.py
diff --git a/llvm/utils/create-stencil-mca-tests.py b/llvm/utils/create-stencil-mca-tests.py
new file mode 100755
index 0000000000000..d9420d4df6c09
--- /dev/null
+++ b/llvm/utils/create-stencil-mca-tests.py
@@ -0,0 +1,57 @@
+#!/usr/bin/env python3
+
+from pathlib import Path
+from os import path
+
+desc='''
+A simple script to create new llvm-mca tests from a set of input files. For each .s files under <input files folder>,
+it creates a corresponding .test file containing the RUN line, in which the llvm-mca command reads the input from the
+said .s file.
+
+Example Usage:
+```
+create_mca_tests.py --triple riscv64 --cpu generic-rv64 test/tools/llvm-mca/RISCV/Inputs test/tools/llvm-mca/RISCV/Generic
+```
+
+This command will create files like `test/tools/llvm-mca/RISCV/Generic/mul-div.test` whose RUN line takes
+`test/tools/llvm-mca/RISCV/Inputs/mul-div.s` as input.
+'''
+
+run_line_template = '# RUN: llvm-mca -mtriple={triple} -mcpu={cpu} -iterations=1 -instruction-tables=full {extra_mca_args} %p/{input_file} | FileCheck {extra_filecheck_args} %s'
+
+def entry(args):
+ input_dir_path = Path(args.input_dir)
+ output_dir_path = Path(args.output_dir)
+
+ # Find all the input files.
+ for input_file in input_dir_path.glob('**/*.s'):
+ new_file = input_file.relative_to(input_dir_path)
+ # Filter out unwanted files.
+ if any(new_file.match(x) for x in (args.exclude or [])):
+ continue
+ new_file = output_dir_path / new_file.with_suffix('.test')
+ # Make sure the destination folder is there
+ new_file.parent.mkdir(exist_ok=True, parents=True)
+ with open(new_file, 'w') as output_file:
+ input_relative_path = path.relpath(input_file, start=new_file.parent)
+ run_line = run_line_template.format(
+ triple=args.triple, cpu=args.cpu, input_file=input_relative_path,
+ extra_mca_args=args.extra_mca_args, extra_filecheck_args=args.extra_filecheck_args)
+ print(run_line, file=output_file)
+
+if __name__ == '__main__':
+ from argparse import ArgumentParser
+ parser = ArgumentParser(description=desc)
+ parser.add_argument('input_dir', type=str, metavar='<input files folder>',
+ help='Folder to read input files from')
+ parser.add_argument('output_dir', type=str, metavar='<output folder>',
+ help='Folder to put output test files to')
+ parser.add_argument('--triple', required=True, type=str, help='-mtriple to use')
+ parser.add_argument('--cpu', required=True, type=str, help='-mcpu to use')
+ parser.add_argument('--exclude', nargs='+', metavar='<file>',
+ help='Input files, relative to the input folder, to exclude')
+ parser.add_argument('--extra-mca-args', type=str, default='', metavar='<flags>',
+ help='Extra command line arguments for llvm-mca')
+ parser.add_argument('--extra-filecheck-args', type=str, default='', metavar='<flags>',
+ help='Extra command line arguments for FileCheck')
+ entry(parser.parse_args())
>From a1b567846b6426589a7233fe853185dee1d8a464 Mon Sep 17 00:00:00 2001
From: Min-Yih Hsu <min.hsu at sifive.com>
Date: Wed, 1 Apr 2026 15:37:26 -0700
Subject: [PATCH 2/4] fixup! Formatting
---
llvm/utils/create-stencil-mca-tests.py | 71 ++++++++++++++++++--------
1 file changed, 50 insertions(+), 21 deletions(-)
diff --git a/llvm/utils/create-stencil-mca-tests.py b/llvm/utils/create-stencil-mca-tests.py
index d9420d4df6c09..03a579cefc734 100755
--- a/llvm/utils/create-stencil-mca-tests.py
+++ b/llvm/utils/create-stencil-mca-tests.py
@@ -3,7 +3,7 @@
from pathlib import Path
from os import path
-desc='''
+desc = """
A simple script to create new llvm-mca tests from a set of input files. For each .s files under <input files folder>,
it creates a corresponding .test file containing the RUN line, in which the llvm-mca command reads the input from the
said .s file.
@@ -15,43 +15,72 @@
This command will create files like `test/tools/llvm-mca/RISCV/Generic/mul-div.test` whose RUN line takes
`test/tools/llvm-mca/RISCV/Inputs/mul-div.s` as input.
-'''
+"""
+
+run_line_template = "# RUN: llvm-mca -mtriple={triple} -mcpu={cpu} -iterations=1 -instruction-tables=full {extra_mca_args} %p/{input_file} | FileCheck {extra_filecheck_args} %s"
-run_line_template = '# RUN: llvm-mca -mtriple={triple} -mcpu={cpu} -iterations=1 -instruction-tables=full {extra_mca_args} %p/{input_file} | FileCheck {extra_filecheck_args} %s'
def entry(args):
input_dir_path = Path(args.input_dir)
output_dir_path = Path(args.output_dir)
# Find all the input files.
- for input_file in input_dir_path.glob('**/*.s'):
+ for input_file in input_dir_path.glob("**/*.s"):
new_file = input_file.relative_to(input_dir_path)
# Filter out unwanted files.
if any(new_file.match(x) for x in (args.exclude or [])):
continue
- new_file = output_dir_path / new_file.with_suffix('.test')
+ new_file = output_dir_path / new_file.with_suffix(".test")
# Make sure the destination folder is there
new_file.parent.mkdir(exist_ok=True, parents=True)
- with open(new_file, 'w') as output_file:
+ with open(new_file, "w") as output_file:
input_relative_path = path.relpath(input_file, start=new_file.parent)
run_line = run_line_template.format(
- triple=args.triple, cpu=args.cpu, input_file=input_relative_path,
- extra_mca_args=args.extra_mca_args, extra_filecheck_args=args.extra_filecheck_args)
+ triple=args.triple,
+ cpu=args.cpu,
+ input_file=input_relative_path,
+ extra_mca_args=args.extra_mca_args,
+ extra_filecheck_args=args.extra_filecheck_args,
+ )
print(run_line, file=output_file)
-if __name__ == '__main__':
+
+if __name__ == "__main__":
from argparse import ArgumentParser
+
parser = ArgumentParser(description=desc)
- parser.add_argument('input_dir', type=str, metavar='<input files folder>',
- help='Folder to read input files from')
- parser.add_argument('output_dir', type=str, metavar='<output folder>',
- help='Folder to put output test files to')
- parser.add_argument('--triple', required=True, type=str, help='-mtriple to use')
- parser.add_argument('--cpu', required=True, type=str, help='-mcpu to use')
- parser.add_argument('--exclude', nargs='+', metavar='<file>',
- help='Input files, relative to the input folder, to exclude')
- parser.add_argument('--extra-mca-args', type=str, default='', metavar='<flags>',
- help='Extra command line arguments for llvm-mca')
- parser.add_argument('--extra-filecheck-args', type=str, default='', metavar='<flags>',
- help='Extra command line arguments for FileCheck')
+ parser.add_argument(
+ "input_dir",
+ type=str,
+ metavar="<input files folder>",
+ help="Folder to read input files from",
+ )
+ parser.add_argument(
+ "output_dir",
+ type=str,
+ metavar="<output folder>",
+ help="Folder to put output test files to",
+ )
+ parser.add_argument("--triple", required=True, type=str, help="-mtriple to use")
+ parser.add_argument("--cpu", required=True, type=str, help="-mcpu to use")
+ parser.add_argument(
+ "--exclude",
+ nargs="+",
+ metavar="<file>",
+ help="Input files, relative to the input folder, to exclude",
+ )
+ parser.add_argument(
+ "--extra-mca-args",
+ type=str,
+ default="",
+ metavar="<flags>",
+ help="Extra command line arguments for llvm-mca",
+ )
+ parser.add_argument(
+ "--extra-filecheck-args",
+ type=str,
+ default="",
+ metavar="<flags>",
+ help="Extra command line arguments for FileCheck",
+ )
entry(parser.parse_args())
>From f7629c0734d53d6d0a2e669e648e4da79d61ba4f Mon Sep 17 00:00:00 2001
From: Min-Yih Hsu <min.hsu at sifive.com>
Date: Thu, 2 Apr 2026 13:28:28 -0700
Subject: [PATCH 3/4] fixup! Address review comments
---
...reate-stencil-mca-tests.py => create-template-mca-tests.py} | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
rename llvm/utils/{create-stencil-mca-tests.py => create-template-mca-tests.py} (98%)
diff --git a/llvm/utils/create-stencil-mca-tests.py b/llvm/utils/create-template-mca-tests.py
similarity index 98%
rename from llvm/utils/create-stencil-mca-tests.py
rename to llvm/utils/create-template-mca-tests.py
index 03a579cefc734..87462bf2e499a 100755
--- a/llvm/utils/create-stencil-mca-tests.py
+++ b/llvm/utils/create-template-mca-tests.py
@@ -2,6 +2,7 @@
from pathlib import Path
from os import path
+from argparse import ArgumentParser
desc = """
A simple script to create new llvm-mca tests from a set of input files. For each .s files under <input files folder>,
@@ -46,8 +47,6 @@ def entry(args):
if __name__ == "__main__":
- from argparse import ArgumentParser
-
parser = ArgumentParser(description=desc)
parser.add_argument(
"input_dir",
>From 7848d306915dd69a4cd736280e31809b3b247e16 Mon Sep 17 00:00:00 2001
From: Min-Yih Hsu <min.hsu at sifive.com>
Date: Fri, 3 Apr 2026 09:14:01 -0700
Subject: [PATCH 4/4] fixup! Update file name
---
...reate-template-mca-tests.py => create_template_mca_tests.py} | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
rename llvm/utils/{create-template-mca-tests.py => create_template_mca_tests.py} (95%)
diff --git a/llvm/utils/create-template-mca-tests.py b/llvm/utils/create_template_mca_tests.py
similarity index 95%
rename from llvm/utils/create-template-mca-tests.py
rename to llvm/utils/create_template_mca_tests.py
index 87462bf2e499a..428989a462cac 100755
--- a/llvm/utils/create-template-mca-tests.py
+++ b/llvm/utils/create_template_mca_tests.py
@@ -11,7 +11,7 @@
Example Usage:
```
-create_mca_tests.py --triple riscv64 --cpu generic-rv64 test/tools/llvm-mca/RISCV/Inputs test/tools/llvm-mca/RISCV/Generic
+create_template_mca_tests.py --triple riscv64 --cpu generic-rv64 test/tools/llvm-mca/RISCV/Inputs test/tools/llvm-mca/RISCV/Generic
```
This command will create files like `test/tools/llvm-mca/RISCV/Generic/mul-div.test` whose RUN line takes
More information about the llvm-commits
mailing list