test_dataflow.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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_get_gen(self):
  20. # b1 = B([S('command', 'add', '$1', '$2', '$3'), \
  21. # S('command', 'add', '$2', '$3', '$4'), \
  22. # S('command', 'add', '$1', '$4', '$5')])
  23. #
  24. # self.assertEqual(b1.get_gen(), ['$1', '$2'])
  25. # def test_get_out(self):
  26. # b1 = B([S('command', 'add', '$1', '$2', '$3'), \
  27. # S('command', 'add', '$2', '$3', '$4'), \
  28. # S('command', 'add', '$1', '$4', '$5'), \
  29. # S('command', 'j', 'b2')])
  30. #
  31. # b2 = B([S('command', 'add', '$3', '$5', '$6'), \
  32. # S('command', 'add', '$1', '$2', '$3'), \
  33. # S('command', 'add', '$6', '$4', '$5')])
  34. #
  35. # blocks = [b1, b2]
  36. #
  37. # for block in blocks:
  38. # block.out_set = block.get_gen()
  39. # print 'block.out_set', block.out_set
  40. # generate_flow_graph(blocks)
  41. # print b1.get_gen()
  42. # print b2.get_gen()
  43. # print b2.get_out()
  44. def test_generate_flow_graph_simple(self):
  45. b1 = B([S('command', 'foo'), S('command', 'j', 'b2')])
  46. b2 = B([S('label', 'b2'), S('command', 'bar')])
  47. generate_flow_graph([b1, b2])
  48. self.assertEqual(b1.edges_to, [b2])
  49. self.assertEqual(b2.edges_from, [b1])
  50. def test_generate_flow_graph_branch(self):
  51. b1 = B([S('command', 'foo'), S('command', 'beq', '$1', '$2', 'b3')])
  52. b2 = B([S('command', 'bar')])
  53. b3 = B([S('label', 'b3'), S('command', 'baz')])
  54. generate_flow_graph([b1, b2, b3])
  55. self.assertIn(b2, b1.edges_to)
  56. self.assertIn(b3, b1.edges_to)
  57. self.assertEqual(b2.edges_from, [b1])
  58. self.assertEqual(b2.edges_to, [b3])
  59. self.assertIn(b1, b3.edges_from)
  60. self.assertIn(b2, b3.edges_from)
  61. def test_dag_unary(self):
  62. dag = Dag(B([S('command', 'neg.d', '$rd', '$rs')]))
  63. expect = Dag([])
  64. expect.nodes = [DagLeaf('$rs'), DagNode('neg.d', '$rd', \
  65. DagLeaf('$rs'))]
  66. self.assertEqualDag(dag, expect)
  67. def test_dag_binary(self):
  68. dag = Dag(B([S('command', 'addu', '$rd', '$r1', '$r2')]))
  69. expect = Dag([])
  70. expect.nodes = [DagLeaf('$r1'),
  71. DagLeaf('$r2'),
  72. DagNode('addu', '$rd', DagLeaf('$r1'), DagLeaf('$r2'))]
  73. self.assertEqualDag(dag, expect)
  74. # def test_dag_combinednode(self):
  75. # dag = Dag(B([S('command', 'mult', '$rd1', '$r1', '$r2'),
  76. # S('command', 'mult', '$rd2', '$r1', '$r2')]))
  77. # expect = Dag([])
  78. # multnode = DagNode('mult',
  79. # DagLeaf('$r1'),
  80. # DagLeaf('$r2'))
  81. # multnode.labels = ['$rd1', '$rd2']
  82. # expect.nodes = [DagLeaf('$r1'),
  83. # DagLeaf('$r2'),
  84. # multnode]
  85. #
  86. # self.assertEqualDag(dag, expect)
  87. def assertEqualDag(self, dag1, dag2):
  88. self.assertEqual(len(dag1.nodes), len(dag2.nodes))
  89. for node1, node2 in zip(dag1.nodes, dag2.nodes):
  90. self.assertEqualNodes(node1, node2)
  91. def assertEqualNodes(self, node1, node2):
  92. if isinstance(node1, DagLeaf):
  93. self.assertIsInstance(node2, DagLeaf)
  94. self.assertEqual(node1.reg, node2.reg)
  95. elif isinstance(node2, DagLeaf):
  96. raise AssertionError
  97. else:
  98. self.assertEqual(node1.op, node2.op)
  99. self.assertEqual(node1.labels, node2.labels)
  100. self.assertEqual(len(node1.nodes), len(node2.nodes))
  101. for child1, child2 in zip(node1.nodes, node2.nodes):
  102. self.assertEqualNodes(child1, child2)