test_reaching_definitions.py 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import unittest
  2. from src.statement import Statement as S
  3. from src.dataflow import BasicBlock as B, find_basic_blocks, \
  4. generate_flow_graph
  5. from src.reaching_definitions import get_defs, create_gen_kill, create_in_out
  6. class TestReachingDefinitions(unittest.TestCase):
  7. def setUp(self):
  8. pass
  9. def tearDown(self):
  10. pass
  11. def test_get_defs(self):
  12. s1 = S('command', 'add', '$3', '$1', '$2')
  13. s2 = S('command', 'move', '$1', '$3')
  14. s3 = S('command', 'move', '$3', '$2')
  15. s4 = S('command', 'li', '$4', '0x00000001')
  16. block = B([s1, s2, s3, s4])
  17. self.assertEqual(get_defs([block]), {
  18. '$3': set([s1.sid, s3.sid]),
  19. '$1': set([s2.sid]),
  20. '$4': set([s4.sid])
  21. })
  22. def test_create_gen_kill(self):
  23. s1 = S('command', 'addu', '$3', '$1', '$2')
  24. s2 = S('command', 'addu', '$1', '$3', 10)
  25. s3 = S('command', 'subu', '$3', '$1', 5)
  26. s4 = S('command', 'li', '$4', '0x00000001')
  27. block = B([s1, s2, s3, s4])
  28. create_gen_kill(block, get_defs([block]))
  29. self.assertEqual(block.gen_set, set([s2.sid, s3.sid, s4.sid]))
  30. self.assertEqual(block.kill_set, set([s1.sid]))
  31. def test_create_in_out(self):
  32. s11 = S('command', 'li', 'a', 3)
  33. s12 = S('command', 'li', 'b', 5)
  34. s13 = S('command', 'li', 'd', 4)
  35. s14 = S('command', 'li', 'x', 100)
  36. s15 = S('command', 'beq', 'a', 'b', 'L1')
  37. s21 = S('command', 'addu', 'c', 'a', 'b')
  38. s22 = S('command', 'li', 'd', 2)
  39. s31 = S('label', 'L1')
  40. s32 = S('command', 'li', 'c', 4)
  41. s33 = S('command', 'mult', 'b', 'd')
  42. s34 = S('command', 'mflo', 'temp')
  43. s35 = S('command', 'addu', 'return', 'temp', 'c')
  44. b1, b2, b3 = find_basic_blocks([s11, s12, s13, s14, s15, s21, s22, \
  45. s31, s32, s33, s34, s35])
  46. generate_flow_graph([b1, b2, b3])
  47. create_in_out([b1, b2, b3])
  48. self.assertEqual(b1.gen_set, set([s11.sid, s12.sid, s13.sid,
  49. s14.sid]))
  50. self.assertEqual(b1.kill_set, set([s22.sid]))
  51. self.assertEqual(b2.gen_set, set([s21.sid, s22.sid]))
  52. self.assertEqual(b2.kill_set, set([s13.sid, s32.sid]))
  53. self.assertEqual(b3.gen_set, set([s32.sid, s34.sid, s35.sid]))
  54. self.assertEqual(b3.kill_set, set([s21.sid]))
  55. self.assertEqual(b1.reach_in, set())
  56. self.assertEqual(b1.reach_out, set([s11.sid, s12.sid, s13.sid,
  57. s14.sid]))
  58. self.assertEqual(b2.reach_in, set([s11.sid, s12.sid, s13.sid,
  59. s14.sid]))
  60. self.assertEqual(b2.reach_out, set([s21.sid, s22.sid, s11.sid, \
  61. s12.sid, s14.sid]))
  62. self.assertEqual(b3.reach_in, set([s21.sid, s22.sid, s11.sid, \
  63. s12.sid, s13.sid, s14.sid]))
  64. self.assertEqual(b3.reach_out, set([s32.sid, s34.sid, s35.sid, \
  65. s22.sid, s11.sid, s12.sid, \
  66. s13.sid, s14.sid]))