test_dataflow.py 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import unittest
  2. from src.statement import Statement as S
  3. from src.dataflow import BasicBlock as B, find_leaders, find_basic_blocks, \
  4. generate_flow_graph, Dag, DagNode, DagLeaf
  5. class TestDataflow(unittest.TestCase):
  6. def setUp(self):
  7. add = S('command', 'add', '$1', '$2', '$3')
  8. self.statements = [add, S('command', 'j', 'foo'), add, add, \
  9. S('label', 'foo')]
  10. def tearDown(self):
  11. del self.statements
  12. def test_find_leaders(self):
  13. self.assertEqual(find_leaders(self.statements), [0, 2, 4])
  14. def test_find_basic_blocks(self):
  15. s = self.statements
  16. self.assertEqual(map(lambda b: b.statements, find_basic_blocks(s)), \
  17. [B(s[:2]).statements, B(s[2:4]).statements, \
  18. B(s[4:]).statements])
  19. def test_generate_flow_graph_simple(self):
  20. b1 = B([S('command', 'foo'), S('command', 'j', 'b2')])
  21. b2 = B([S('label', 'b2'), S('command', 'bar')])
  22. generate_flow_graph([b1, b2])
  23. self.assertEqual(b1.edges_to, [b2])
  24. self.assertEqual(b2.edges_from, [b1])
  25. def test_generate_flow_graph_branch(self):
  26. b1 = B([S('command', 'foo'), S('command', 'beq', '$1', '$2', 'b3')])
  27. b2 = B([S('command', 'bar')])
  28. b3 = B([S('label', 'b3'), S('command', 'baz')])
  29. generate_flow_graph([b1, b2, b3])
  30. self.assertIn(b2, b1.edges_to)
  31. self.assertIn(b3, b1.edges_to)
  32. self.assertEqual(b2.edges_from, [b1])
  33. self.assertEqual(b2.edges_to, [b3])
  34. self.assertIn(b1, b3.edges_from)
  35. self.assertIn(b2, b3.edges_from)
  36. def test_dag_unary(self):
  37. dag = Dag(B([S('command', 'neg.d', '$rd', '$rs')]))
  38. expect = Dag([])
  39. expect.nodes = [DagLeaf('$rs'), DagNode('neg.d', '$rd', \
  40. DagLeaf('$rs'))]
  41. self.assertEqualDag(dag, expect)
  42. def test_dag_binary(self):
  43. dag = Dag(B([S('command', 'addu', '$rd', '$r1', '$r2')]))
  44. expect = Dag([])
  45. expect.nodes = [DagLeaf('$r1'),
  46. DagLeaf('$r2'),
  47. DagNode('addu', '$rd', DagLeaf('$r1'), DagLeaf('$r2'))]
  48. self.assertEqualDag(dag, expect)
  49. # def test_dag_combinednode(self):
  50. # dag = Dag(B([S('command', 'mult', '$rd1', '$r1', '$r2'),
  51. # S('command', 'mult', '$rd2', '$r1', '$r2')]))
  52. # expect = Dag([])
  53. # multnode = DagNode('mult',
  54. # DagLeaf('$r1'),
  55. # DagLeaf('$r2'))
  56. # multnode.labels = ['$rd1', '$rd2']
  57. # expect.nodes = [DagLeaf('$r1'),
  58. # DagLeaf('$r2'),
  59. # multnode]
  60. #
  61. # self.assertEqualDag(dag, expect)
  62. def assertEqualDag(self, dag1, dag2):
  63. self.assertEqual(len(dag1.nodes), len(dag2.nodes))
  64. for node1, node2 in zip(dag1.nodes, dag2.nodes):
  65. self.assertEqualNodes(node1, node2)
  66. def assertEqualNodes(self, node1, node2):
  67. if isinstance(node1, DagLeaf):
  68. self.assertIsInstance(node2, DagLeaf)
  69. self.assertEqual(node1.reg, node2.reg)
  70. elif isinstance(node2, DagLeaf):
  71. raise AssertionError
  72. else:
  73. self.assertEqual(node1.op, node2.op)
  74. self.assertEqual(node1.labels, node2.labels)
  75. self.assertEqual(len(node1.nodes), len(node2.nodes))
  76. for child1, child2 in zip(node1.nodes, node2.nodes):
  77. self.assertEqualNodes(child1, child2)