xref: /openbsd-src/gnu/llvm/llvm/utils/reduce_pipeline_test/test.py (revision d415bd752c734aee168c4ee86ff32e8cc249eb16)
1*d415bd75Srobert#!/usr/bin/env python3
2*d415bd75Srobert
3*d415bd75Srobert# Automatically formatted with yapf (https://github.com/google/yapf)
4*d415bd75Srobert
5*d415bd75Srobertimport subprocess
6*d415bd75Srobertimport unittest
7*d415bd75Srobert
8*d415bd75Srobert
9*d415bd75Srobertdef getFinalPasses(run):
10*d415bd75Srobert    stdout = run.stdout.decode()
11*d415bd75Srobert    stdout = stdout[:stdout.rfind('\n')]
12*d415bd75Srobert    stdout = stdout[stdout.rfind('\n') + 1:]
13*d415bd75Srobert    return stdout
14*d415bd75Srobert
15*d415bd75Srobert
16*d415bd75Srobertclass Test(unittest.TestCase):
17*d415bd75Srobert    def test_0(self):
18*d415bd75Srobert        """Test all passes are removed except those required to crash. Verify
19*d415bd75Srobert           that PM structure is intact."""
20*d415bd75Srobert        run_args = [
21*d415bd75Srobert            './utils/reduce_pipeline.py',
22*d415bd75Srobert            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
23*d415bd75Srobert            '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i',
24*d415bd75Srobert            '-crash-seq=b,d,f'
25*d415bd75Srobert        ]
26*d415bd75Srobert        run = subprocess.run(run_args,
27*d415bd75Srobert                             stdout=subprocess.PIPE,
28*d415bd75Srobert                             stderr=subprocess.PIPE)
29*d415bd75Srobert        self.assertEqual(run.returncode, 0)
30*d415bd75Srobert        self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B(f))"')
31*d415bd75Srobert
32*d415bd75Srobert    def test_1(self):
33*d415bd75Srobert        """Test all passes are removed except those required to crash. The
34*d415bd75Srobert           required passes in this case are the first and last in that order
35*d415bd75Srobert           (a bit of a corner-case for the reduction algorithm)."""
36*d415bd75Srobert        run_args = [
37*d415bd75Srobert            './utils/reduce_pipeline.py',
38*d415bd75Srobert            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
39*d415bd75Srobert            '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i',
40*d415bd75Srobert            '-crash-seq=a,i'
41*d415bd75Srobert        ]
42*d415bd75Srobert        run = subprocess.run(run_args,
43*d415bd75Srobert                             stdout=subprocess.PIPE,
44*d415bd75Srobert                             stderr=subprocess.PIPE)
45*d415bd75Srobert        self.assertEqual(run.returncode, 0)
46*d415bd75Srobert        self.assertEqual(getFinalPasses(run), '-passes="a,i"')
47*d415bd75Srobert
48*d415bd75Srobert    def test_2_0(self):
49*d415bd75Srobert        """Test expansion of EXPAND_a_to_f (expands into 'a,b,c,d,e,f')."""
50*d415bd75Srobert        run_args = [
51*d415bd75Srobert            './utils/reduce_pipeline.py',
52*d415bd75Srobert            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
53*d415bd75Srobert            '--input=/dev/null', '--passes=EXPAND_a_to_f', '-crash-seq=b,e'
54*d415bd75Srobert        ]
55*d415bd75Srobert        run = subprocess.run(run_args,
56*d415bd75Srobert                             stdout=subprocess.PIPE,
57*d415bd75Srobert                             stderr=subprocess.PIPE)
58*d415bd75Srobert        self.assertEqual(run.returncode, 0)
59*d415bd75Srobert        self.assertEqual(getFinalPasses(run), '-passes="b,e"')
60*d415bd75Srobert
61*d415bd75Srobert    def test_2_1(self):
62*d415bd75Srobert        """Test EXPAND_a_to_f and the '--dont-expand-passes' option."""
63*d415bd75Srobert        run_args = [
64*d415bd75Srobert            './utils/reduce_pipeline.py',
65*d415bd75Srobert            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
66*d415bd75Srobert            '--input=/dev/null', '--passes=EXPAND_a_to_f',
67*d415bd75Srobert            '-crash-seq=EXPAND_a_to_f', '--dont-expand-passes'
68*d415bd75Srobert        ]
69*d415bd75Srobert        run = subprocess.run(run_args,
70*d415bd75Srobert                             stdout=subprocess.PIPE,
71*d415bd75Srobert                             stderr=subprocess.PIPE)
72*d415bd75Srobert        self.assertEqual(run.returncode, 0)
73*d415bd75Srobert        self.assertEqual(getFinalPasses(run), '-passes="EXPAND_a_to_f"')
74*d415bd75Srobert
75*d415bd75Srobert    def test_3(self):
76*d415bd75Srobert        """Test that empty pass-managers get removed by default."""
77*d415bd75Srobert        run_args = [
78*d415bd75Srobert            './utils/reduce_pipeline.py',
79*d415bd75Srobert            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
80*d415bd75Srobert            '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i',
81*d415bd75Srobert            '-crash-seq=b,d,h'
82*d415bd75Srobert        ]
83*d415bd75Srobert        run = subprocess.run(run_args,
84*d415bd75Srobert                             stdout=subprocess.PIPE,
85*d415bd75Srobert                             stderr=subprocess.PIPE)
86*d415bd75Srobert        self.assertEqual(run.returncode, 0)
87*d415bd75Srobert        self.assertEqual(getFinalPasses(run), '-passes="b,A(d),h"')
88*d415bd75Srobert
89*d415bd75Srobert    def test_4(self):
90*d415bd75Srobert        """Test the '--dont-remove-empty-pm' option."""
91*d415bd75Srobert        run_args = [
92*d415bd75Srobert            './utils/reduce_pipeline.py',
93*d415bd75Srobert            '--opt-binary=./utils/reduce_pipeline_test/fake_opt.py',
94*d415bd75Srobert            '--input=/dev/null', '--passes=a,b,c,A(d,B(e,f),g),h,i',
95*d415bd75Srobert            '-crash-seq=b,d,h', '--dont-remove-empty-pm'
96*d415bd75Srobert        ]
97*d415bd75Srobert        run = subprocess.run(run_args,
98*d415bd75Srobert                             stdout=subprocess.PIPE,
99*d415bd75Srobert                             stderr=subprocess.PIPE)
100*d415bd75Srobert        self.assertEqual(run.returncode, 0)
101*d415bd75Srobert        self.assertEqual(getFinalPasses(run), '-passes="b,A(d,B()),h"')
102*d415bd75Srobert
103*d415bd75Srobert
104*d415bd75Srobertunittest.main()
105*d415bd75Srobertexit(0)
106