Ejemplo n.º 1
0
    def test_simple_theta(self):
        def refG():
            cfg = cfg_model.cfg()
            entry = cfg.make_node(stmts.null_stmt())
            a = cfg.make_node('let v1, z := dec(v1)')
            b = cfg.make_node('let v2 := sqr(v2)')
            c = cfg.make_node('branch z')
            exit = cfg.make_node(stmts.null_stmt())

            cfg.make_edge(entry, a)
            cfg.make_edge(a, b)
            cfg.make_edge(b, c)
            cfg.make_edge(c, a, index=1)
            cfg.make_edge(c, exit, index=0)
            return cfg

        rvsdg = rvsdg_model.rvsdg(('v1', 'v2'))

        loop_body = rvsdg_model.rvsdg(('v1', 'v2'))
        dec = loop_body.add_opnode('dec', ('v1', ), ('v1', 'z'),
                                   ((None, 'v1'), ))
        mul = loop_body.add_opnode('sqr', ('v2', ), ('v2', ), ((None, 'v2'), ))
        tst = loop_body.add_selectnode(((0, ), (1, )), 'z', ('$repeat', ),
                                       (dec, 'z'))
        loop_body.add_result('v1', (dec, 'v1'))
        loop_body.add_result('v2', (mul, 'v2'))
        loop_body.add_result('$repeat', (tst, '$repeat'))
        loop = rvsdg.add_theta(loop_body, ((None, 'v1'), (None, 'v2')))
        rvsdg.add_result('v1', (loop, 'v1'))
        rvsdg.add_result('v2', (loop, 'v2'))
        #rvsdg_view.show(rvsdg)
        cfg = rvsdg2cfg.convert(rvsdg)
        #cfg_algorithm.prune(cfg)
        #cfg_view.show(cfg)
        self.assertTrue(cfg_algorithm.equivalent(cfg, refG()))
Ejemplo n.º 2
0
    def test_static_gamma(self):
        def refG():
            cfg = cfg_model.cfg()
            entry = cfg.make_node(stmts.null_stmt())
            l = cfg.make_node('let v3 := sub(v1, v2)')
            exit = cfg.make_node(stmts.null_stmt())
            cfg.make_edge(entry, l)
            cfg.make_edge(l, exit)
            return cfg

        rvsdg = rvsdg_model.rvsdg(('v1', 'v2'))
        static_decide = rvsdg.add_litnode((1, ), ('$r', ))
        alt1 = rvsdg_model.rvsdg(('v1', 'v2'))
        add = alt1.add_opnode('add', ('o1', 'o2'), ('v3', ),
                              ((None, 'v1'), (None, 'v2')))
        alt1.add_result('v3', (add, 'v3'))
        alt2 = rvsdg_model.rvsdg(('v1', 'v2'))
        add = alt2.add_opnode('sub', ('o1', 'o2'), ('v3', ),
                              ((None, 'v1'), (None, 'v2')))
        alt2.add_result('v3', (add, 'v3'))
        gamma = rvsdg.add_gamma((alt1, alt2), ((None, 'v1'), (None, 'v2')),
                                (static_decide, '$r'))
        rvsdg.add_result('v3', (gamma, 'v3'))
        #rvsdg_view.show(rvsdg)
        cfg = rvsdg2cfg.convert(rvsdg)
        cfg_algorithm.prune(cfg)
        #cfg_view.show(cfg)
        self.assertTrue(cfg_algorithm.equivalent(cfg, refG()))
