def test_recompute_liveout(self):
        # Given: UEVAR(B) = 'c'
        # Expect: LIVEOUT(A) = 'c'
        blocks = th.build_blocks_arb(block_links={'A': ['B'], 'B': []})
        blocks[1].ue_var.add('c')
        self.assertTrue(blocks[0].recompute_liveout())

        self.assertSetEqual(blocks[0].live_out, {'c'})

        # Given: UEVAR(B) = 'c',
        #        LIVEOUT(B) = 'd'
        #        VARKILL(B) = None
        # Expect: LIVEOUT(A) = 'c, 'd'

        blocks = th.build_blocks_arb(block_links={'A': ['B'], 'B': []})
        blocks[1].ue_var.add('c')
        blocks[1].live_out.add('d')
        self.assertTrue(blocks[0].recompute_liveout())

        self.assertSetEqual(blocks[0].live_out, {'c', 'd'})

        # Given: UEVAR(B) = 'c',
        #        LIVEOUT(B) = 'd'
        #        VARKILL(B) = 'd'
        # Expect: LIVEOUT(A) = 'c'

        blocks = th.build_blocks_arb(block_links={'A': ['B'], 'B': []})
        blocks[1].ue_var.add('c')
        blocks[1].live_out.add('d')
        blocks[1].var_kill.add('d')
        self.assertTrue(blocks[0].recompute_liveout())

        self.assertSetEqual(blocks[0].live_out, {'c'})

        # Given: LIVEOUT(A) = 'c'
        #        UEVAR(B) = 'c',
        #        LIVEOUT(B) = 'd'
        #        VARKILL(B) = 'd'
        # Expect: LIVEOUT(A) = 'c' (no changed)

        blocks = th.build_blocks_arb(block_links={'A': ['B'], 'B': []})
        blocks[0].live_out.add('c')
        blocks[1].ue_var.add('c')
        blocks[1].live_out.add('d')
        blocks[1].var_kill.add('d')
        self.assertFalse(blocks[0].recompute_liveout())

        self.assertSetEqual(blocks[0].live_out, {'c'})
Beispiel #2
0
    def test_insert_phi_function_pruned_given_2_df(self):
        """
                Note: '|' with no arrows means pointing down

        GIVEN: block B has 2 DF nodes, C and D. Definition in B will force phi function in C and D

                A ---
               / \  |
              B  |  |
             / \ |  |
            |  C    |
            \       |
              D  ---
        """
        blocks, ast_string = th.build_blocks_arb(block_links={
            'A': ['B', 'C', 'D'],
            'B': ['C', 'D'],
            'C': [],
            'D': []
        },
                                                 code={
                                                     'A':
                                                     ms("""\
                                                                    temp = 1
                                                                    phi_var = 1
                                                                    """),
                                                     'B':
                                                     ms("""\
                                                                    phi_var= 2
                                                                    """),
                                                     'C':
                                                     ms("""\
                                                                    x = phi_var
                                                                    """),
                                                     'D':
                                                     ms("""\
                                                                    y = phi_var
                                                                    """)
                                                 })

        as_tree = ast.parse(ast_string)
        cfg_real = Cfg()
        cfg_real.block_list = blocks
        cfg_real.as_tree = as_tree
        cfg_real.root = cfg_real.block_list[0]
        cfg_real.fill_df()
        cfg_real.gather_initial_info()
        cfg_real.compute_live_out()
        cfg_real.ins_phi_function_pruned()

        expected_phi_list = {
            'A': set(),
            'B': set(),
            'C': {'phi_var'},
            'D': {'phi_var'}
        }

        self.assertPhiListEqual(cfg_real.block_list, expected_phi_list)
Beispiel #3
0
    def test_compute_liveout_given_5_blocks(self):

        blocks, ast_string = th.build_blocks_arb(block_links={
            'A': ['B'],
            'B': ['C', 'D'],
            'C': ['D'],
            'D': ['E', 'B'],
            'E': []
        },
                                                 code={
                                                     'A':
                                                     ms("""\
                                                                    i = 1
                                                                    """),
                                                     'B':
                                                     ms("""\
                                                                    if i < 0:
                                                                        pass
                                                                    """),
                                                     'C':
                                                     ms("""\
                                                                    s = 0
                                                                    """),
                                                     'D':
                                                     ms("""\
                                                                    s = s + i
                                                                    i = i + 1
                                                                    if i < 0:
                                                                        pass
                                                                    """),
                                                     'E':
                                                     ms("""\
                                                                    if s < 3:
                                                                        pass
                                                                    """)
                                                 })
        as_tree = ast.parse(ast_string)
        cfg_real = Cfg()
        cfg_real.block_list = blocks
        cfg_real.as_tree = as_tree
        cfg_real.root = cfg_real.block_list[0]
        cfg_real.gather_initial_info()
        cfg_real.compute_live_out()

        expected_live_out = {
            'A': {'s', 'i'},
            'B': {'s', 'i'},
            'C': {'s', 'i'},
            'D': {'s', 'i'},
            'E': set()
        }

        self.assertLiveOutEqual(cfg_real.block_list, expected_live_out)
