xref: /llvm-project/llvm/utils/reduce_pipeline_test/test.py (revision b71edfaa4ec3c998aadb35255ce2f60bba2940b0)
191d15aa0SMarkus Lavin#!/usr/bin/env python3
291d15aa0SMarkus Lavin
391d15aa0SMarkus Lavin# Automatically formatted with yapf (https://github.com/google/yapf)
491d15aa0SMarkus Lavin
591d15aa0SMarkus Lavinimport subprocess
691d15aa0SMarkus Lavinimport unittest
791d15aa0SMarkus Lavin
891d15aa0SMarkus Lavin
991d15aa0SMarkus Lavindef getFinalPasses(run):
1091d15aa0SMarkus Lavin    stdout = run.stdout.decode()
11*b71edfaaSTobias Hieta    stdout = stdout[: stdout.rfind("\n")]
12*b71edfaaSTobias Hieta    stdout = stdout[stdout.rfind("\n") + 1 :]
1391d15aa0SMarkus Lavin    return stdout
1491d15aa0SMarkus Lavin
1591d15aa0SMarkus Lavin
1691d15aa0SMarkus Lavinclass Test(unittest.TestCase):
1791d15aa0SMarkus Lavin    def test_0(self):
1891d15aa0SMarkus Lavin        """Test all passes are removed except those required to crash. Verify
1991d15aa0SMarkus Lavin        that PM structure is intact."""
2091d15aa0SMarkus Lavin        run_args = [
21*b71edfaaSTobias Hieta            "./utils/reduce_pipeline.py",
22*b71edfaaSTobias Hieta            "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py",
23*b71edfaaSTobias Hieta            "--input=/dev/null",
24*b71edfaaSTobias Hieta            "--passes=a,b,c,A(d,B(e,f),g),h,i",
25*b71edfaaSTobias Hieta            "-crash-seq=b,d,f",
2691d15aa0SMarkus Lavin        ]
27*b71edfaaSTobias Hieta        run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
2891d15aa0SMarkus Lavin        self.assertEqual(run.returncode, 0)
2991d15aa0SMarkus Lavin        self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B(f))"')
3091d15aa0SMarkus Lavin
3191d15aa0SMarkus Lavin    def test_1(self):
3291d15aa0SMarkus Lavin        """Test all passes are removed except those required to crash. The
3391d15aa0SMarkus Lavin        required passes in this case are the first and last in that order
3491d15aa0SMarkus Lavin        (a bit of a corner-case for the reduction algorithm)."""
3591d15aa0SMarkus Lavin        run_args = [
36*b71edfaaSTobias Hieta            "./utils/reduce_pipeline.py",
37*b71edfaaSTobias Hieta            "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py",
38*b71edfaaSTobias Hieta            "--input=/dev/null",
39*b71edfaaSTobias Hieta            "--passes=a,b,c,A(d,B(e,f),g),h,i",
40*b71edfaaSTobias Hieta            "-crash-seq=a,i",
4191d15aa0SMarkus Lavin        ]
42*b71edfaaSTobias Hieta        run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
4391d15aa0SMarkus Lavin        self.assertEqual(run.returncode, 0)
4491d15aa0SMarkus Lavin        self.assertEqual(getFinalPasses(run), '-passes="a,i"')
4591d15aa0SMarkus Lavin
467e34d5eaSMarkus Lavin    def test_2_0(self):
477e34d5eaSMarkus Lavin        """Test expansion of EXPAND_a_to_f (expands into 'a,b,c,d,e,f')."""
4891d15aa0SMarkus Lavin        run_args = [
49*b71edfaaSTobias Hieta            "./utils/reduce_pipeline.py",
50*b71edfaaSTobias Hieta            "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py",
51*b71edfaaSTobias Hieta            "--input=/dev/null",
52*b71edfaaSTobias Hieta            "--passes=EXPAND_a_to_f",
53*b71edfaaSTobias Hieta            "-crash-seq=b,e",
5491d15aa0SMarkus Lavin        ]
55*b71edfaaSTobias Hieta        run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
5691d15aa0SMarkus Lavin        self.assertEqual(run.returncode, 0)
577e34d5eaSMarkus Lavin        self.assertEqual(getFinalPasses(run), '-passes="b,e"')
587e34d5eaSMarkus Lavin
597e34d5eaSMarkus Lavin    def test_2_1(self):
607e34d5eaSMarkus Lavin        """Test EXPAND_a_to_f and the '--dont-expand-passes' option."""
617e34d5eaSMarkus Lavin        run_args = [
62*b71edfaaSTobias Hieta            "./utils/reduce_pipeline.py",
63*b71edfaaSTobias Hieta            "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py",
64*b71edfaaSTobias Hieta            "--input=/dev/null",
65*b71edfaaSTobias Hieta            "--passes=EXPAND_a_to_f",
66*b71edfaaSTobias Hieta            "-crash-seq=EXPAND_a_to_f",
67*b71edfaaSTobias Hieta            "--dont-expand-passes",
687e34d5eaSMarkus Lavin        ]
69*b71edfaaSTobias Hieta        run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
707e34d5eaSMarkus Lavin        self.assertEqual(run.returncode, 0)
717e34d5eaSMarkus Lavin        self.assertEqual(getFinalPasses(run), '-passes="EXPAND_a_to_f"')
7291d15aa0SMarkus Lavin
7391d15aa0SMarkus Lavin    def test_3(self):
7491d15aa0SMarkus Lavin        """Test that empty pass-managers get removed by default."""
7591d15aa0SMarkus Lavin        run_args = [
76*b71edfaaSTobias Hieta            "./utils/reduce_pipeline.py",
77*b71edfaaSTobias Hieta            "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py",
78*b71edfaaSTobias Hieta            "--input=/dev/null",
79*b71edfaaSTobias Hieta            "--passes=a,b,c,A(d,B(e,f),g),h,i",
80*b71edfaaSTobias Hieta            "-crash-seq=b,d,h",
8191d15aa0SMarkus Lavin        ]
82*b71edfaaSTobias Hieta        run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
8391d15aa0SMarkus Lavin        self.assertEqual(run.returncode, 0)
8491d15aa0SMarkus Lavin        self.assertEqual(getFinalPasses(run), '-passes="b,A(d),h"')
8591d15aa0SMarkus Lavin
8691d15aa0SMarkus Lavin    def test_4(self):
8791d15aa0SMarkus Lavin        """Test the '--dont-remove-empty-pm' option."""
8891d15aa0SMarkus Lavin        run_args = [
89*b71edfaaSTobias Hieta            "./utils/reduce_pipeline.py",
90*b71edfaaSTobias Hieta            "--opt-binary=./utils/reduce_pipeline_test/fake_opt.py",
91*b71edfaaSTobias Hieta            "--input=/dev/null",
92*b71edfaaSTobias Hieta            "--passes=a,b,c,A(d,B(e,f),g),h,i",
93*b71edfaaSTobias Hieta            "-crash-seq=b,d,h",
94*b71edfaaSTobias Hieta            "--dont-remove-empty-pm",
9591d15aa0SMarkus Lavin        ]
96*b71edfaaSTobias Hieta        run = subprocess.run(run_args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
9791d15aa0SMarkus Lavin        self.assertEqual(run.returncode, 0)
9891d15aa0SMarkus Lavin        self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B()),h"')
9991d15aa0SMarkus Lavin
10091d15aa0SMarkus Lavin
10191d15aa0SMarkus Lavinunittest.main()
10291d15aa0SMarkus Lavinexit(0)
103