Ejemplo n.º 3
0
    def test_multi_exit_theta(self):
        def refG():
            cfg = cfg_model.cfg()
            entry = cfg.make_node(stmts.null_stmt())
            a = cfg.make_node('let v2 := sqr(v2)')
            b = cfg.make_node('let c := cmp(v1, v2)')
            c = cfg.make_node('branch c')
            d = cfg.make_node('let r:= mov(v1)')
            e = cfg.make_node('let r:= mov(v2)')
            exit = cfg.make_node(stmts.null_stmt())

            cfg.make_edge(entry, a)
            cfg.make_edge(a, b)
            cfg.make_edge(b, c)
            cfg.make_edge(c, d, index=0)
            cfg.make_edge(c, a, index=1)
            cfg.make_edge(c, e, index=2)
            cfg.make_edge(d, exit)
            cfg.make_edge(e, exit)
            return cfg

        rvsdg = rvsdg_model.rvsdg(('v1', 'v2'))

        unused = rvsdg.add_litnode((0, ), ('$d', ))

        loop_body = rvsdg_model.rvsdg(('v1', 'v2', '$d'))
        mul = loop_body.add_opnode('sqr', ('v2', ), ('v2', ), ((None, 'v2'), ))
        compare = loop_body.add_opnode('cmp', ('v1', 'v2'), ('c'),
                                       ((None, 'v1'), (mul, 'v2')))
        tst = loop_body.add_selectnode(((0, 0), (1, 0), (0, 1)), 'c',
                                       ('$repeat', '$d'), (compare, 'c'))
        loop_body.add_result('v1', (None, 'v1'))
        loop_body.add_result('v2', (mul, 'v2'))
        loop_body.add_result('$d', (tst, '$d'))
        loop_body.add_result('$repeat', (tst, '$repeat'))
        loop = rvsdg.add_theta(loop_body,
                               ((None, 'v1'), (None, 'v2'), (unused, '$d')))

        alt1 = rvsdg_model.rvsdg(('v1', 'v2'))
        mov1 = alt1.add_opnode('mov', ('v1', ), ('r', ), ((None, 'v1'), ))
        alt1.add_result('r', (mov1, 'r'))
        alt2 = rvsdg_model.rvsdg(('v1', 'v2'))
        mov1 = alt2.add_opnode('mov', ('v2', ), ('r', ), ((None, 'v2'), ))
        alt2.add_result('r', (mov1, 'r'))
        gamma = rvsdg.add_gamma((alt1, alt2), ((loop, 'v1'), (loop, 'v2')),
                                (loop, '$d'))

        rvsdg.add_result('r', (gamma, 'r'))
        #rvsdg_view.show(rvsdg)
        cfg = rvsdg2cfg.convert(rvsdg)
        #cfg_algorithm.prune(cfg)
        #cfg_view.show(cfg)
        #cfg_view.show(refG())
        self.assertTrue(cfg_algorithm.equivalent(cfg, refG()))
Ejemplo n.º 4
0
    def _disabled_test_rvsdg_theta(self):
        G = rvsdg_model.rvsdg(('v1', ))

        body = rvsdg_model.rvsdg(('v1', ))
        dec = body.add_opnode('dec', ('v1', ), ('r', '$pred'),
                              ((None, 'v1'), ))
        body.add_result('v1', (dec, 'r'))
        body.add_result('$repeat', (dec, '$pred'))
        theta = G.add_theta(body, ((None, 'v1'), ))
        G.add_result('v1', (theta, 'v1'))

        svg = self._to_svg(figure.rvsdg.render_rvsdg_interior(G))
Ejemplo n.º 5
0
    def test_theta_display(self):
        G = rvsdg_model.rvsdg(('v1', ))

        body = rvsdg_model.rvsdg(('v1', ))
        dec = body.add_opnode('dec', ('v1', ), ('r', '$pred'),
                              ((None, 'v1'), ))
        body.add_result('v1', (dec, 'r'))
        body.add_result('$repeat', (dec, '$pred'))
        theta = G.add_theta(body, ((None, 'v1'), ))
        G.add_result('v1', (theta, 'v1'))

        rvsdg_view.make_gvg(G)
Ejemplo n.º 6
0
 def _simple_branch_refgraph(self):
     rvsdg = rvsdg_model.rvsdg(('P', ))
     a = rvsdg.add_opnode('a', ('P', ), ('p', ), ((None, 'P'), ))
     alt1 = rvsdg_model.rvsdg(('P', ))
     c = alt1.add_opnode('c', ('P', ), ('P', ), ((None, 'P'), ))
     alt1.add_result('P', (c, 'P'))
     alt2 = rvsdg_model.rvsdg(('P', ))
     d = alt2.add_opnode('d', ('P', ), ('P', ), ((None, 'P'), ))
     alt2.add_result('P', (d, 'P'))
     p = rvsdg.add_selectnode(((0, ), (1, )), 'p', ('$p', ), (a, 'p'))
     gamma = rvsdg.add_gamma([alt1, alt2], ((None, 'P'), ), (p, '$p'))
     rvsdg.add_result('P', (gamma, 'P'))
     return rvsdg
