[llvm] [llvm][lit] Add option to run only the failed tests (PR #158043)

Michael Buch via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 10 01:00:22 PST 2025


https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/158043

>From 8149f8a213066a968676c81b0834139c1dd174e3 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Thu, 11 Sep 2025 12:22:45 +0100
Subject: [PATCH 01/18] [llvm][lit] Add option to run only the failed tests

This patch adds a new `--filter-failed` option to `llvm-lit`, which when
set, will only run the tests that have previously failed.
---
 llvm/utils/lit/lit/cl_arguments.py             |  6 ++++++
 llvm/utils/lit/lit/main.py                     |  3 +++
 .../lit/tests/Inputs/ignore-fail/pass.txt      |  1 +
 llvm/utils/lit/tests/filter-failed.py          | 18 ++++++++++++++++++
 llvm/utils/lit/tests/ignore-fail.py            |  2 ++
 5 files changed, 30 insertions(+)
 create mode 100644 llvm/utils/lit/tests/Inputs/ignore-fail/pass.txt
 create mode 100644 llvm/utils/lit/tests/filter-failed.py

diff --git a/llvm/utils/lit/lit/cl_arguments.py b/llvm/utils/lit/lit/cl_arguments.py
index 5c2ff4e70a3aa..62aa8ae8a02e3 100644
--- a/llvm/utils/lit/lit/cl_arguments.py
+++ b/llvm/utils/lit/lit/cl_arguments.py
@@ -423,6 +423,12 @@ def parse_args():
         help="Filter out tests with paths matching the given regular expression",
         default=os.environ.get("LIT_FILTER_OUT", "^$"),
     )
+    selection_group.add_argument(
+        "--filter-failed",
+        dest="filterFailed",
+        help="Only run tests which failed in the previous run.",
+        action="store_true",
+    )
     selection_group.add_argument(
         "--xfail",
         metavar="LIST",
diff --git a/llvm/utils/lit/lit/main.py b/llvm/utils/lit/lit/main.py
index 07e809b168dc2..77b23bf560c6e 100755
--- a/llvm/utils/lit/lit/main.py
+++ b/llvm/utils/lit/lit/main.py
@@ -90,6 +90,9 @@ def main(builtin_params={}):
         and not opts.filter_out.search(t.getFullName())
     ]
 
