test_optimize_advanced.py 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. import unittest
  2. from copy import copy
  3. from src.optimize_advanced import eliminate_common_subexpressions, \
  4. propagate_copies
  5. from src.statement import Statement as S
  6. from src.dataflow import BasicBlock as B, find_basic_blocks, \
  7. generate_flow_graph
  8. import src.liveness as liveness
  9. import src.reaching_definitions as reaching_definitions
  10. import src.copy_propagation as copy_propagation
  11. class TestOptimizeAdvanced(unittest.TestCase):
  12. def setUp(self):
  13. self.foo = S('command', 'foo')
  14. self.bar = S('command', 'bar')
  15. def tearDown(self):
  16. del self.foo
  17. del self.bar
  18. def test_eliminate_common_subexpressions_simple(self):
  19. b = B([S('command', 'addu', '$regC', '$regA', '$regB'),
  20. S('command', 'addu', '$regD', '$regA', '$regB')])
  21. e = [S('command', 'addu', '$8', '$regA', '$regB'), \
  22. S('command', 'move', '$regC', '$8'), \
  23. S('command', 'move', '$regD', '$8')]
  24. liveness.create_in_out([b])
  25. eliminate_common_subexpressions(b)
  26. self.assertEqual(b.statements, e)
  27. def test_eliminate_common_subexpressions_assigned(self):
  28. b = B([S('command', 'addu', '$regC', '$regA', '$regB'),
  29. S('command', 'li', '$regA', '0x00000001'),
  30. S('command', 'addu', '$regD', '$regA', '$regB')])
  31. e = copy(b.statements)
  32. liveness.create_in_out([b])
  33. eliminate_common_subexpressions(b)
  34. self.assertEqual(b.statements, e)
  35. #def test_propagate_copies_true(self):
  36. # block = B([self.foo,
  37. # S('command', 'move', '$1', '$2'),
  38. # self.foo,
  39. # S('command', 'addu', '$3', '$1', '$4'),
  40. # self.bar])
  41. # self.assertTrue(propagate_copies(block))
  42. # self.assertEqual(block.statements, [self.foo,
  43. # S('command', 'move', '$1', '$2'),
  44. # self.foo,
  45. # S('command', 'addu', '$3', '$2', '$4'),
  46. # self.bar])
  47. def test_propagate_copies_other_arg(self):
  48. block = B([self.foo,
  49. S('command', 'move', '$1', '$2'),
  50. self.foo,
  51. S('command', 'addu', '$3', '$4', '$1'),
  52. self.bar])
  53. find_basic_blocks([block])
  54. generate_flow_graph([block])
  55. reaching_definitions.create_in_out([block])
  56. copy_propagation.create_in_out([block])
  57. self.assertTrue(propagate_copies(block))
  58. self.assertEqual(block.statements, [self.foo,
  59. S('command', 'move', '$1', '$2'),
  60. self.foo,
  61. S('command', 'addu', '$3', '$4', '$2'),
  62. self.bar])
  63. #def test_propagate_copies_overwrite(self):
  64. # block = B([self.foo,
  65. # S('command', 'move', '$1', '$2'),
  66. # S('command', 'move', '$1', '$5'),
  67. # S('command', 'addu', '$3', '$1', '$4'),
  68. # self.bar])
  69. # self.assertTrue(propagate_copies(block))
  70. # self.assertEqual(block.statements, [self.foo,
  71. # S('command', 'move', '$1', '$2'),
  72. # S('command', 'move', '$1', '$5'),
  73. # S('command', 'addu', '$3', '$5', '$4'),
  74. # self.bar])
  75. def test_propagate_copies_false(self):
  76. arguments = [self.foo,
  77. S('command', 'move', '$1', '$2'),
  78. S('command', 'move', '$10', '$20'),
  79. S('command', 'addu', '$1', '$5', 1),
  80. S('command', 'addu', '$3', '$1', '$4'),
  81. self.bar]
  82. block = B(arguments)
  83. find_basic_blocks([block])
  84. generate_flow_graph([block])
  85. reaching_definitions.create_in_out([block])
  86. copy_propagation.create_in_out([block])
  87. self.assertFalse(propagate_copies(block))
  88. self.assertEqual(block.statements, arguments)
  89. def test_propagate_copies_false_severalmoves(self):
  90. arguments = [self.foo,
  91. S('command', 'move', '$1', '$2'),
  92. self.foo,
  93. S('command', 'addu', '$1', '$5', 1),
  94. S('command', 'addu', '$3', '$1', '$4'),
  95. self.bar]
  96. block = B(arguments)
  97. find_basic_blocks([block])
  98. generate_flow_graph([block])
  99. reaching_definitions.create_in_out([block])
  100. copy_propagation.create_in_out([block])
  101. self.assertFalse(propagate_copies(block))
  102. self.assertEqual(block.statements, arguments)
  103. #def test_algebraic_transforms_add0(self):
  104. # block = B([self.foo,
  105. # S('command', 'addu', '$1', '$2', 0),
  106. # self.bar])
  107. # self.assertTrue(algebraic_transformations(block))
  108. # self.assertEqual(block.statements, [self.foo,
  109. # S('command', 'move', '$1', '$2'),
  110. # self.bar])
  111. #def test_algebraic_transforms_add1(self):
  112. # arguments = [self.foo,
  113. # S('command', 'addu', '$1', '$2', 1),
  114. # self.bar]
  115. # block = B(arguments)
  116. # self.assertFalse(algebraic_transformations(block))
  117. # self.assertEqual(block.statements, arguments)
  118. #def test_algebraic_transforms_sub0(self):
  119. # block = B([self.foo,
  120. # S('command', 'subu', '$1', '$2', 0),
  121. # self.bar])
  122. # self.assertTrue(algebraic_transformations(block))
  123. # self.assertEqual(block.statements, [self.foo,
  124. # S('command', 'move', '$1', '$2'),
  125. # self.bar])
  126. #def test_algebraic_transforms_sub1(self):
  127. # arguments = [self.foo,
  128. # S('command', 'subu', '$1', '$2', 1),
  129. # self.bar]
  130. # block = B(arguments)
  131. # self.assertFalse(algebraic_transformations(block))
  132. # self.assertEqual(block.statements, arguments)
  133. #def test_algebraic_transforms_mult0(self):
  134. # block = B([self.foo,
  135. # S('command', 'mult', '$2', 0),
  136. # S('command', 'mflo', '$1'),
  137. # self.bar])
  138. # self.assertTrue(algebraic_transformations(block))
  139. # self.assertEqual(block.statements, [self.foo,
  140. # S('command', 'li', '$1', '0x00000000'),
  141. # self.bar])
  142. #def test_algebraic_transforms_mult1(self):
  143. # block = B([self.foo,
  144. # S('command', 'mult', '$2', 1),
  145. # S('command', 'mflo', '$1'),
  146. # self.bar])
  147. # self.assertTrue(algebraic_transformations(block))
  148. # self.assertEqual(block.statements, [self.foo,
  149. # S('command', 'move', '$1', '$2'),
  150. # self.bar])
  151. #def test_algebraic_transforms_mult2(self):
  152. # block = B([self.foo,
  153. # S('command', 'mult', '$2', 2),
  154. # S('command', 'mflo', '$1'),
  155. # self.bar])
  156. # self.assertTrue(algebraic_transformations(block))
  157. # self.assertEqual(block.statements, [self.foo,
  158. # S('command', 'sll', '$1', '$2', 1),
  159. # self.bar])
  160. #def test_algebraic_transforms_mult16(self):
  161. # block = B([self.foo,
  162. # S('command', 'mult', '$2', 16),
  163. # S('command', 'mflo', '$1'),
  164. # self.bar])
  165. # self.assertTrue(algebraic_transformations(block))
  166. # self.assertEqual(block.statements, [self.foo,
  167. # S('command', 'sll', '$1', '$2', 4),
  168. # self.bar])
  169. #def test_algebraic_transforms_mult3(self):
  170. # arguments = [self.foo,
  171. # S('command', 'mult', '$2', 3),
  172. # S('command', 'mflo', '$1'),
  173. # self.bar]
  174. # block = B(arguments)
  175. # self.assertFalse(algebraic_transformations(block))
  176. # self.assertEqual(block.statements, arguments)