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()))
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()))
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()))
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))
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)
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
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
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)
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))
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)
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)
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)
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'))
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()))
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
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)
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'
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
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()))
def _example_graph1(self): G = rvsdg_model.rvsdg(('arg1', 'arg2')) return G
def test_litnode(self): G = rvsdg_model.rvsdg(()) n = G.add_litnode((1, ), ('$r', )) self.assertEquals(n.output_names, ('$r', ))