+    if opts.filterFailed:
+        selected_tests = [t for t in selected_tests if t.previous_failure]
+
     if not selected_tests:
         sys.stderr.write(
             "error: filter did not match any tests "
diff --git a/llvm/utils/lit/tests/Inputs/ignore-fail/pass.txt b/llvm/utils/lit/tests/Inputs/ignore-fail/pass.txt
new file mode 100644
index 0000000000000..18efe9e49e95b
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/ignore-fail/pass.txt
@@ -0,0 +1 @@
+RUN: true
diff --git a/llvm/utils/lit/tests/filter-failed.py b/llvm/utils/lit/tests/filter-failed.py
new file mode 100644
index 0000000000000..074f14cf7fc34
--- /dev/null
+++ b/llvm/utils/lit/tests/filter-failed.py
@@ -0,0 +1,18 @@
+# Checks that --filter-failed only runs tests that previously failed.
+
+# RUN: not %{lit} %{inputs}/ignore-fail
+# RUN: not %{lit} --filter-failed %{inputs}/ignore-fail | FileCheck %s
+
+# END.
+
+# CHECK: Testing: 3 of 5 tests
+# CHECK-DAG: FAIL: ignore-fail :: fail.txt
+# CHECK-DAG: UNRESOLVED: ignore-fail :: unresolved.txt
+# CHECK-DAG: XPASS: ignore-fail :: xpass.txt
+
+#      CHECK: Testing Time:
+# CHECK: Total Discovered Tests:
+# CHECK-NEXT:   Excluded : 2 {{\([0-9]*\.[0-9]*%\)}}
+# CHECK-NEXT:   Unresolved : 1 {{\([0-9]*\.[0-9]*%\)}}
+# CHECK-NEXT:   Failed : 1 {{\([0-9]*\.[0-9]*%\)}}
+# CHECK-NEXT:   Unexpectedly Passed: 1 {{\([0-9]*\.[0-9]*%\)}}
diff --git a/llvm/utils/lit/tests/ignore-fail.py b/llvm/utils/lit/tests/ignore-fail.py
index 494c6e092c906..51196fbae9e5e 100644
--- a/llvm/utils/lit/tests/ignore-fail.py
+++ b/llvm/utils/lit/tests/ignore-fail.py
@@ -10,9 +10,11 @@
 # CHECK-DAG: UNRESOLVED: ignore-fail :: unresolved.txt
 # CHECK-DAG: XFAIL: ignore-fail :: xfail.txt
 # CHECK-DAG: XPASS: ignore-fail :: xpass.txt
+# CHECK-DAG: PASS: ignore-fail :: pass.txt
 
 #      CHECK: Testing Time:
 # CHECK: Total Discovered Tests:
+# CHECK-NEXT:   Passed : 1 {{\([0-9]*\.[0-9]*%\)}}
 # CHECK-NEXT:   Expectedly Failed : 1 {{\([0-9]*\.[0-9]*%\)}}
 # CHECK-NEXT:   Unresolved : 1 {{\([0-9]*\.[0-9]*%\)}}
 # CHECK-NEXT:   Failed : 1 {{\([0-9]*\.[0-9]*%\)}}

>From 6e49b400fc0cc23181fee6920e2f3b33cddb5dd9 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Thu, 11 Sep 2025 17:13:25 +0100
Subject: [PATCH 02/18] fixup! docs

---
 llvm/docs/CommandGuide/lit.rst | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/llvm/docs/CommandGuide/lit.rst b/llvm/docs/CommandGuide/lit.rst
index bbc149740494a..af4564d5fda52 100644
--- a/llvm/docs/CommandGuide/lit.rst
+++ b/llvm/docs/CommandGuide/lit.rst
@@ -314,6 +314,10 @@ The timing data is stored in the `test_exec_root` in a file named
   place of this option, which is especially useful in environments where the
   call to ``lit`` is issued indirectly.
 
+.. option:: --filter-failed
+
+  Run only those tests that previously failed.
+
 .. option:: --xfail LIST
 
   Treat those tests whose name is in the semicolon separated list ``LIST`` as

>From 36104dbf2eb81965ae33e7865defb2f9cbcdceb7 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 12 Sep 2025 09:30:14 +0100
Subject: [PATCH 03/18] fixup! omit terminating '.' in help text

---
 llvm/utils/lit/lit/cl_arguments.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/utils/lit/lit/cl_arguments.py b/llvm/utils/lit/lit/cl_arguments.py
index 62aa8ae8a02e3..ee05847e2c765 100644
--- a/llvm/utils/lit/lit/cl_arguments.py
+++ b/llvm/utils/lit/lit/cl_arguments.py
@@ -426,7 +426,7 @@ def parse_args():
     selection_group.add_argument(
         "--filter-failed",
         dest="filterFailed",
-        help="Only run tests which failed in the previous run.",
+        help="Only run tests which failed in the previous run",
         action="store_true",
     )
     selection_group.add_argument(

>From de9151f18c7b766b6f51c8391bde8923b3c00b4a Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 12 Sep 2025 09:30:30 +0100
Subject: [PATCH 04/18] fixup! expand docs

---
 llvm/docs/CommandGuide/lit.rst | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/llvm/docs/CommandGuide/lit.rst b/llvm/docs/CommandGuide/lit.rst
index af4564d5fda52..bbeafd2b9234c 100644
--- a/llvm/docs/CommandGuide/lit.rst
+++ b/llvm/docs/CommandGuide/lit.rst
@@ -316,7 +316,8 @@ The timing data is stored in the `test_exec_root` in a file named
 
 .. option:: --filter-failed
 
-  Run only those tests that previously failed.
+  Run only those tests that previously failed. Tests that have been newly added
+  but not yet run are not included.
 
 .. option:: --xfail LIST
 

>From ac4eb192902a76b6567aa01044b385a8bc513e07 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 12 Sep 2025 09:31:07 +0100
Subject: [PATCH 05/18] fixup! fix spacing in test

---
 llvm/utils/lit/tests/filter-failed.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/utils/lit/tests/filter-failed.py b/llvm/utils/lit/tests/filter-failed.py
index 074f14cf7fc34..444509dc02b42 100644
--- a/llvm/utils/lit/tests/filter-failed.py
+++ b/llvm/utils/lit/tests/filter-failed.py
@@ -10,7 +10,7 @@
 # CHECK-DAG: UNRESOLVED: ignore-fail :: unresolved.txt
 # CHECK-DAG: XPASS: ignore-fail :: xpass.txt
 
-#      CHECK: Testing Time:
+# CHECK: Testing Time:
 # CHECK: Total Discovered Tests:
 # CHECK-NEXT:   Excluded : 2 {{\([0-9]*\.[0-9]*%\)}}
 # CHECK-NEXT:   Unresolved : 1 {{\([0-9]*\.[0-9]*%\)}}

>From 7f19f429911bbf3a8b50eef546325faa1dee58df Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 12 Sep 2025 09:48:58 +0100
Subject: [PATCH 06/18] fixup! add 'newly added tests' test case

---
 .../lit/tests/Inputs/filter-failed/fail.txt   |  1 +
 .../lit/tests/Inputs/filter-failed/lit.cfg    |  7 +++++++
 .../lit/tests/Inputs/filter-failed/pass.txt   |  1 +
 .../tests/Inputs/filter-failed/unresolved.txt |  0
 .../lit/tests/Inputs/filter-failed/xfail.txt  |  2 ++
 .../lit/tests/Inputs/filter-failed/xpass.txt  |  2 ++
 llvm/utils/lit/tests/filter-failed.py         | 21 ++++++++++++-------
 7 files changed, 27 insertions(+), 7 deletions(-)
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed/fail.txt
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed/lit.cfg
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed/pass.txt
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed/xfail.txt
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed/xpass.txt

diff --git a/llvm/utils/lit/tests/Inputs/filter-failed/fail.txt b/llvm/utils/lit/tests/Inputs/filter-failed/fail.txt
new file mode 100644
index 0000000000000..15eb81a5f5e95
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed/fail.txt
@@ -0,0 +1 @@
+RUN: false
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed/lit.cfg b/llvm/utils/lit/tests/Inputs/filter-failed/lit.cfg
new file mode 100644
index 0000000000000..5aee4eb132d6e
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed/lit.cfg
@@ -0,0 +1,7 @@
+import lit.formats
+
+config.name = "filter-failed"
+config.suffixes = [".txt"]
+config.test_format = lit.formats.ShTest()
+config.test_source_root = None
+config.test_exec_root = None
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed/pass.txt b/llvm/utils/lit/tests/Inputs/filter-failed/pass.txt
new file mode 100644
index 0000000000000..18efe9e49e95b
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed/pass.txt
@@ -0,0 +1 @@
+RUN: true
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt b/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed/xfail.txt b/llvm/utils/lit/tests/Inputs/filter-failed/xfail.txt
new file mode 100644
index 0000000000000..6814cda401483
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed/xfail.txt
@@ -0,0 +1,2 @@
+RUN: false
+XFAIL: *
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed/xpass.txt b/llvm/utils/lit/tests/Inputs/filter-failed/xpass.txt
new file mode 100644
index 0000000000000..66b8a6a5a187c
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed/xpass.txt
@@ -0,0 +1,2 @@
+RUN: true
+XFAIL: *
diff --git a/llvm/utils/lit/tests/filter-failed.py b/llvm/utils/lit/tests/filter-failed.py
index 444509dc02b42..f0199f57bf5ae 100644
--- a/llvm/utils/lit/tests/filter-failed.py
+++ b/llvm/utils/lit/tests/filter-failed.py
@@ -1,18 +1,25 @@
 # Checks that --filter-failed only runs tests that previously failed.
 
-# RUN: not %{lit} %{inputs}/ignore-fail
-# RUN: not %{lit} --filter-failed %{inputs}/ignore-fail | FileCheck %s
+# RUN: not %{lit} %{inputs}/filter-failed
+#
+# RUN: rm -f %{inputs}/filter-failed/new-fail.txt
+# RUN: echo "RUN: false" > %{inputs}/filter-failed/new-fail.txt
+#
+# RUN: rm -f %{inputs}/filter-failed/new-pass.txt
+# RUN: echo "RUN: true" > %{inputs}/filter-failed/new-pass.txt
+#
+# RUN: not %{lit} --filter-failed %{inputs}/filter-failed | FileCheck %s
 
 # END.
 
-# CHECK: Testing: 3 of 5 tests
-# CHECK-DAG: FAIL: ignore-fail :: fail.txt
-# CHECK-DAG: UNRESOLVED: ignore-fail :: unresolved.txt
-# CHECK-DAG: XPASS: ignore-fail :: xpass.txt
+# CHECK: Testing: 3 of 7 tests
+# CHECK-DAG: FAIL: filter-failed :: fail.txt
+# CHECK-DAG: UNRESOLVED: filter-failed :: unresolved.txt
+# CHECK-DAG: XPASS: filter-failed :: xpass.txt
 
 # CHECK: Testing Time:
 # CHECK: Total Discovered Tests:
-# CHECK-NEXT:   Excluded : 2 {{\([0-9]*\.[0-9]*%\)}}
+# CHECK-NEXT:   Excluded : 4 {{\([0-9]*\.[0-9]*%\)}}
 # CHECK-NEXT:   Unresolved : 1 {{\([0-9]*\.[0-9]*%\)}}
 # CHECK-NEXT:   Failed : 1 {{\([0-9]*\.[0-9]*%\)}}
 # CHECK-NEXT:   Unexpectedly Passed: 1 {{\([0-9]*\.[0-9]*%\)}}

>From 434acfe25ece3e9e83f00f8271d691173d96bea0 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 12 Sep 2025 09:51:29 +0100
Subject: [PATCH 07/18] fixup! revert changes to ignore-fail

---
 llvm/utils/lit/tests/Inputs/ignore-fail/pass.txt | 1 -
 llvm/utils/lit/tests/ignore-fail.py              | 2 --
 2 files changed, 3 deletions(-)
 delete mode 100644 llvm/utils/lit/tests/Inputs/ignore-fail/pass.txt

diff --git a/llvm/utils/lit/tests/Inputs/ignore-fail/pass.txt b/llvm/utils/lit/tests/Inputs/ignore-fail/pass.txt
deleted file mode 100644
index 18efe9e49e95b..0000000000000
--- a/llvm/utils/lit/tests/Inputs/ignore-fail/pass.txt
+++ /dev/null
@@ -1 +0,0 @@
-RUN: true
diff --git a/llvm/utils/lit/tests/ignore-fail.py b/llvm/utils/lit/tests/ignore-fail.py
index 51196fbae9e5e..494c6e092c906 100644
--- a/llvm/utils/lit/tests/ignore-fail.py
+++ b/llvm/utils/lit/tests/ignore-fail.py
@@ -10,11 +10,9 @@
 # CHECK-DAG: UNRESOLVED: ignore-fail :: unresolved.txt
 # CHECK-DAG: XFAIL: ignore-fail :: xfail.txt
 # CHECK-DAG: XPASS: ignore-fail :: xpass.txt
-# CHECK-DAG: PASS: ignore-fail :: pass.txt
 
 #      CHECK: Testing Time:
 # CHECK: Total Discovered Tests:
-# CHECK-NEXT:   Passed : 1 {{\([0-9]*\.[0-9]*%\)}}
 # CHECK-NEXT:   Expectedly Failed : 1 {{\([0-9]*\.[0-9]*%\)}}
 # CHECK-NEXT:   Unresolved : 1 {{\([0-9]*\.[0-9]*%\)}}
 # CHECK-NEXT:   Failed : 1 {{\([0-9]*\.[0-9]*%\)}}

>From 74400d0a85fca595ad4b0c2fa6488d83074a0808 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Mon, 15 Sep 2025 18:05:45 +0100
Subject: [PATCH 08/18] fixup! add more tests

---
 .../Inputs/filter-failed-delete/fail.txt      |  1 +
 .../tests/Inputs/filter-failed-delete/lit.cfg |  7 +++++++
 .../Inputs/filter-failed-delete/pass.txt      |  1 +
 .../filter-failed-delete/unresolved.txt       |  0
 .../tests/Inputs/filter-failed-rerun/fail.txt |  1 +
 .../tests/Inputs/filter-failed-rerun/lit.cfg  |  7 +++++++
 .../tests/Inputs/filter-failed-rerun/pass.txt |  1 +
 .../Inputs/filter-failed-rerun/xpass.txt      |  2 ++
 llvm/utils/lit/tests/filter-failed-delete.py  | 14 +++++++++++++
 llvm/utils/lit/tests/filter-failed-rerun.py   | 20 +++++++++++++++++++
 llvm/utils/lit/tests/filter-failed.py         |  2 --
 11 files changed, 54 insertions(+), 2 deletions(-)
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-delete/fail.txt
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-delete/lit.cfg
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-delete/pass.txt
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-delete/unresolved.txt
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-rerun/fail.txt
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-rerun/lit.cfg
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-rerun/pass.txt
 create mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-rerun/xpass.txt
 create mode 100644 llvm/utils/lit/tests/filter-failed-delete.py
 create mode 100644 llvm/utils/lit/tests/filter-failed-rerun.py

diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-delete/fail.txt b/llvm/utils/lit/tests/Inputs/filter-failed-delete/fail.txt
new file mode 100644
index 0000000000000..15eb81a5f5e95
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed-delete/fail.txt
@@ -0,0 +1 @@
+RUN: false
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-delete/lit.cfg b/llvm/utils/lit/tests/Inputs/filter-failed-delete/lit.cfg
new file mode 100644
index 0000000000000..6c6dfa8e184c3
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed-delete/lit.cfg
@@ -0,0 +1,7 @@
+import lit.formats
+
+config.name = "filter-failed-delete"
+config.suffixes = [".txt"]
+config.test_format = lit.formats.ShTest()
+config.test_source_root = None
+config.test_exec_root = None
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-delete/pass.txt b/llvm/utils/lit/tests/Inputs/filter-failed-delete/pass.txt
new file mode 100644
index 0000000000000..18efe9e49e95b
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed-delete/pass.txt
@@ -0,0 +1 @@
+RUN: true
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-delete/unresolved.txt b/llvm/utils/lit/tests/Inputs/filter-failed-delete/unresolved.txt
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/fail.txt b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/fail.txt
new file mode 100644
index 0000000000000..15eb81a5f5e95
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/fail.txt
@@ -0,0 +1 @@
+RUN: false
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/lit.cfg b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/lit.cfg
new file mode 100644
index 0000000000000..25b79c4a368f0
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/lit.cfg
@@ -0,0 +1,7 @@
+import lit.formats
+
+config.name = "filter-failed-rerun"
+config.suffixes = [".txt"]
+config.test_format = lit.formats.ShTest()
+config.test_source_root = None
+config.test_exec_root = None
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/pass.txt b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/pass.txt
new file mode 100644
index 0000000000000..18efe9e49e95b
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/pass.txt
@@ -0,0 +1 @@
+RUN: true
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/xpass.txt b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/xpass.txt
new file mode 100644
index 0000000000000..66b8a6a5a187c
--- /dev/null
+++ b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/xpass.txt
@@ -0,0 +1,2 @@
+RUN: true
+XFAIL: *
diff --git a/llvm/utils/lit/tests/filter-failed-delete.py b/llvm/utils/lit/tests/filter-failed-delete.py
new file mode 100644
index 0000000000000..2432db193414f
--- /dev/null
+++ b/llvm/utils/lit/tests/filter-failed-delete.py
@@ -0,0 +1,14 @@
+# Shows behaviour when a previously failed test was deleted
+# before running with --filter-failed.
+
+# RUN: not %{lit} %{inputs}/filter-failed-delete | FileCheck %s --check-prefix=CHECK-FIRST
+#
+# RUN: mv %{inputs}/filter-failed-delete/fail.txt %{inputs}/filter-failed-delete/fail.txt.bk
+# RUN: not %{lit} --filter-failed %{inputs}/filter-failed-delete > %s.rerun.log
+# RUN: mv %{inputs}/filter-failed-delete/fail.txt.bk %{inputs}/filter-failed-delete/fail.txt
+#
+# RUN: cat %s.rerun.log | FileCheck %s --check-prefix=CHECK-RERUN
+
+# CHECK-FIRST: FAIL: filter-failed-delete :: fail.txt
+
+# CHECK-RERUN-NOT: filter-failed-delete :: fail.txt
diff --git a/llvm/utils/lit/tests/filter-failed-rerun.py b/llvm/utils/lit/tests/filter-failed-rerun.py
new file mode 100644
index 0000000000000..d43c592dc7273
--- /dev/null
+++ b/llvm/utils/lit/tests/filter-failed-rerun.py
@@ -0,0 +1,20 @@
+# Checks that --filter-failed won't re-run tests that have passed
+# since the last time --filter-failed has run.
+
+# RUN: not %{lit} %{inputs}/filter-failed-rerun | FileCheck %s --check-prefix=CHECK-FIRST
+#
+# RUN: mv %{inputs}/filter-failed-rerun/fail.txt %{inputs}/filter-failed-rerun/fail.txt.bk
+# RUN: cp %{inputs}/filter-failed-rerun/pass.txt %{inputs}/filter-failed-rerun/fail.txt
+# RUN: not %{lit} %{inputs}/filter-failed-rerun > %s.rerun-1.log
+# RUN: not %{lit} --filter-failed %{inputs}/filter-failed-rerun > %s.rerun-2.log
+# RUN: mv %{inputs}/filter-failed-rerun/fail.txt.bk %{inputs}/filter-failed-rerun/fail.txt
+#
+# RUN: cat %s.rerun-1.log | FileCheck %s --check-prefix=CHECK-RERUN1
+# RUN: cat %s.rerun-2.log | FileCheck %s --check-prefix=CHECK-RERUN2
+
+# CHECK-FIRST: FAIL: filter-failed-rerun :: fail.txt
+
+# CHECK-RERUN1: PASS: filter-failed-rerun :: fail.txt
+
+# CHECK-RERUN2: Testing: 1 of 3 tests
+# CHECK-RERUN2-NOT: filter-failed-rerun :: fail.txt
diff --git a/llvm/utils/lit/tests/filter-failed.py b/llvm/utils/lit/tests/filter-failed.py
index f0199f57bf5ae..76c529f5b54ef 100644
--- a/llvm/utils/lit/tests/filter-failed.py
+++ b/llvm/utils/lit/tests/filter-failed.py
@@ -10,8 +10,6 @@
 #
 # RUN: not %{lit} --filter-failed %{inputs}/filter-failed | FileCheck %s
 
-# END.
-
 # CHECK: Testing: 3 of 7 tests
 # CHECK-DAG: FAIL: filter-failed :: fail.txt
 # CHECK-DAG: UNRESOLVED: filter-failed :: unresolved.txt

>From 029f3ba44fd113a68dcf4c76faea4610473948ec Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Tue, 16 Sep 2025 11:50:52 +0100
Subject: [PATCH 09/18] fixup! use --input-file

---
 llvm/utils/lit/tests/filter-failed-delete.py | 2 +-
 llvm/utils/lit/tests/filter-failed-rerun.py  | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/utils/lit/tests/filter-failed-delete.py b/llvm/utils/lit/tests/filter-failed-delete.py
index 2432db193414f..8bad37f4c7a62 100644
--- a/llvm/utils/lit/tests/filter-failed-delete.py
+++ b/llvm/utils/lit/tests/filter-failed-delete.py
@@ -7,7 +7,7 @@
 # RUN: not %{lit} --filter-failed %{inputs}/filter-failed-delete > %s.rerun.log
 # RUN: mv %{inputs}/filter-failed-delete/fail.txt.bk %{inputs}/filter-failed-delete/fail.txt
 #
-# RUN: cat %s.rerun.log | FileCheck %s --check-prefix=CHECK-RERUN
+# RUN: FileCheck %s --input-file=%s.rerun.log --check-prefix=CHECK-RERUN
 
 # CHECK-FIRST: FAIL: filter-failed-delete :: fail.txt
 
diff --git a/llvm/utils/lit/tests/filter-failed-rerun.py b/llvm/utils/lit/tests/filter-failed-rerun.py
index d43c592dc7273..9f46b87591eb7 100644
--- a/llvm/utils/lit/tests/filter-failed-rerun.py
+++ b/llvm/utils/lit/tests/filter-failed-rerun.py
@@ -9,8 +9,8 @@
 # RUN: not %{lit} --filter-failed %{inputs}/filter-failed-rerun > %s.rerun-2.log
 # RUN: mv %{inputs}/filter-failed-rerun/fail.txt.bk %{inputs}/filter-failed-rerun/fail.txt
 #
-# RUN: cat %s.rerun-1.log | FileCheck %s --check-prefix=CHECK-RERUN1
-# RUN: cat %s.rerun-2.log | FileCheck %s --check-prefix=CHECK-RERUN2
+# RUN: FileCheck %s --input-file=%s.rerun-1.log --check-prefix=CHECK-RERUN1
+# RUN: FileCheck %s --input-file=%s.rerun-2.log --check-prefix=CHECK-RERUN2
 
 # CHECK-FIRST: FAIL: filter-failed-rerun :: fail.txt
 

>From 1fc829c28db2767a07ac5e92cdac9b254aa01ff5 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Tue, 16 Sep 2025 12:14:53 +0100
Subject: [PATCH 10/18] fixup! use temporary directory for input manipulation

---
 .../Inputs/filter-failed-delete/fail.txt      |  1 -
 .../tests/Inputs/filter-failed-delete/lit.cfg |  7 ------
 .../Inputs/filter-failed-delete/pass.txt      |  1 -
 .../filter-failed-delete/unresolved.txt       |  0
 .../tests/Inputs/filter-failed-rerun/fail.txt |  1 -
 .../tests/Inputs/filter-failed-rerun/lit.cfg  |  7 ------
 .../tests/Inputs/filter-failed-rerun/pass.txt |  1 -
 .../Inputs/filter-failed-rerun/xpass.txt      |  2 --
 llvm/utils/lit/tests/filter-failed-delete.py  | 14 ++++++------
 llvm/utils/lit/tests/filter-failed-rerun.py   | 22 +++++++++----------
 llvm/utils/lit/tests/filter-failed.py         | 12 +++++-----
 11 files changed, 23 insertions(+), 45 deletions(-)
 delete mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-delete/fail.txt
 delete mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-delete/lit.cfg
 delete mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-delete/pass.txt
 delete mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-delete/unresolved.txt
 delete mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-rerun/fail.txt
 delete mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-rerun/lit.cfg
 delete mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-rerun/pass.txt
 delete mode 100644 llvm/utils/lit/tests/Inputs/filter-failed-rerun/xpass.txt

diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-delete/fail.txt b/llvm/utils/lit/tests/Inputs/filter-failed-delete/fail.txt
deleted file mode 100644
index 15eb81a5f5e95..0000000000000
--- a/llvm/utils/lit/tests/Inputs/filter-failed-delete/fail.txt
+++ /dev/null
@@ -1 +0,0 @@
-RUN: false
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-delete/lit.cfg b/llvm/utils/lit/tests/Inputs/filter-failed-delete/lit.cfg
deleted file mode 100644
index 6c6dfa8e184c3..0000000000000
--- a/llvm/utils/lit/tests/Inputs/filter-failed-delete/lit.cfg
+++ /dev/null
@@ -1,7 +0,0 @@
-import lit.formats
-
-config.name = "filter-failed-delete"
-config.suffixes = [".txt"]
-config.test_format = lit.formats.ShTest()
-config.test_source_root = None
-config.test_exec_root = None
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-delete/pass.txt b/llvm/utils/lit/tests/Inputs/filter-failed-delete/pass.txt
deleted file mode 100644
index 18efe9e49e95b..0000000000000
--- a/llvm/utils/lit/tests/Inputs/filter-failed-delete/pass.txt
+++ /dev/null
@@ -1 +0,0 @@
-RUN: true
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-delete/unresolved.txt b/llvm/utils/lit/tests/Inputs/filter-failed-delete/unresolved.txt
deleted file mode 100644
index e69de29bb2d1d..0000000000000
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/fail.txt b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/fail.txt
deleted file mode 100644
index 15eb81a5f5e95..0000000000000
--- a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/fail.txt
+++ /dev/null
@@ -1 +0,0 @@
-RUN: false
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/lit.cfg b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/lit.cfg
deleted file mode 100644
index 25b79c4a368f0..0000000000000
--- a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/lit.cfg
+++ /dev/null
@@ -1,7 +0,0 @@
-import lit.formats
-
-config.name = "filter-failed-rerun"
-config.suffixes = [".txt"]
-config.test_format = lit.formats.ShTest()
-config.test_source_root = None
-config.test_exec_root = None
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/pass.txt b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/pass.txt
deleted file mode 100644
index 18efe9e49e95b..0000000000000
--- a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/pass.txt
+++ /dev/null
@@ -1 +0,0 @@
-RUN: true
diff --git a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/xpass.txt b/llvm/utils/lit/tests/Inputs/filter-failed-rerun/xpass.txt
deleted file mode 100644
index 66b8a6a5a187c..0000000000000
--- a/llvm/utils/lit/tests/Inputs/filter-failed-rerun/xpass.txt
+++ /dev/null
@@ -1,2 +0,0 @@
-RUN: true
-XFAIL: *
diff --git a/llvm/utils/lit/tests/filter-failed-delete.py b/llvm/utils/lit/tests/filter-failed-delete.py
index 8bad37f4c7a62..e500df14a843a 100644
--- a/llvm/utils/lit/tests/filter-failed-delete.py
+++ b/llvm/utils/lit/tests/filter-failed-delete.py
@@ -1,14 +1,14 @@
 # Shows behaviour when a previously failed test was deleted
 # before running with --filter-failed.
 
-# RUN: not %{lit} %{inputs}/filter-failed-delete | FileCheck %s --check-prefix=CHECK-FIRST
+# RUN: rm -rf %t
+# RUN: cp -r %{inputs}/filter-failed %t
 #
-# RUN: mv %{inputs}/filter-failed-delete/fail.txt %{inputs}/filter-failed-delete/fail.txt.bk
-# RUN: not %{lit} --filter-failed %{inputs}/filter-failed-delete > %s.rerun.log
-# RUN: mv %{inputs}/filter-failed-delete/fail.txt.bk %{inputs}/filter-failed-delete/fail.txt
+# RUN: not %{lit} %t | FileCheck %s --check-prefix=CHECK-FIRST
 #
-# RUN: FileCheck %s --input-file=%s.rerun.log --check-prefix=CHECK-RERUN
+# RUN: rm %t/fail.txt
+# RUN: not %{lit} --filter-failed %t | FileCheck %s --check-prefix=CHECK-RERUN
 
-# CHECK-FIRST: FAIL: filter-failed-delete :: fail.txt
+# CHECK-FIRST: FAIL: filter-failed :: fail.txt
 
-# CHECK-RERUN-NOT: filter-failed-delete :: fail.txt
+# CHECK-RERUN-NOT: filter-failed :: fail.txt
diff --git a/llvm/utils/lit/tests/filter-failed-rerun.py b/llvm/utils/lit/tests/filter-failed-rerun.py
index 9f46b87591eb7..2133a75524ac3 100644
--- a/llvm/utils/lit/tests/filter-failed-rerun.py
+++ b/llvm/utils/lit/tests/filter-failed-rerun.py
@@ -1,20 +1,18 @@
 # Checks that --filter-failed won't re-run tests that have passed
 # since the last time --filter-failed has run.
 
-# RUN: not %{lit} %{inputs}/filter-failed-rerun | FileCheck %s --check-prefix=CHECK-FIRST
+# RUN: rm -rf %t
+# RUN: cp -r %{inputs}/filter-failed %t
 #
-# RUN: mv %{inputs}/filter-failed-rerun/fail.txt %{inputs}/filter-failed-rerun/fail.txt.bk
-# RUN: cp %{inputs}/filter-failed-rerun/pass.txt %{inputs}/filter-failed-rerun/fail.txt
-# RUN: not %{lit} %{inputs}/filter-failed-rerun > %s.rerun-1.log
-# RUN: not %{lit} --filter-failed %{inputs}/filter-failed-rerun > %s.rerun-2.log
-# RUN: mv %{inputs}/filter-failed-rerun/fail.txt.bk %{inputs}/filter-failed-rerun/fail.txt
+# RUN: not %{lit} %t | FileCheck %s --check-prefix=CHECK-FIRST
 #
-# RUN: FileCheck %s --input-file=%s.rerun-1.log --check-prefix=CHECK-RERUN1
-# RUN: FileCheck %s --input-file=%s.rerun-2.log --check-prefix=CHECK-RERUN2
+# RUN: cp %t/pass.txt %t/fail.txt
+# RUN: not %{lit} %t | FileCheck %s --check-prefix=CHECK-RERUN1
+# RUN: not %{lit} --filter-failed %t | FileCheck %s --check-prefix=CHECK-RERUN2
 
-# CHECK-FIRST: FAIL: filter-failed-rerun :: fail.txt
+# CHECK-FIRST: FAIL: filter-failed :: fail.txt
 
-# CHECK-RERUN1: PASS: filter-failed-rerun :: fail.txt
+# CHECK-RERUN1: PASS: filter-failed :: fail.txt
 
-# CHECK-RERUN2: Testing: 1 of 3 tests
-# CHECK-RERUN2-NOT: filter-failed-rerun :: fail.txt
+# CHECK-RERUN2: Testing: 2 of 5 tests
+# CHECK-RERUN2-NOT: filter-failed :: fail.txt
diff --git a/llvm/utils/lit/tests/filter-failed.py b/llvm/utils/lit/tests/filter-failed.py
index 76c529f5b54ef..f3c2bc068fc9e 100644
--- a/llvm/utils/lit/tests/filter-failed.py
+++ b/llvm/utils/lit/tests/filter-failed.py
@@ -1,14 +1,14 @@
 # Checks that --filter-failed only runs tests that previously failed.
 
-# RUN: not %{lit} %{inputs}/filter-failed
+# RUN: rm -rf %t
+# RUN: cp -r %{inputs}/filter-failed %t
 #
-# RUN: rm -f %{inputs}/filter-failed/new-fail.txt
-# RUN: echo "RUN: false" > %{inputs}/filter-failed/new-fail.txt
+# RUN: not %{lit} %t
 #
-# RUN: rm -f %{inputs}/filter-failed/new-pass.txt
-# RUN: echo "RUN: true" > %{inputs}/filter-failed/new-pass.txt
+# RUN: echo "RUN: false" > %t/new-fail.txt
+# RUN: echo "RUN: true"  > %t/new-pass.txt
 #
-# RUN: not %{lit} --filter-failed %{inputs}/filter-failed | FileCheck %s
+# RUN: not %{lit} --filter-failed %t | FileCheck %s
 
 # CHECK: Testing: 3 of 7 tests
 # CHECK-DAG: FAIL: filter-failed :: fail.txt

>From ab20e548fa5c3bcdd7d3bc6f44f9db9b76d6d21a Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 19 Sep 2025 07:58:37 +0100
Subject: [PATCH 11/18] fixup! typo; check that test-suite ran in test

---
 llvm/utils/lit/tests/filter-failed-delete.py | 6 ++++--
 llvm/utils/lit/tests/filter-failed-rerun.py  | 2 +-
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/llvm/utils/lit/tests/filter-failed-delete.py b/llvm/utils/lit/tests/filter-failed-delete.py
index e500df14a843a..6b697a03d65ce 100644
--- a/llvm/utils/lit/tests/filter-failed-delete.py
+++ b/llvm/utils/lit/tests/filter-failed-delete.py
@@ -7,8 +7,10 @@
 # RUN: not %{lit} %t | FileCheck %s --check-prefix=CHECK-FIRST
 #
 # RUN: rm %t/fail.txt
-# RUN: not %{lit} --filter-failed %t | FileCheck %s --check-prefix=CHECK-RERUN
+# RUN: not %{lit} --filter-failed %t | FileCheck %s --check-prefix=CHECK-SECOND
 
+# CHECK-FIRST: Testing: 5 tests
 # CHECK-FIRST: FAIL: filter-failed :: fail.txt
 
-# CHECK-RERUN-NOT: filter-failed :: fail.txt
+# CHECK-SECOND: Testing: 2 of 4 tests
+# CHECK-SECOND-NOT: filter-failed :: fail.txt
diff --git a/llvm/utils/lit/tests/filter-failed-rerun.py b/llvm/utils/lit/tests/filter-failed-rerun.py
index 2133a75524ac3..ab8b762abebd8 100644
--- a/llvm/utils/lit/tests/filter-failed-rerun.py
+++ b/llvm/utils/lit/tests/filter-failed-rerun.py
@@ -1,5 +1,5 @@
 # Checks that --filter-failed won't re-run tests that have passed
-# since the last time --filter-failed has run.
+# since the last time --filter-failed was run.
 
 # RUN: rm -rf %t
 # RUN: cp -r %{inputs}/filter-failed %t

>From 31404ed16ef103342936c8cc089c7ec4ba5f61d7 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 19 Sep 2025 07:59:32 +0100
Subject: [PATCH 12/18] fixup! rename CHECK-RERUN directives

---
 llvm/utils/lit/tests/filter-failed-rerun.py | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/llvm/utils/lit/tests/filter-failed-rerun.py b/llvm/utils/lit/tests/filter-failed-rerun.py
index ab8b762abebd8..a0c3368d448b8 100644
--- a/llvm/utils/lit/tests/filter-failed-rerun.py
+++ b/llvm/utils/lit/tests/filter-failed-rerun.py
@@ -7,12 +7,12 @@
 # RUN: not %{lit} %t | FileCheck %s --check-prefix=CHECK-FIRST
 #
 # RUN: cp %t/pass.txt %t/fail.txt
-# RUN: not %{lit} %t | FileCheck %s --check-prefix=CHECK-RERUN1
-# RUN: not %{lit} --filter-failed %t | FileCheck %s --check-prefix=CHECK-RERUN2
+# RUN: not %{lit} %t | FileCheck %s --check-prefix=CHECK-SECOND
+# RUN: not %{lit} --filter-failed %t | FileCheck %s --check-prefix=CHECK-THIRD
 
 # CHECK-FIRST: FAIL: filter-failed :: fail.txt
 
-# CHECK-RERUN1: PASS: filter-failed :: fail.txt
+# CHECK-SECOND: PASS: filter-failed :: fail.txt
 
-# CHECK-RERUN2: Testing: 2 of 5 tests
-# CHECK-RERUN2-NOT: filter-failed :: fail.txt
+# CHECK-THIRD: Testing: 2 of 5 tests
+# CHECK-THIRD-NOT: filter-failed :: fail.txt

>From 64bddee42ef77961b032704c6c8c632413099638 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 19 Sep 2025 10:03:33 +0100
Subject: [PATCH 13/18] fixup! use %{fs-sep}

---
 llvm/utils/lit/tests/filter-failed-rerun.py | 4 ++--
 llvm/utils/lit/tests/filter-failed.py       | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/utils/lit/tests/filter-failed-rerun.py b/llvm/utils/lit/tests/filter-failed-rerun.py
index a0c3368d448b8..7db12c26a02ff 100644
--- a/llvm/utils/lit/tests/filter-failed-rerun.py
+++ b/llvm/utils/lit/tests/filter-failed-rerun.py
@@ -2,11 +2,11 @@
 # since the last time --filter-failed was run.
 
 # RUN: rm -rf %t
-# RUN: cp -r %{inputs}/filter-failed %t
+# RUN: cp -r %{inputs}%{fs-sep}filter-failed %t
 #
 # RUN: not %{lit} %t | FileCheck %s --check-prefix=CHECK-FIRST
 #
-# RUN: cp %t/pass.txt %t/fail.txt
+# RUN: cp %t%{fs-sep}pass.txt %t%{fs-sep}fail.txt
 # RUN: not %{lit} %t | FileCheck %s --check-prefix=CHECK-SECOND
 # RUN: not %{lit} --filter-failed %t | FileCheck %s --check-prefix=CHECK-THIRD
 
diff --git a/llvm/utils/lit/tests/filter-failed.py b/llvm/utils/lit/tests/filter-failed.py
index f3c2bc068fc9e..457e53cd28336 100644
--- a/llvm/utils/lit/tests/filter-failed.py
+++ b/llvm/utils/lit/tests/filter-failed.py
@@ -5,8 +5,8 @@
 #
 # RUN: not %{lit} %t
 #
-# RUN: echo "RUN: false" > %t/new-fail.txt
-# RUN: echo "RUN: true"  > %t/new-pass.txt
+# RUN: echo "RUN: false" > %t%{fs-sep}new-fail.txt
+# RUN: echo "RUN: true"  > %t%{fs-sep}new-pass.txt
 #
 # RUN: not %{lit} --filter-failed %t | FileCheck %s
 

>From e644c2795e38d9c9ef56685e5f2c40c0f0a24850 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 19 Sep 2025 16:14:42 +0100
Subject: [PATCH 14/18] fixup! more path separator fixes

---
 llvm/utils/lit/tests/filter-failed-delete.py | 4 ++--
 llvm/utils/lit/tests/filter-failed.py        | 2 +-
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/utils/lit/tests/filter-failed-delete.py b/llvm/utils/lit/tests/filter-failed-delete.py
index 6b697a03d65ce..68bb840425ea3 100644
--- a/llvm/utils/lit/tests/filter-failed-delete.py
+++ b/llvm/utils/lit/tests/filter-failed-delete.py
@@ -2,11 +2,11 @@
 # before running with --filter-failed.
 
 # RUN: rm -rf %t
-# RUN: cp -r %{inputs}/filter-failed %t
+# RUN: cp -r %{inputs}%{fs-sep}filter-failed %t
 #
 # RUN: not %{lit} %t | FileCheck %s --check-prefix=CHECK-FIRST
 #
-# RUN: rm %t/fail.txt
+# RUN: rm %t%{fs-sep}fail.txt
 # RUN: not %{lit} --filter-failed %t | FileCheck %s --check-prefix=CHECK-SECOND
 
 # CHECK-FIRST: Testing: 5 tests
diff --git a/llvm/utils/lit/tests/filter-failed.py b/llvm/utils/lit/tests/filter-failed.py
index 457e53cd28336..3c1c6fe010077 100644
--- a/llvm/utils/lit/tests/filter-failed.py
+++ b/llvm/utils/lit/tests/filter-failed.py
@@ -1,7 +1,7 @@
 # Checks that --filter-failed only runs tests that previously failed.
 
 # RUN: rm -rf %t
-# RUN: cp -r %{inputs}/filter-failed %t
+# RUN: cp -r %{inputs}%{fs-sep}filter-failed %t
 #
 # RUN: not %{lit} %t
 #

>From cf03a8a99a2799fc10141e1ffb3564ccdb227061 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Mon, 22 Sep 2025 08:50:59 +0100
Subject: [PATCH 15/18] fixup! try modified unresolved.txt

---
 llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt b/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
index e69de29bb2d1d..9e19a3339a813 100644
--- a/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
+++ b/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
@@ -0,0 +1 @@
+# XFAIL: something-invalid

>From 1c7604685af1f1eb67c12c868c82f11c677e9b9a Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Mon, 22 Sep 2025 09:37:44 +0100
Subject: [PATCH 16/18] fixup! try modified unresolved.txt

---
 llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt | 1 +
 1 file changed, 1 insertion(+)

diff --git a/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt b/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
index 9e19a3339a813..e6331c1019fac 100644
--- a/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
+++ b/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
@@ -1 +1,2 @@
+# RUN: echo test
 # XFAIL: something-invalid

>From c4116c3333b2161cc5bcc800af635eb288cbe1e1 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Mon, 22 Sep 2025 09:41:26 +0100
Subject: [PATCH 17/18] fixup! try modified unresolved.txt

---
 llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt | 2 --
 1 file changed, 2 deletions(-)

diff --git a/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt b/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
index e6331c1019fac..e69de29bb2d1d 100644
--- a/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
+++ b/llvm/utils/lit/tests/Inputs/filter-failed/unresolved.txt
@@ -1,2 +0,0 @@
-# RUN: echo test
-# XFAIL: something-invalid

>From a6cabb6e38fec1e54acc64ec111cd974b7537967 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Wed, 10 Dec 2025 08:59:31 +0000
Subject: [PATCH 18/18] fixup! if test failed in 0 seconds, still set a
 negative time value

---
 llvm/utils/lit/lit/TestTimes.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/llvm/utils/lit/lit/TestTimes.py b/llvm/utils/lit/lit/TestTimes.py
index a2c0e0527b84b..0c18e3e015828 100644
--- a/llvm/utils/lit/lit/TestTimes.py
+++ b/llvm/utils/lit/lit/TestTimes.py
@@ -22,7 +22,7 @@ def record_test_times(tests, lit_config):
             continue
         if not t.suite.exec_root in times_by_suite:
             times_by_suite[t.suite.exec_root] = read_test_times(t.suite)
-        time = -t.result.elapsed if t.isFailure() else t.result.elapsed
+        time = min(-t.result.elapsed, -1.0e-6) if t.isFailure() else t.result.elapsed
         # The "path" here is only used as a key into a dictionary. It is never
         # used as an actual path to a filesystem API, therefore we use '/' as
         # the canonical separator so that Unix and Windows machines can share



More information about the llvm-commits mailing list