test_optimize.py 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. import unittest
  2. from src.optimize.redundancies import remove_redundant_jumps
  3. from src.optimize import optimize_block
  4. from src.statement import Statement as S, Block as B
  5. class TestOptimize(unittest.TestCase):
  6. def setUp(self):
  7. self.foo = S('command', 'foo')
  8. self.bar = S('command', 'bar')
  9. def tearDown(self):
  10. del self.foo
  11. del self.bar
  12. def test_optimize_block_movaa(self):
  13. block = B([self.foo,
  14. S('command', 'move', '$regA', '$regA'),
  15. self.bar])
  16. optimize_block(block)
  17. self.assertEquals(block.statements, [self.foo, self.bar])
  18. def test_optimize_block_movab(self):
  19. move = S('command', 'move', '$regA', '$regB')
  20. block = B([self.foo,
  21. move,
  22. self.bar])
  23. optimize_block(block)
  24. self.assertEquals(block.statements, [self.foo, move, self.bar])
  25. def test_optimize_block_movinst_true(self):
  26. block = B([self.foo,
  27. S('command', 'move', '$regA', '$regB'),
  28. S('command', 'addu', '$regA', '$regA', 2),
  29. self.bar])
  30. optimize_block(block)
  31. self.assertEquals(block.statements, [self.foo,
  32. S('command', 'addu', '$regA', '$regB', 2),
  33. self.bar])
  34. def test_optimize_block_movinst_false(self):
  35. statements = [self.foo, \
  36. S('command', 'move', '$regA', '$regB'), \
  37. S('command', 'addu', '$regD', '$regC', 2), \
  38. self.bar]
  39. block = B(statements)
  40. optimize_block(block)
  41. self.assertEquals(block.statements, statements)
  42. def test_optimize_block_instr_mov_jal_true(self):
  43. block = B([self.foo,
  44. S('command', 'addu', '$regA', '$regC', 2),
  45. S('command', 'move', '$4', '$regA'),
  46. S('command', 'jal', 'L1'),
  47. self.bar])
  48. optimize_block(block)
  49. self.assertEquals(block.statements, [self.foo,
  50. S('command', 'addu', '$4', '$regC', 2),
  51. S('command', 'jal', 'L1'),
  52. self.bar])
  53. def test_optimize_block_instr_mov_jal_false(self):
  54. arguments = [self.foo, \
  55. S('command', 'addu', '$regA', '$regC', 2), \
  56. S('command', 'move', '$3', '$regA'), \
  57. S('command', 'jal', 'L1'), \
  58. self.bar]
  59. block = B(arguments)
  60. optimize_block(block)
  61. self.assertEquals(block.statements, arguments)
  62. def test_optimize_block_sw_ld_true(self):
  63. block = B([self.foo,
  64. S('command', 'sw', '$regA', '$regB'),
  65. S('command', 'lw', '$regA', '$regB'),
  66. self.bar])
  67. optimize_block(block)
  68. self.assertEquals(block.statements, [self.foo,
  69. S('command', 'sw', '$regA', '$regB'),
  70. self.bar])
  71. def test_optimize_block_sw_ld_false(self):
  72. arguments = [self.foo, \
  73. S('command', 'sw', '$regA', '$regB'), \
  74. S('command', 'lw', '$regD', '$regC'), \
  75. self.bar]
  76. block = B(arguments)
  77. optimize_block(block)
  78. self.assertEquals(block.statements, arguments)
  79. def test_optimize_block_shift_true(self):
  80. block = B([self.foo,
  81. S('command', 'sll', '$regA', '$regA', 0),
  82. self.bar])
  83. optimize_block(block)
  84. self.assertEquals(block.statements, [self.foo, self.bar])
  85. def test_optimize_block_shift_false(self):
  86. arguments = [self.foo, \
  87. S('command', 'sll', '$regA', '$regB', 0), \
  88. self.bar]
  89. block = B(arguments)
  90. optimize_block(block)
  91. self.assertEquals(block.statements, arguments)
  92. arguments2 = [self.foo, \
  93. S('command', 'sll', '$regA', '$regA', 1), \
  94. self.bar]
  95. block2 = B(arguments2)
  96. optimize_block(block2)
  97. self.assertEquals(block2.statements, arguments2)
  98. def test_optimize_block_add_lw_true(self):
  99. block = B([self.foo,
  100. S('command', 'addu', '$regA', '$regA', 10),
  101. S('command', 'lw', '$regB', '0($regA)'),
  102. self.bar])
  103. optimize_block(block)
  104. self.assertEquals(block.statements, [self.foo,
  105. S('command', 'lw', '$regB', '10($regA)'),
  106. self.bar])
  107. def test_optimize_block_add_lw_false(self):
  108. arguments = [self.foo, \
  109. S('command', 'addu', '$regA', '$regA', 10), \
  110. S('command', 'lw', '$regB', '0($regC)'), \
  111. self.bar]
  112. block = B(arguments)
  113. optimize_block(block)
  114. arguments2 = [self.foo, \
  115. S('command', 'addu', '$regA', '$regB', 10), \
  116. S('command', 'lw', '$regB', '0($regA)'), \
  117. self.bar]
  118. block2 = B(arguments2)
  119. arguments3 = [self.foo, \
  120. S('command', 'addu', '$regA', '$regA', 10), \
  121. S('command', 'lw', '$regB', '1($regA)'), \
  122. self.bar]
  123. block3 = B(arguments3)
  124. optimize_block(block3)
  125. self.assertEquals(block.statements, arguments)
  126. self.assertEquals(block2.statements, arguments2)
  127. self.assertEquals(block3.statements, arguments3)
  128. def test_remove_redundant_jumps_beq_j_true(self):
  129. block = B([self.foo,
  130. S('command', 'beq', '$regA', '$regB', '$Lx'),
  131. S('command', 'j', '$Ly'),
  132. S('label', '$Lx'),
  133. self.bar])
  134. remove_redundant_jumps(block)
  135. self.assertEquals(block.statements, [self.foo,
  136. S('command', 'bne', '$regA', '$regB', '$Ly'),
  137. S('label', '$Lx'),
  138. self.bar])
  139. def test_remove_redundant_jumps_beq_j_false(self):
  140. arguments = [self.foo, \
  141. S('command', 'beq', '$regA', '$regB', '$Lz'), \
  142. S('command', 'j', '$Ly'), \
  143. S('label', '$Lx'), \
  144. self.bar]
  145. block = B(arguments)
  146. remove_redundant_jumps(block)
  147. self.assertEquals(block.statements, arguments)
  148. def test_remove_redundant_jumps_bne_j_true(self):
  149. block = B([self.foo,
  150. S('command', 'bne', '$regA', '$regB', '$Lx'),
  151. S('command', 'j', '$Ly'),
  152. S('label', '$Lx'),
  153. self.bar])
  154. remove_redundant_jumps(block)
  155. self.assertEquals(block.statements, [self.foo,
  156. S('command', 'beq', '$regA', '$regB', '$Ly'),
  157. S('label', '$Lx'),
  158. self.bar])
  159. def test_remove_redundant_jumps_bne_j_false(self):
  160. arguments = [self.foo, \
  161. S('command', 'bne', '$regA', '$regB', '$Lz'), \
  162. S('command', 'j', '$Ly'), \
  163. S('label', '$Lx'), \
  164. self.bar]
  165. block = B(arguments)
  166. remove_redundant_jumps(block)
  167. self.assertEquals(block.statements, arguments)
  168. def test_optimize_block_move_move_true(self):
  169. block = B([self.foo,
  170. S('command', 'move', '$regA', '$regB'),
  171. S('command', 'move', '$regB', '$regA'),
  172. self.bar])
  173. optimize_block(block)
  174. self.assertEquals(block.statements, [self.foo,
  175. S('command', 'move', '$regA', '$regB'),
  176. self.bar])
  177. def test_optimize_block_mov_mov_false(self):
  178. arguments = [self.foo, \
  179. S('command', 'move', '$regA', '$regB'), \
  180. S('command', 'move', '$regB', '$regC'), \
  181. self.bar]
  182. block = B(arguments)
  183. optimize_block(block)
  184. self.assertEquals(block.statements, arguments)