test_optimize_advanced.py 3.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import unittest
  2. from copy import copy
  3. from src.optimize.advanced import eliminate_common_subexpressions, \
  4. fold_constants, copy_propagation, algebraic_transformations
  5. from src.statement import Statement as S, Block as B
  6. class TestOptimizeAdvanced(unittest.TestCase):
  7. def setUp(self):
  8. self.foo = S('command', 'foo')
  9. self.bar = S('command', 'bar')
  10. def tearDown(self):
  11. del self.foo
  12. del self.bar
  13. def test_eliminate_common_subexpressions_simple(self):
  14. b = B([S('command', 'addu', '$regC', '$regA', '$regB'),
  15. S('command', 'addu', '$regD', '$regA', '$regB')])
  16. e = [S('command', 'addu', '$t0', '$regA', '$regB'), \
  17. S('command', 'move', '$regC', '$t0'), \
  18. S('command', 'move', '$regD', '$t0')]
  19. eliminate_common_subexpressions(b)
  20. self.assertEqual(b.statements, e)
  21. def test_eliminate_common_subexpressions_assigned(self):
  22. b = B([S('command', 'addu', '$regC', '$regA', '$regB'),
  23. S('command', 'li', '$regA', '0x00000001'),
  24. S('command', 'addu', '$regD', '$regA', '$regB')])
  25. e = copy(b.statements)
  26. eliminate_common_subexpressions(b)
  27. self.assertEqual(b.statements, e)
  28. def test_fold_constants(self):
  29. pass
  30. def test_copy_propagation_true(self):
  31. block = B([self.foo,
  32. S('command', 'move', '$1', '$2'),
  33. self.foo,
  34. S('command', 'addu', '$3', '$1', '$4'),
  35. self.bar])
  36. self.assertTrue(copy_propagation(block))
  37. self.assertEqual(block.statements, [self.foo,
  38. S('command', 'move', '$1', '$2'),
  39. self.foo,
  40. S('command', 'addu', '$3', '$2', '$4'),
  41. self.bar])
  42. def test_copy_propagation_overwrite(self):
  43. block = B([self.foo, \
  44. S('command', 'move', '$1', '$2'),
  45. S('command', 'move', '$1', '$5'),
  46. S('command', 'addu', '$3', '$1', '$4'),
  47. self.bar])
  48. self.assertTrue(copy_propagation(block))
  49. self.assertEqual(block.statements, [self.foo,
  50. S('command', 'move', '$1', '$2'),
  51. S('command', 'move', '$1', '$5'),
  52. S('command', 'addu', '$3', '$5', '$4'),
  53. self.bar])
  54. def test_copy_propagation_false(self):
  55. arguments = [self.foo,
  56. S('command', 'move', '$1', '$2'),
  57. S('command', 'move', '$10', '$20'),
  58. S('command', 'addu', '$1', '$5', 1),
  59. S('command', 'addu', '$3', '$1', '$4'),
  60. self.bar]
  61. block = B(arguments)
  62. self.assertFalse(copy_propagation(block))
  63. self.assertEqual(block.statements, arguments)
  64. def test_copy_propagation_false_severalmoves(self):
  65. arguments = [self.foo,
  66. S('command', 'move', '$1', '$2'),
  67. self.foo,
  68. S('command', 'addu', '$1', '$5', 1),
  69. S('command', 'addu', '$3', '$1', '$4'),
  70. self.bar]
  71. block = B(arguments)
  72. self.assertFalse(copy_propagation(block))
  73. self.assertEqual(block.statements, arguments)
  74. def test_algebraic_transforms_add0(self):
  75. block = B([self.foo,
  76. S('command', 'addu', '$1', '$2', 0),
  77. self.bar])
  78. # self.assertTrue(copy_propagation(block))
  79. algebraic_transformations(block)
  80. self.assertEqual(block.statements, [self.foo,
  81. self.bar])