summaryrefslogtreecommitdiff
path: root/test/unit/test_passes.py
blob: 2fe7f62633c2c2d9819082fcf2969af7fad790fc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import os
import re
import subprocess
from scripts.test import shared
from . import utils


class PassesTest(utils.BinaryenTestCase):
    # Given some arguments, return the passes that were run.
    def get_passes_run(self, args):
        os.environ['BINARYEN_PASS_DEBUG'] = '1'
        try:
            hello_wat = self.input_path('hello_world.wat')
            log = shared.run_process(shared.WASM_OPT + [hello_wat] + args,
                                     stderr=subprocess.PIPE).stderr
            print(log)
            passes = re.findall(r'running pass: ([\w-]+)\.\.\.', log)
            return passes
        finally:
            del os.environ['BINARYEN_PASS_DEBUG']

    def test_O2(self):
        args = ['-O2', '-all']
        for nominal in ['--nominal', False]:
            for closed_world in ['--closed-world', False]:
                curr_args = args[:]
                if nominal:
                    curr_args.append(nominal)
                if closed_world:
                    curr_args.append(closed_world)
                passes = self.get_passes_run(curr_args)

                # dce always runs
                self.assertIn('dce', passes)

                # some passes only run in closed world
                CLOSED_WORLD_PASSES = [
                    'type-refining',
                    'signature-pruning',
                    'signature-refining',
                    'gto',
                    'cfp',
                    'gsi',
                ]
                for pass_ in CLOSED_WORLD_PASSES:
                    if closed_world:
                        self.assertIn(pass_, passes)
                    else:
                        self.assertNotIn(pass_, passes)