Ejemplo n.º 7
0
 def _linear_refgraph(self):
     rvsdg = rvsdg_model.rvsdg(('P', ))
     a = rvsdg.add_opnode('a', ('P', ), ('P', ), ((None, 'P'), ))
     l1 = rvsdg.add_litnode((1, ), ('x', ))
     l2 = rvsdg.add_litnode((2, 3), ('y', 'z'))
     c = rvsdg.add_opnode('c', ('P', 'x', 'y', 'z'), ('P'),
                          ((a, 'P'), (l1, 'x'), (l2, 'y'), (l2, 'z')))
     rvsdg.add_result('P', (c, 'P'))
     return rvsdg
Ejemplo n.º 8
0
    def test_simple_display(self):
        G = rvsdg_model.rvsdg(('v1', 'v2'))
        add = G.add_opnode('add', ('o1', 'o2'), ('sum', ),
                           ((None, 'v1'), (None, 'v2')))
        sub = G.add_opnode('sub', ('o1', 'o2'), ('dif', ),
                           ((None, 'v1'), (None, 'v2')))
        G.add_result('v1', (add, 'sum'))
        G.add_result('v2', (sub, 'dif'))

        rvsdg_view.make_gvg(G)
Ejemplo n.º 9
0
    def _disabled_test_rvsdg_gamma(self):
        G = rvsdg_model.rvsdg(('v1', 'v2'))
        c = G.add_opnode('gt', ('v1', 'v2'), ('pred', ),
                         ((None, 'v1'), (None, 'v2')))

        a1 = rvsdg_model.rvsdg(('v1', 'v2'))
        add = a1.add_opnode('add', ('o1', 'o2'), ('r', ),
                            ((None, 'v1'), (None, 'v2')))
        a1.add_result('r', (add, 'r'))

        a2 = rvsdg_model.rvsdg(('v1', 'v2'))
        sub = a2.add_opnode('sub', ('o1', 'o2'), ('r', ),
                            ((None, 'v1'), (None, 'v2')))
        a2.add_result('r', (sub, 'r'))

        g = G.add_gamma((a1, a2), ((None, 'v1'), (None, 'v2')), (c, 'pred'))
        G.add_result('r', (g, 'r'))

        svg = self._to_svg(figure.rvsdg.render_rvsdg_interior(G))
Ejemplo n.º 10
0
    def test_gamma_display(self):
        G = rvsdg_model.rvsdg(('v1', 'v2'))
        c = G.add_opnode('gt', ('v1', 'v2'), ('pred', ),
                         ((None, 'v1'), (None, 'v2')))

        a1 = rvsdg_model.rvsdg(('v1', 'v2'))
        add = a1.add_opnode('add', ('o1', 'o2'), ('r', ),
                            ((None, 'v1'), (None, 'v2')))
        a1.add_result('r', (add, 'r'))

        a2 = rvsdg_model.rvsdg(('v1', 'v2'))
        sub = a2.add_opnode('sub', ('o1', 'o2'), ('r', ),
                            ((None, 'v1'), (None, 'v2')))
        a2.add_result('r', (sub, 'r'))

        g = G.add_gamma((a1, a2), ((None, 'v1'), (None, 'v2')), (c, 'pred'))
        G.add_result('r', (g, 'r'))

        rvsdg_view.make_gvg(G)
Ejemplo n.º 11
0
    def test_simple1(self):
        rvsdg = rvsdg_model.rvsdg(('v1', 'v2'))
        add = rvsdg.add_opnode('add', ('o1', 'o2'), ('sum', ),
                               ((None, 'v1'), (None, 'v2')))
        sub = rvsdg.add_opnode('sub', ('o1', 'o2'), ('dif', ),
                               ((None, 'v1'), (None, 'v2')))
        rvsdg.add_result('v1', (add, 'sum'))
        rvsdg.add_result('v2', (sub, 'dif'))

        cfg = rvsdg2cfg.convert(rvsdg)
