|
|
@@ -1,7 +1,7 @@
|
|
|
import unittest
|
|
|
|
|
|
from src.statement import Statement as S
|
|
|
-from src.dataflow import BasicBlock as B
|
|
|
+from src.dataflow import BasicBlock as B, find_basic_blocks
|
|
|
from src.reaching_definitions import get_defs, create_gen_kill, create_in_out
|
|
|
|
|
|
|
|
|
@@ -26,7 +26,7 @@ class TestReachingDefinitions(unittest.TestCase):
|
|
|
'$4': set([s4.sid])
|
|
|
})
|
|
|
|
|
|
- def test_create_gen_kill_simple(self):
|
|
|
+ def test_create_gen_kill(self):
|
|
|
s1 = S('command', 'addu', '$3', '$1', '$2')
|
|
|
s2 = S('command', 'addu', '$1', '$3', 10)
|
|
|
s3 = S('command', 'subu', '$3', '$1', 5)
|
|
|
@@ -38,63 +38,44 @@ class TestReachingDefinitions(unittest.TestCase):
|
|
|
self.assertEqual(block.reach_gen, set([s2.sid, s3.sid, s4.sid]))
|
|
|
self.assertEqual(block.reach_kill, set([s1.sid]))
|
|
|
|
|
|
- #def test_create_gen_kill_between_blocks(self):
|
|
|
- # s11 = S('command', 'li', 'a', 3)
|
|
|
- # s12 = S('command', 'li', 'b', 5)
|
|
|
- # s13 = S('command', 'li', 'd', 4)
|
|
|
- # s14 = S('command', 'li', 'x', 100)
|
|
|
- # s15 = S('command', 'blt', 'a', 'b', 'L1')
|
|
|
- # b1 = B([s11, s12, s13, s14, s15])
|
|
|
-
|
|
|
- # s21 = S('command', 'addu', 'c', 'a', 'b')
|
|
|
- # s22 = S('command', 'li', 'd', 2)
|
|
|
- # b2 = B([s21, s22])
|
|
|
-
|
|
|
- # s31 = S('label', 'L1')
|
|
|
- # s32 = S('command', 'li', 'c', 4)
|
|
|
- # s33 = S('command', 'mult', 'b', 'd')
|
|
|
- # s34 = S('command', 'mflo', 'temp')
|
|
|
- # s35 = S('command', 'addu', 'return', 'temp', 'c')
|
|
|
- # b3 = B([s31, s32, s33, s34, s35])
|
|
|
-
|
|
|
- # defs = get_defs([b1, b2, b3])
|
|
|
- # create_gen_kill(b1, defs)
|
|
|
- # create_gen_kill(b2, defs)
|
|
|
- # create_gen_kill(b3, defs)
|
|
|
-
|
|
|
- # self.assertEqual(b1.reach_gen, set([s11.sid, s12.sid, s13.sid, s14.sid]))
|
|
|
- # self.assertEqual(b1.reach_kill, set([s22.sid]))
|
|
|
-
|
|
|
- # self.assertEqual(b2.reach_gen, set([s21.sid, s22.sid]))
|
|
|
- # self.assertEqual(b2.reach_kill, set([s13.sid, s32.sid]))
|
|
|
-
|
|
|
- # self.assertEqual(b3.reach_gen, set([s32.sid, s34.sid, s35.sid]))
|
|
|
- # self.assertEqual(b3.reach_kill, set([s21.sid]))
|
|
|
-
|
|
|
- #def test_create_in_out(self):
|
|
|
- # s11 = S('command', 'li', 'a', 3)
|
|
|
- # s12 = S('command', 'li', 'b', 5)
|
|
|
- # s13 = S('command', 'li', 'd', 4)
|
|
|
- # s14 = S('command', 'li', 'x', 100)
|
|
|
- # s15 = S('command', 'blt', 'a', 'b', 'L1')
|
|
|
- # b1 = B([s11, s12, s13, s14, s15])
|
|
|
-
|
|
|
- # s21 = S('command', 'addu', 'c', 'a', 'b')
|
|
|
- # s22 = S('command', 'li', 'd', 2)
|
|
|
- # b2 = B([s21, s22])
|
|
|
-
|
|
|
- # s31 = S('label', 'L1')
|
|
|
- # s32 = S('command', 'li', 'c', 4)
|
|
|
- # s33 = S('command', 'mult', 'b', 'd')
|
|
|
- # s34 = S('command', 'mflo', 'temp')
|
|
|
- # s35 = S('command', 'addu', 'return', 'temp', 'c')
|
|
|
- # b3 = B([s31, s32, s33, s34, s35])
|
|
|
-
|
|
|
- # create_in_out([b1, b2, b3])
|
|
|
-
|
|
|
- # self.assertEqual(b1.reach_in, set())
|
|
|
- # self.assertEqual(b1.reach_out, set([s11.sid, s12.sid, s13.sid]))
|
|
|
- # self.assertEqual(b2.reach_in, set([s11.sid, s12.sid]))
|
|
|
- # self.assertEqual(b2.reach_out, set([s12.sid, s22.sid]))
|
|
|
- # self.assertEqual(b3.reach_in, set([s12.sid, s22.sid]))
|
|
|
- # self.assertEqual(b3.reach_out, set())
|
|
|
+ def test_create_in_out(self):
|
|
|
+ s11 = S('command', 'li', 'a', 3)
|
|
|
+ s12 = S('command', 'li', 'b', 5)
|
|
|
+ s13 = S('command', 'li', 'd', 4)
|
|
|
+ s14 = S('command', 'li', 'x', 100)
|
|
|
+ s15 = S('command', 'beq', 'a', 'b', 'L1')
|
|
|
+
|
|
|
+ s21 = S('command', 'addu', 'c', 'a', 'b')
|
|
|
+ s22 = S('command', 'li', 'd', 2)
|
|
|
+
|
|
|
+ s31 = S('label', 'L1')
|
|
|
+ s32 = S('command', 'li', 'c', 4)
|
|
|
+ s33 = S('command', 'mult', 'b', 'd')
|
|
|
+ s34 = S('command', 'mflo', 'temp')
|
|
|
+ s35 = S('command', 'addu', 'return', 'temp', 'c')
|
|
|
+
|
|
|
+ b1, b2, b3 = find_basic_blocks([s11, s12, s13, s14, s15, s21, s22, \
|
|
|
+ s31, s32, s33, s34, s35])
|
|
|
+
|
|
|
+ create_in_out([b1, b2, b3])
|
|
|
+
|
|
|
+ self.assertEqual(b1.reach_gen, set([s11.sid, s12.sid, s13.sid,
|
|
|
+ s14.sid]))
|
|
|
+ self.assertEqual(b1.reach_kill, set([s22.sid]))
|
|
|
+ self.assertEqual(b2.reach_gen, set([s21.sid, s22.sid]))
|
|
|
+ self.assertEqual(b2.reach_kill, set([s13.sid, s32.sid]))
|
|
|
+ self.assertEqual(b3.reach_gen, set([s32.sid, s34.sid, s35.sid]))
|
|
|
+ self.assertEqual(b3.reach_kill, set([s21.sid]))
|
|
|
+
|
|
|
+ self.assertEqual(b1.reach_in, set())
|
|
|
+ self.assertEqual(b1.reach_out, set([s11.sid, s12.sid, s13.sid,
|
|
|
+ s14.sid]))
|
|
|
+ self.assertEqual(b2.reach_in, set([s11.sid, s12.sid, s13.sid,
|
|
|
+ s14.sid]))
|
|
|
+ self.assertEqual(b2.reach_out, set([s21.sid, s22.sid, s11.sid, \
|
|
|
+ s12.sid, s14.sid]))
|
|
|
+ self.assertEqual(b3.reach_in, set([s21.sid, s22.sid, s11.sid, \
|
|
|
+ s12.sid, s13.sid, s14.sid]))
|
|
|
+ self.assertEqual(b3.reach_out, set([s32.sid, s34.sid, s35.sid, \
|
|
|
+ s22.sid, s11.sid, s12.sid, \
|
|
|
+ s13.sid, s14.sid]))
|