File: test_xform.py

package info (click to toggle)
firefox-esr 68.10.0esr-1~deb9u1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 3,143,932 kB
  • sloc: cpp: 5,227,879; javascript: 4,315,531; ansic: 2,467,042; python: 794,975; java: 349,993; asm: 232,034; xml: 228,320; sh: 82,008; lisp: 41,202; makefile: 22,347; perl: 15,555; objc: 5,277; cs: 4,725; yacc: 1,778; ada: 1,681; pascal: 1,673; lex: 1,417; exp: 527; php: 436; ruby: 225; awk: 162; sed: 53; csh: 44
file content (131 lines) | stat: -rw-r--r-- 4,061 bytes parent folder | download | duplicates (2)
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
from __future__ import absolute_import
from unittest import TestCase
from doctest import DocTestSuite
from base.instructions import iadd, iadd_imm, iconst, icmp
from base.immediates import intcc
from . import xform
from .ast import Var
from .xform import Rtl, XForm


def load_tests(loader, tests, ignore):
    tests.addTests(DocTestSuite(xform))
    return tests


x = Var('x')
y = Var('y')
z = Var('z')
u = Var('u')
a = Var('a')
b = Var('b')
c = Var('c')

CC1 = Var('CC1')
CC2 = Var('CC2')


class TestXForm(TestCase):
    def test_macro_pattern(self):
        src = Rtl(a << iadd_imm(x, y))
        dst = Rtl(
                c << iconst(y),
                a << iadd(x, c))
        XForm(src, dst)

    def test_def_input(self):
        # Src pattern has a def which is an input in dst.
        src = Rtl(a << iadd_imm(x, 1))
        dst = Rtl(y << iadd_imm(a, 1))
        with self.assertRaisesRegexp(
                AssertionError,
                "'a' used as both input and def"):
            XForm(src, dst)

    def test_input_def(self):
        # Converse of the above.
        src = Rtl(y << iadd_imm(a, 1))
        dst = Rtl(a << iadd_imm(x, 1))
        with self.assertRaisesRegexp(
                AssertionError,
                "'a' used as both input and def"):
            XForm(src, dst)

    def test_extra_input(self):
        src = Rtl(a << iadd_imm(x, 1))
        dst = Rtl(a << iadd(x, y))
        with self.assertRaisesRegexp(AssertionError, "extra inputs in dst"):
            XForm(src, dst)

    def test_double_def(self):
        src = Rtl(
                a << iadd_imm(x, 1),
                a << iadd(x, y))
        dst = Rtl(a << iadd(x, y))
        with self.assertRaisesRegexp(AssertionError, "'a' multiply defined"):
            XForm(src, dst)

    def test_subst_imm(self):
        src = Rtl(a << iconst(x))
        dst = Rtl(c << iconst(y))
        assert src.substitution(dst, {}) == {a: c, x: y}

    def test_subst_enum_var(self):
        src = Rtl(a << icmp(CC1, x, y))
        dst = Rtl(b << icmp(CC2, z, u))
        assert src.substitution(dst, {}) == {a: b, CC1: CC2, x: z, y: u}

    def test_subst_enum_const(self):
        src = Rtl(a << icmp(intcc.eq, x, y))
        dst = Rtl(b << icmp(intcc.eq, z, u))
        assert src.substitution(dst, {}) == {a: b, x: z, y: u}

    def test_subst_enum_var_const(self):
        src = Rtl(a << icmp(CC1, x, y))
        dst = Rtl(b << icmp(intcc.eq, z, u))
        assert src.substitution(dst, {}) == {CC1: intcc.eq, x: z, y: u, a: b},\
            "{} != {}".format(src.substitution(dst, {}),
                              {CC1: intcc.eq, x: z, y: u, a: b})

        src = Rtl(a << icmp(intcc.eq, x, y))
        dst = Rtl(b << icmp(CC1, z, u))
        assert src.substitution(dst, {}) == {CC1: intcc.eq, x: z, y: u, a: b}

    def test_subst_enum_bad(self):
        src = Rtl(a << icmp(intcc.eq, x, y))
        dst = Rtl(b << icmp(intcc.sge, z, u))
        assert src.substitution(dst, {}) is None

    def test_subst_enum_bad_var_const(self):
        a1 = Var('a1')
        x1 = Var('x1')
        y1 = Var('y1')

        b1 = Var('b1')
        z1 = Var('z1')
        u1 = Var('u1')

        # Var mapping to 2 different constants
        src = Rtl(a << icmp(CC1, x, y),
                  a1 << icmp(CC1, x1, y1))
        dst = Rtl(b << icmp(intcc.eq, z, u),
                  b1 << icmp(intcc.sge, z1, u1))

        assert src.substitution(dst, {}) is None

        # 2 different constants mapping to the same var
        src = Rtl(a << icmp(intcc.eq, x, y),
                  a1 << icmp(intcc.sge, x1, y1))
        dst = Rtl(b << icmp(CC1, z, u),
                  b1 << icmp(CC1, z1, u1))

        assert src.substitution(dst, {}) is None

        # Var mapping to var and constant - note that full unification would
        # have allowed this.
        src = Rtl(a << icmp(CC1, x, y),
                  a1 << icmp(CC1, x1, y1))
        dst = Rtl(b << icmp(CC2, z, u),
                  b1 << icmp(intcc.sge, z1, u1))

        assert src.substitution(dst, {}) is None