Ejemplo n.º 12
0
 def test_passthrough_removal(self):
     G = rvsdg_model.rvsdg(('v1', 'v2'))
     G.add_result('v1', (None, 'v1'))
     G.add_result('v2', (None, 'v2'))
     self.assertTrue(G.is_passthrough('v1', 'v1'))
     G.remove_passthrough('v1', 'v1')
     self.assertTrue(G.is_passthrough('v2', 'v2'))
     G.remove_passthrough('v2', 'v2')
     self.assertFalse(G.arguments)
     self.assertFalse(G.results)
     self.assertFalse(G.result_values)
Ejemplo n.º 13
0
    def test_gamma_normalize(self):
        G = rvsdg_model.rvsdg(('v1', 'v2'))
        c = G.add_opnode('gt', ('v1', 'v2'), ('pred', ),
                         ((None, 'v1'), (None, 'v2')))

        a1 = rvsdg_model.rvsdg(('v1', 'v2'))
        dec = a1.add_opnode('dec', ('v1', ), ('r', ), ((None, 'v1'), ))
        a1.add_result('v1', (dec, 'r'))
        a1.add_result('v2', (None, 'v2'))

        a2 = rvsdg_model.rvsdg(('v1', 'v2'))
        a2.add_result('v1', (None, 'v1'))
        a2.add_result('v2', (None, 'v2'))

        g = G.add_gamma((a1, a2), ((None, 'v1'), (None, 'v2')), (c, 'pred'))
        G.add_result('v1', (g, 'v1'))
        G.add_result('v2', (g, 'v2'))

        #rvsdg_view.show(G)
        G.normalize()
        self.assertEqual(G.get_resultvalue_by_name('v2'), (None, 'v2'))
Ejemplo n.º 14
0
    def test_dynamic_gamma(self):
        def refG():
            cfg = cfg_model.cfg()
            entry = cfg.make_node(stmts.null_stmt())
            c = cfg.make_node('let r := cmp(v1, v2)')
            b = cfg.make_node('branch r')
            alt1 = cfg.make_node('let v3 := add(v1, v2)')
            alt2 = cfg.make_node('let v3 := sub(v1, v2)')
            exit = cfg.make_node(stmts.null_stmt())

            cfg.make_edge(entry, c)
            cfg.make_edge(c, b)
            cfg.make_edge(b, alt1, index=0)
            cfg.make_edge(b, alt2, index=1)
            cfg.make_edge(alt1, exit)
            cfg.make_edge(alt2, exit)
            return cfg

        rvsdg = rvsdg_model.rvsdg(('v1', 'v2'))
        compare = rvsdg.add_opnode('cmp', ('a', 'b'), ('r', ),
                                   ((None, 'v1'), (None, 'v2')))
        dynamic_decide = rvsdg.add_selectnode(((0, ), (1, )), 'r', ('$r', ),
                                              (compare, 'r'))
        alt1 = rvsdg_model.rvsdg(('v1', 'v2'))
        add = alt1.add_opnode('add', ('o1', 'o2'), ('v3', ),
                              ((None, 'v1'), (None, 'v2')))
        alt1.add_result('v3', (add, 'v3'))
        alt2 = rvsdg_model.rvsdg(('v1', 'v2'))
        add = alt2.add_opnode('sub', ('o1', 'o2'), ('v3', ),
                              ((None, 'v1'), (None, 'v2')))
        alt2.add_result('v3', (add, 'v3'))
        gamma = rvsdg.add_gamma((alt1, alt2), ((None, 'v1'), (None, 'v2')),
                                (dynamic_decide, '$r'))
        rvsdg.add_result('v3', (gamma, 'v3'))
        #rvsdg_view.show(rvsdg)
        cfg = rvsdg2cfg.convert(rvsdg)
        cfg_algorithm.prune(cfg)
        #cfg_view.show(cfg)
        self.assertTrue(cfg_algorithm.equivalent(cfg, refG()))
