- cdsl.ast defines classes representing abstract syntax trees. - cdsl.xform defines classes for instruction transformations. - base.legalize defines legalization patterns.
60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
from __future__ import absolute_import
|
|
from unittest import TestCase
|
|
from doctest import DocTestSuite
|
|
from base.instructions import iadd, iadd_imm, iconst
|
|
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')
|
|
a = Var('a')
|
|
c = Var('c')
|
|
|
|
|
|
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)
|