test_reaching_definitions.py 3.5 KB

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