Beispiel #4
0
    def test_insert_phi_function_pruned_4_blocks(self):

        blocks, ast_string = th.build_blocks_arb(block_links={
            'A': ['B', 'C'],
            'B': ['D'],
            'C': ['D'],
            'D': []
        },
                                                 code={
                                                     'A':
                                                     ms("""\
                                                            pass
                                                            """),
                                                     'B':
                                                     ms("""\
                                                            var = 3
                                                            """),
                                                     'C':
                                                     ms("""\
                                                            pass
                                                            """),
                                                     'D':
                                                     ms("""\
                                                            if var < 3:
                                                                pass
                                                            """)
                                                 })
        as_tree = ast.parse(ast_string)
        cfg_real = Cfg()
        cfg_real.block_list = blocks
        cfg_real.as_tree = as_tree
        cfg_real.root = cfg_real.block_list[0]
        cfg_real.fill_df()
        cfg_real.gather_initial_info()
        cfg_real.compute_live_out()
        cfg_real.ins_phi_function_pruned()

        expected_phi_list = {'A': set(), 'B': set(), 'C': set(), 'D': {'var'}}

        self.assertPhiListEqual(cfg_real.block_list, expected_phi_list)
Beispiel #5
0
    def test_insert_phi_function_semi_pruned(self):
        """
                        Note: '|' with no arrows means pointing down

                         A
                         |
                         B   <------|
                      /    \        |
                     C      F       |
                     |    /  \      |
                     |    G   I     |
                     |    \   /     |
                     |      H       |
                      \    /        |
                        D-----------|
                        |
                        E
                """
        blocks, ast_string = th.build_blocks_arb(block_links={
            'A': ['B'],
            'B': ['C', 'F'],
            'C': ['D'],
            'D': ['E', 'B'],
            'E': [],
            'F': ['G', 'I'],
            'G': ['H'],
            'H': ['D'],
            'I': ['H']
        },
                                                 code={
                                                     'A':
                                                     ms("""\
                                                            i = 1
                                                            """),
                                                     'B':
                                                     ms("""\
                                                            a = temp_0
                                                            c = temp_1
                                                            """),
                                                     'C':
                                                     ms("""\
                                                            b = temp_2
                                                            c = temp_3
                                                            d = temp_4
                                                            """),
                                                     'D':
                                                     ms("""\
                                                            y = a + b
                                                            z = c + d
                                                            i = i + 1
                                                            if i < 100:
                                                                pass
                                                            """),
                                                     'E':
                                                     "return\n",
                                                     'F':
                                                     ms("""\
                                                            a = temp_5
                                                            d = temp_6
                                                            if a < d:
                                                                pass
                                                            """),
                                                     'G':
                                                     ms("""\
                                                            d = temp
                                                            """),
                                                     'H':
                                                     ms("""\
                                                            b = temp
                                                            """),
                                                     'I':
                                                     ms("""\
                                                            c = temp
                                                            """)
                                                 })
        as_tree = ast.parse(ast_string)
        cfg_real = Cfg()
        cfg_real.block_list = blocks
        cfg_real.as_tree = as_tree
        cfg_real.root = cfg_real.block_list[0]
        cfg_real.fill_df()
        cfg_real.gather_initial_info()
        cfg_real.ins_phi_function_semi_pruned()

        expected_phi_list = {
            'A': set(),
            'B': {'a', 'b', 'c', 'd', 'i'},
            'C': set(),
            'D': {'a', 'b', 'c', 'd'},
            'E': set(),
            'F': set(),
            'G': set(),
            'H': {'c', 'd'},
            'I': set()
        }

        self.assertPhiListEqual(cfg_real.block_list, expected_phi_list)