def test_generate_flow_graph_simple(self): b1 = B([S('command', 'foo'), S('command', 'j', 'b2')]) b2 = B([S('label', 'b2'), S('command', 'bar')]) generate_flow_graph([b1, b2]) self.assertEqual(b1.edges_to, [b2]) self.assertEqual(b2.edges_from, [b1])
def test_generate_flow_graph_branch(self): b1 = B([S('command', 'foo'), S('command', 'beq', '$1', '$2', 'b3')]) b2 = B([S('command', 'bar')]) b3 = B([S('label', 'b3'), S('command', 'baz')]) generate_flow_graph([b1, b2, b3]) self.assertIn(b2, b1.edges_to) self.assertIn(b3, b1.edges_to) self.assertEqual(b2.edges_from, [b1]) self.assertEqual(b2.edges_to, [b3]) self.assertIn(b1, b3.edges_from) self.assertIn(b2, b3.edges_from)
def test_propagate_copies_false(self): arguments = [self.foo, S('command', 'move', '$1', '$2'), S('command', 'move', '$10', '$20'), S('command', 'addu', '$1', '$5', 1), S('command', 'addu', '$3', '$1', '$4'), self.bar] block = B(arguments) find_basic_blocks([block]) generate_flow_graph([block]) reaching_definitions.create_in_out([block]) copy_propagation.create_in_out([block]) self.assertFalse(propagate_copies(block)) self.assertEqual(block.statements, arguments)
def test_propagate_copies_other_arg(self): block = B([self.foo, S('command', 'move', '$1', '$2'), self.foo, S('command', 'addu', '$3', '$4', '$1'), self.bar]) find_basic_blocks([block]) generate_flow_graph([block]) reaching_definitions.create_in_out([block]) copy_propagation.create_in_out([block]) self.assertTrue(propagate_copies(block)) self.assertEqual(block.statements, [self.foo, S('command', 'move', '$1', '$2'), self.foo, S('command', 'addu', '$3', '$4', '$2'), self.bar])
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]) generate_flow_graph([b1, b2, b3]) create_in_out([b1, b2, b3]) self.assertEqual(b1.gen_set, set([s11.sid, s12.sid, s13.sid, s14.sid])) self.assertEqual(b1.kill_set, set([s22.sid])) self.assertEqual(b2.gen_set, set([s21.sid, s22.sid])) self.assertEqual(b2.kill_set, set([s13.sid, s32.sid])) self.assertEqual(b3.gen_set, set([s32.sid, s34.sid, s35.sid])) self.assertEqual(b3.kill_set, 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]))
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]) generate_flow_graph([b1, b2, b3]) create_in_out([b1, b2, b3]) self.assertEqual(b1.use_set, set()) self.assertEqual(b1.def_set, set(['a', 'b', 'd', 'x'])) self.assertEqual(b2.use_set, set(['a', 'b'])) self.assertEqual(b2.def_set, set(['c', 'd'])) self.assertEqual(b3.use_set, set(['b', 'd'])) self.assertEqual(b3.def_set, set(['c', 'temp', 'return'])) self.assertEqual(b1.live_in, set()) self.assertEqual(b1.live_out, set(['a', 'b', 'd'])) self.assertEqual(b2.live_in, set(['a', 'b'])) self.assertEqual(b2.live_out, set(['b', 'd'])) self.assertEqual(b3.live_in, set(['b', 'd'])) self.assertEqual(b3.live_out, set())