test_optimize_advanced.py 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. import unittest
  2. from src.optimize.advanced import eliminate_common_subexpressions, \
  3. fold_constants, copy_propagation, algebraic_transformations
  4. from src.statement import Statement as S, Block as B
  5. class TestOptimizeAdvanced(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_eliminate_common_subexpressions(self):
  13. pass
  14. def test_fold_constants(self):
  15. pass
  16. def test_copy_propagation_true(self):
  17. block = B([self.foo,
  18. S('command', 'move', '$1', '$2'),
  19. self.foo,
  20. S('command', 'addu', '$3', '$1', '$4'),
  21. self.bar])
  22. self.assertTrue(copy_propagation(block))
  23. self.assertEqual(block.statements, [self.foo,
  24. S('command', 'move', '$1', '$2'),
  25. self.foo,
  26. S('command', 'addu', '$3', '$2', '$4'),
  27. self.bar])
  28. def test_copy_propagation_overwrite(self):
  29. block = B([self.foo, \
  30. S('command', 'move', '$1', '$2'),
  31. S('command', 'move', '$1', '$5'),
  32. S('command', 'addu', '$3', '$1', '$4'),
  33. self.bar])
  34. self.assertTrue(copy_propagation(block))
  35. self.assertEqual(block.statements, [self.foo,
  36. S('command', 'move', '$1', '$2'),
  37. S('command', 'move', '$1', '$5'),
  38. S('command', 'addu', '$3', '$5', '$4'),
  39. self.bar])
  40. def test_copy_propagation_false(self):
  41. arguments = [self.foo,
  42. S('command', 'move', '$1', '$2'),
  43. S('command', 'move', '$10', '$20'),
  44. S('command', 'addu', '$1', '$5', 1),
  45. S('command', 'addu', '$3', '$1', '$4'),
  46. self.bar]
  47. block = B(arguments)
  48. self.assertFalse(copy_propagation(block))
  49. self.assertEqual(block.statements, arguments)
  50. def test_copy_propagation_false_severalmoves(self):
  51. arguments = [self.foo,
  52. S('command', 'move', '$1', '$2'),
  53. self.foo,
  54. S('command', 'addu', '$1', '$5', 1),
  55. S('command', 'addu', '$3', '$1', '$4'),
  56. self.bar]
  57. block = B(arguments)
  58. self.assertFalse(copy_propagation(block))
  59. self.assertEqual(block.statements, arguments)
  60. def test_algebraic_transforms_add0(self):
  61. block = B([self.foo,
  62. S('command', 'addu', '$1', '$2', 0),
  63. self.bar])
  64. self.assertTrue(algebraic_transformations(block))
  65. self.assertEqual(block.statements, [self.foo,
  66. S('command', 'move', '$1', '$2'),
  67. self.bar])
  68. def test_algebraic_transforms_add1(self):
  69. arguments = [self.foo,
  70. S('command', 'addu', '$1', '$2', 1),
  71. self.bar]
  72. block = B(arguments)
  73. self.assertFalse(algebraic_transformations(block))
  74. self.assertEqual(block.statements, arguments)
  75. def test_algebraic_transforms_sub0(self):
  76. block = B([self.foo,
  77. S('command', 'subu', '$1', '$2', 0),
  78. self.bar])
  79. self.assertTrue(algebraic_transformations(block))
  80. self.assertEqual(block.statements, [self.foo,
  81. S('command', 'move', '$1', '$2'),
  82. self.bar])
  83. def test_algebraic_transforms_sub1(self):
  84. arguments = [self.foo,
  85. S('command', 'subu', '$1', '$2', 1),
  86. self.bar]
  87. block = B(arguments)
  88. self.assertFalse(algebraic_transformations(block))
  89. self.assertEqual(block.statements, arguments)
  90. def test_algebraic_transforms_mult0(self):
  91. block = B([self.foo,
  92. S('command', 'mult', '$1', '$2', 0),
  93. self.bar])
  94. self.assertTrue(algebraic_transformations(block))
  95. self.assertEqual(block.statements, [self.foo,
  96. S('command', 'li', '$1', '0x00000000'),
  97. self.bar])
  98. def test_algebraic_transforms_mult1(self):
  99. block = B([self.foo,
  100. S('command', 'mult', '$1', '$2', 1),
  101. self.bar])
  102. self.assertTrue(algebraic_transformations(block))
  103. self.assertEqual(block.statements, [self.foo,
  104. S('command', 'move', '$1', '$2'),
  105. self.bar])
  106. def test_algebraic_transforms_mult2(self):
  107. block = B([self.foo,
  108. S('command', 'mult', '$1', '$2', 2),
  109. self.bar])
  110. self.assertTrue(algebraic_transformations(block))
  111. self.assertEqual(block.statements, [self.foo,
  112. S('command', 'sll', '$1', '$2', 1),
  113. self.bar])
  114. def test_algebraic_transforms_mult16(self):
  115. block = B([self.foo,
  116. S('command', 'mult', '$1', '$2', 16),
  117. self.bar])
  118. self.assertTrue(algebraic_transformations(block))
  119. self.assertEqual(block.statements, [self.foo,
  120. S('command', 'sll', '$1', '$2', 4),
  121. self.bar])
  122. def test_algebraic_transforms_mult3(self):
  123. arguments = [self.foo,
  124. S('command', 'mult', '$1', '$2', 3),
  125. self.bar]
  126. block = B(arguments)
  127. self.assertFalse(algebraic_transformations(block))
  128. self.assertEqual(block.statements, arguments)