Ejemplo n.º 15
0
    def _inconsistent_merge_branch_refgraph(self, swap):
        rvsdg = rvsdg_model.rvsdg(('P', ))
        a = rvsdg.add_opnode('a', ('P', ), (
            'x',
            'y',
        ), ((None, 'P'), ))

        alt0 = rvsdg_model.rvsdg(('P', 'y'))

        alt00 = rvsdg_model.rvsdg(('P', ))
        n = alt00.add_opnode('e', ('P', ), ('P', ), ((None, 'P'), ))
        l = alt00.add_litnode((1 if not swap else 0, ), ('$p', ))
        alt00.add_result('P', (n, 'P'))
        alt00.add_result('$p', (l, '$p'))

        alt01 = rvsdg_model.rvsdg(('P', ))
        n = alt01.add_opnode('f', ('P', ), ('P', ), ((None, 'P'), ))
        l = alt01.add_litnode((0 if not swap else 1, ), ('$p', ))
        alt01.add_result('P', (n, 'P'))
        alt01.add_result('$p', (l, '$p'))

        alt0y = alt0.add_selectnode(((0, ), (1, )), 'y', ('$p', ), (None, 'y'))
        gamma = alt0.add_gamma([alt00, alt01], ((None, 'P'), ), (alt0y, '$p'))

        alt0.add_result('P', (gamma, 'P'))
        alt0.add_result('$p', (gamma, '$p'))

        alt1 = rvsdg_model.rvsdg(('P', 'y'))
        n = alt1.add_opnode('d', ('P', ), ('P', ), ((None, 'P'), ))
        l = alt1.add_litnode((1 if not swap else 0, ), ('$p', ))
        alt1.add_result('P', (n, 'P'))
        alt1.add_result('$p', (l, '$p'))

        xp = rvsdg.add_selectnode(((0, ), (1, )), 'x', ('$p', ), (a, 'x'))
        gamma = rvsdg.add_gamma([alt0, alt1], ((None, 'P'), (a, 'y')),
                                (xp, '$p'))

        alt0 = rvsdg_model.rvsdg(('P', ))
        alt0.add_result('P', (None, 'P'))

        alt1 = rvsdg_model.rvsdg(('P', ))
        n = alt1.add_opnode('g', ('P', ), ('P', ), ((None, 'P'), ))
        alt1.add_result('P', (n, 'P'))

        gamma = rvsdg.add_gamma([alt0, alt1] if not swap else [alt1, alt0],
                                ((gamma, 'P'), ), (gamma, '$p'))
        h = rvsdg.add_opnode('h', ('P', ), ('P', ), ((gamma, 'P'), ))

        rvsdg.add_result('P', (h, 'P'))
        return rvsdg
Ejemplo n.º 16
0
    def _disabled_test_rvdsg_opnode(self):
        r = rvsdg_model.rvsdg(('S', ))
        n = r.add_opnode('read', ('S', ), ('S', 'x'), ((None, 'S'), ))

        svg = self._to_svg(figure.rvsdg.render_opnode(n))
        expected = \
         '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n' + \
         '<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg">\n' + \
         '<polygon points="0.000000,0.000000 29.200000,0.000000 29.200000,14.000000 0.000000,14.000000 0.000000,0.000000" stroke="black" fill="none" />\n' + \
         '<text x="14.600000" y="9.666667" font-family="Courier,monospace" font-size="10" text-anchor="middle">S</text>\n' + \
         '<polygon points="0.000000,14.000000 29.200000,14.000000 29.200000,28.000000 0.000000,28.000000 0.000000,14.000000" stroke="black" fill="none" />\n' + \
         '<text x="14.600000" y="23.666667" font-family="Courier,monospace" font-size="10" text-anchor="middle">read</text>\n' + \
         '<polygon points="0.000000,28.000000 14.600000,28.000000 14.600000,42.000000 0.000000,42.000000 0.000000,28.000000" stroke="black" fill="none" />\n' + \
         '<text x="7.300000" y="37.666667" font-family="Courier,monospace" font-size="10" text-anchor="middle">S</text>\n' + \
         '<polygon points="14.600000,28.000000 29.200000,28.000000 29.200000,42.000000 14.600000,42.000000 14.600000,28.000000" stroke="black" fill="none" />\n' + \
         '<text x="21.900000" y="37.666667" font-family="Courier,monospace" font-size="10" text-anchor="middle">x</text>\n' + \
         '</svg>\n'
        self.assertEqual(expected, svg)
