test_liveness.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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.liveness import create_use_def, create_in_out
  6. class TestLiveness(unittest.TestCase):
  7. def setUp(self):
  8. pass
  9. def tearDown(self):
  10. pass
  11. def test_create_gen_kill(self):
  12. s1 = S('command', 'addu', '$3', '$1', '$2')
  13. s2 = S('command', 'addu', '$1', '$3', 10)
  14. s3 = S('command', 'subu', '$3', '$1', 5)
  15. s4 = S('command', 'li', '$4', '0x00000001')
  16. block = B([s1, s2, s3, s4])
  17. create_use_def(block)
  18. self.assertEqual(block.use_set, set(['$1', '$2']))
  19. self.assertEqual(block.def_set, set(['$3', '$4']))
  20. def test_create_in_out(self):
  21. s11 = S('command', 'li', 'a', 3)
  22. s12 = S('command', 'li', 'b', 5)
  23. s13 = S('command', 'li', 'd', 4)
  24. s14 = S('command', 'li', 'x', 100)
  25. s15 = S('command', 'beq', 'a', 'b', 'L1')
  26. s21 = S('command', 'addu', 'c', 'a', 'b')
  27. s22 = S('command', 'li', 'd', 2)
  28. s31 = S('label', 'L1')
  29. s32 = S('command', 'li', 'c', 4)
  30. s33 = S('command', 'mult', 'b', 'd')
  31. s34 = S('command', 'mflo', 'temp')
  32. s35 = S('command', 'addu', 'return', 'temp', 'c')
  33. b1, b2, b3 = find_basic_blocks([s11, s12, s13, s14, s15, s21, s22,
  34. s31, s32, s33, s34, s35])
  35. generate_flow_graph([b1, b2, b3])
  36. create_in_out([b1, b2, b3])
  37. self.assertEqual(b1.use_set, set())
  38. self.assertEqual(b1.def_set, set(['a', 'b', 'd', 'x']))
  39. self.assertEqual(b2.use_set, set(['a', 'b']))
  40. self.assertEqual(b2.def_set, set(['c', 'd']))
  41. self.assertEqual(b3.use_set, set(['b', 'd']))
  42. self.assertEqual(b3.def_set, set(['c', 'temp', 'return']))
  43. self.assertEqual(b1.live_in, set())
  44. self.assertEqual(b1.live_out, set(['a', 'b', 'd']))
  45. self.assertEqual(b2.live_in, set(['a', 'b']))
  46. self.assertEqual(b2.live_out, set(['b', 'd']))
  47. self.assertEqual(b3.live_in, set(['b', 'd']))
  48. self.assertEqual(b3.live_out, set())
  49. # def test_create_in_out_two(self):
  50. # s11 = S('command', 'subu', 'i', 'm', '0x00000001')
  51. # s12 = S('command', 'move', 'j', 'n')
  52. # s13 = S('command', 'move', 'a', 'u1')
  53. # s14 = S('command', 'subu', 'i', 'm', '0x00000005')
  54. # s15 = S('command', 'j', 'L1')
  55. #
  56. # s21 = S('label', 'L1')
  57. # s22 = S('command', 'addi', 'i', '0x00000001')
  58. # s23 = S('command', 'subi', 'j', '0x00000002')
  59. # s24 = S('command', 'bne', 'i', 'j', 'L2')
  60. #
  61. # s31 = S('command', 'move', 'a', 'u2')
  62. # s32 = S('command', 'j', 'L1')
  63. # s41 = S('label', 'L2')
  64. # s42 = S('command', 'move', 'i', 'u3')
  65. # s43 = S('command', 'beq', 'i', 'j', 'L3')
  66. #
  67. # s51 = S('label', 'L3')
  68. # s52 = S('command', 'addu', 'b', 'i', 'a')
  69. #
  70. # blocks = find_basic_blocks([s11, s12, s13, s14, s15,
  71. # s21, s22, s23, s24, s31, s32, s41, s42, s43, s51, s52])
  72. #
  73. # generate_flow_graph(blocks)
  74. # create_in_out(blocks)
  75. #
  76. # for i, block in enumerate(blocks):
  77. # print 'block ', i,':\n\t in:', block.live_in
  78. # print '\t out:', block.live_out
  79. #
  80. # #print blocks[-1].live_in