test_dataflow.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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. # # initialize out[B] = gen[B] for every block
  38. # for block in blocks:
  39. # block.out_set = block.get_gen()
  40. # print 'block.out_set', block.out_set
  41. #
  42. # generate_flow_graph(blocks)
  43. # change = True
  44. # while change:
  45. # for i, block in enumerate(blocks):
  46. # block.get_in()
  47. # oldout = block.out_set
  48. # newout = block.get_out()
  49. # if (block.out_set == block.get_out()):
  50. # change = False
  51. def test_generate_flow_graph_simple(self):
  52. b1 = B([S('command', 'foo'), S('command', 'j', 'b2')])
  53. b2 = B([S('label', 'b2'), S('command', 'bar')])
  54. generate_flow_graph([b1, b2])
  55. self.assertEqual(b1.edges_to, [b2])
  56. self.assertEqual(b2.edges_from, [b1])
  57. def test_generate_flow_graph_branch(self):
  58. b1 = B([S('command', 'foo'), S('command', 'beq', '$1', '$2', 'b3')])
  59. b2 = B([S('command', 'bar')])
  60. b3 = B([S('label', 'b3'), S('command', 'baz')])
  61. generate_flow_graph([b1, b2, b3])
  62. self.assertIn(b2, b1.edges_to)
  63. self.assertIn(b3, b1.edges_to)
  64. self.assertEqual(b2.edges_from, [b1])
  65. self.assertEqual(b2.edges_to, [b3])
  66. self.assertIn(b1, b3.edges_from)
  67. self.assertIn(b2, b3.edges_from)
  68. def test_dag_unary(self):
  69. dag = Dag(B([S('command', 'neg.d', '$rd', '$rs')]))
  70. expect = Dag([])
  71. expect.nodes = [DagLeaf('$rs'), DagNode('neg.d', '$rd', \
  72. DagLeaf('$rs'))]
  73. self.assertEqualDag(dag, expect)
  74. def test_dag_binary(self):
  75. dag = Dag(B([S('command', 'addu', '$rd', '$r1', '$r2')]))
  76. expect = Dag([])
  77. expect.nodes = [DagLeaf('$r1'),
  78. DagLeaf('$r2'),
  79. DagNode('addu', '$rd', DagLeaf('$r1'), DagLeaf('$r2'))]
  80. self.assertEqualDag(dag, expect)
  81. # def test_dag_combinednode(self):
  82. # dag = Dag(B([S('command', 'mult', '$rd1', '$r1', '$r2'),
  83. # S('command', 'mult', '$rd2', '$r1', '$r2')]))
  84. # expect = Dag([])
  85. # multnode = DagNode('mult',
  86. # DagLeaf('$r1'),
  87. # DagLeaf('$r2'))
  88. # multnode.labels = ['$rd1', '$rd2']
  89. # expect.nodes = [DagLeaf('$r1'),
  90. # DagLeaf('$r2'),
  91. # multnode]
  92. #
  93. # self.assertEqualDag(dag, expect)
  94. def assertEqualDag(self, dag1, dag2):
  95. self.assertEqual(len(dag1.nodes), len(dag2.nodes))
  96. for node1, node2 in zip(dag1.nodes, dag2.nodes):
  97. self.assertEqualNodes(node1, node2)
  98. def assertEqualNodes(self, node1, node2):
  99. if isinstance(node1, DagLeaf):
  100. self.assertIsInstance(node2, DagLeaf)
  101. self.assertEqual(node1.reg, node2.reg)
  102. elif isinstance(node2, DagLeaf):
  103. raise AssertionError
  104. else:
  105. self.assertEqual(node1.op, node2.op)
  106. self.assertEqual(node1.labels, node2.labels)
  107. self.assertEqual(len(node1.nodes), len(node2.nodes))
  108. for child1, child2 in zip(node1.nodes, node2.nodes):
  109. self.assertEqualNodes(child1, child2)