Ejemplo n.º 17
0
    def _disabled_test_simple_rvsdg(self):
        G = rvsdg_model.rvsdg(('v1', 'v2'))
        add = G.add_opnode('add', ('o1', 'o2'), ('sum', ),
                           ((None, 'v1'), (None, 'v2')))
        sub = G.add_opnode('sub', ('o1', 'o2'), ('dif', ),
                           ((None, 'v1'), (None, 'v2')))
        G.add_result('v1', (add, 'sum'))
        G.add_result('v2', (sub, 'dif'))

        svg = self._to_svg(figure.rvsdg.render_rvsdg_interior(G))
        expected = \
         '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n' + \
         '<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg">\n' + \
         '<polygon points="2.500000,22.500000 20.100000,22.500000 20.100000,36.500000 2.500000,36.500000 2.500000,22.500000" stroke="black" fill="none" />\n' + \
         '<text x="11.300000" y="32.166667" font-family="Courier,monospace" font-size="10" text-anchor="middle">o1</text>\n' + \
         '<polygon points="20.100000,22.500000 37.700000,22.500000 37.700000,36.500000 20.100000,36.500000 20.100000,22.500000" stroke="black" fill="none" />\n' + \
         '<text x="28.900000" y="32.166667" font-family="Courier,monospace" font-size="10" text-anchor="middle">o2</text>\n' + \
         '<polygon points="2.500000,36.500000 37.700000,36.500000 37.700000,50.500000 2.500000,50.500000 2.500000,36.500000" stroke="black" fill="none" />\n' + \
         '<text x="20.100000" y="46.166667" font-family="Courier,monospace" font-size="10" text-anchor="middle">add</text>\n' + \
         '<polygon points="2.500000,50.500000 37.700000,50.500000 37.700000,64.500000 2.500000,64.500000 2.500000,50.500000" stroke="black" fill="none" />\n' + \
         '<text x="20.100000" y="60.166667" font-family="Courier,monospace" font-size="10" text-anchor="middle">sum</text>\n' + \
         '<polygon points="42.700000,22.500000 60.300000,22.500000 60.300000,36.500000 42.700000,36.500000 42.700000,22.500000" stroke="black" fill="none" />\n' + \
         '<text x="51.500000" y="32.166667" font-family="Courier,monospace" font-size="10" text-anchor="middle">o1</text>\n' + \
         '<polygon points="60.300000,22.500000 77.900000,22.500000 77.900000,36.500000 60.300000,36.500000 60.300000,22.500000" stroke="black" fill="none" />\n' + \
         '<text x="69.100000" y="32.166667" font-family="Courier,monospace" font-size="10" text-anchor="middle">o2</text>\n' + \
         '<polygon points="42.700000,36.500000 77.900000,36.500000 77.900000,50.500000 42.700000,50.500000 42.700000,36.500000" stroke="black" fill="none" />\n' + \
         '<text x="60.300000" y="46.166667" font-family="Courier,monospace" font-size="10" text-anchor="middle">sub</text>\n' + \
         '<polygon points="42.700000,50.500000 77.900000,50.500000 77.900000,64.500000 42.700000,64.500000 42.700000,50.500000" stroke="black" fill="none" />\n' + \
         '<text x="60.300000" y="60.166667" font-family="Courier,monospace" font-size="10" text-anchor="middle">dif</text>\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 31.400000,7.500000 -20.100000,15.000000" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 13.275096,17.906636 -1.975096,4.593364 4.965518,-0.586199" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 49.000000,7.500000 -20.100000,15.000000" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 30.875096,17.906636 -1.975096,4.593364 4.965518,-0.586199" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 31.400000,7.500000 20.100000,15.000000" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 46.534482,21.913801 4.965518,0.586199 -1.975096,-4.593364" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 49.000000,7.500000 20.100000,15.000000" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 64.134482,21.913801 4.965518,0.586199 -1.975096,-4.593364" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 20.100000,64.500000 -0.000000,15.000000" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 17.600000,75.169873 2.500000,4.330127 2.500000,-4.330127" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 60.300000,64.500000 -0.000000,15.000000" />\n' + \
         '<path style="stroke:#000000;stroke-width:1;fill:none" d="m 57.800000,75.169873 2.500000,4.330127 2.500000,-4.330127" />\n' + \
         '</svg>\n'
Ejemplo n.º 18
0
def regularize_cfg_acyclic_region(cfg, vars):
    rvsdg_region = rvsdg_model.rvsdg(vars)
    var_mapping = dict((v, (None, v)) for v in vars)
    regularize_cfg_acyclic(cfg, rvsdg_region, var_mapping)
    return rvsdg_region, var_mapping
Ejemplo n.º 19
0
    def test_multi_entry_theta(self):
        def refG():
            cfg = cfg_model.cfg()
            entry = cfg.make_node(stmts.null_stmt())
            a = cfg.make_node('let c := gt(v1, v2)')
            b = cfg.make_node('branch c')
            c1 = cfg.make_node('let v1 := sub(v1, v2)')
            c2 = cfg.make_node('let v2 := sub(v2, v1)')
            d = cfg.make_node('let c := cmp(v1, v2)')
            e = cfg.make_node('branch c')
            exit = cfg.make_node(stmts.null_stmt())

            cfg.make_edge(entry, a)
            cfg.make_edge(a, b)
            cfg.make_edge(b, c1, index=0)
            cfg.make_edge(b, c2, index=1)
            cfg.make_edge(c1, d)
            cfg.make_edge(c2, d)
            cfg.make_edge(d, e)
            cfg.make_edge(e, c1, index=0)
            cfg.make_edge(e, c2, index=2)
            cfg.make_edge(e, exit, index=1)
            return cfg

        rvsdg = rvsdg_model.rvsdg(('v1', 'v2'))

        loop_body = rvsdg_model.rvsdg(('v1', 'v2', '$d'))
        alt1 = rvsdg_model.rvsdg(('v1', 'v2'))
        sub1 = alt1.add_opnode('sub', ('v1', 'v2'), ('v1', ),
                               ((None, 'v1'), (None, 'v2')))
        alt1.add_result('v1', (sub1, 'v1'))
        alt1.add_result('v2', (None, 'v2'))
        alt2 = rvsdg_model.rvsdg(('v1', 'v2'))
        sub2 = alt2.add_opnode('sub', ('v2', 'v1'), ('v2', ),
                               ((None, 'v2'), (None, 'v1')))
        alt2.add_result('v1', (None, 'v1'))
        alt2.add_result('v2', (sub2, 'v2'))
        gamma = loop_body.add_gamma((alt1, alt2), ((None, 'v1'), (None, 'v2')),
                                    (None, '$d'))

        compare = loop_body.add_opnode('cmp', ('v1', 'v2'), ('c'),
                                       ((gamma, 'v1'), (gamma, 'v2')))
        tst = loop_body.add_selectnode(((1, 0), (0, 0), (1, 1)), 'c',
                                       ('$repeat', '$d'), (compare, 'c'))

        loop_body.add_result('v1', (gamma, 'v1'))
        loop_body.add_result('v2', (gamma, 'v2'))
        loop_body.add_result('$d', (tst, '$d'))
        loop_body.add_result('$repeat', (tst, '$repeat'))

        compare = rvsdg.add_opnode('gt', ('v1', 'v2'), ('c'),
                                   ((None, 'v1'), (None, 'v2')))
        tst = rvsdg.add_selectnode(((0, ), (1, )), 'c', ('$d', ),
                                   (compare, 'c'))
        loop = rvsdg.add_theta(loop_body,
                               ((None, 'v1'), (None, 'v2'), (tst, '$d')))

        rvsdg.add_result('v1', (loop, 'v1'))
        rvsdg.add_result('v2', (loop, 'v2'))
        #rvsdg_view.show(rvsdg)
        cfg = rvsdg2cfg.convert(rvsdg)
        #cfg_algorithm.prune(cfg)
        #cfg_view.show(cfg)
        #cfg_view.show(refG())
        self.assertTrue(cfg_algorithm.equivalent(cfg, refG()))
Ejemplo n.º 20
0
 def _example_graph1(self):
     G = rvsdg_model.rvsdg(('arg1', 'arg2'))
     return G
Ejemplo n.º 21
0
 def test_litnode(self):
     G = rvsdg_model.rvsdg(())
     n = G.add_litnode((1, ), ('$r', ))
     self.assertEquals(n.output_names, ('$r', ))