Author: Richard Plangger <[email protected]>
Branch: vecopt2
Changeset: r77059:a014b8f35628
Date: 2015-03-04 11:03 +0100
http://bitbucket.org/pypy/pypy/changeset/a014b8f35628/
Log: added a file to implement the dependency graph and the first failing
test for it
diff --git a/.gitignore b/.gitignore
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,14 @@
.hg
.svn
+# VIM
+*.swp
+*.swo
+
*.pyc
*.pyo
*~
+__pycache__/
bin/pypy-c
include/*.h
@@ -22,4 +27,5 @@
pypy/translator/goal/pypy-c
pypy/translator/goal/target*-c
release/
+!pypy/tool/release/
rpython/_cache/
diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py
b/rpython/jit/metainterp/optimizeopt/dependency.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -0,0 +1,35 @@
+
+from rpython.jit.metainterp.resoperation import rop
+
+class Dependency(object):
+ def __init__(self, index):
+ self.index = index
+
+class CrossIterationDependency(Dependency):
+ pass
+
+class DependencyGraph(object):
+ """ A graph that represents one of the following dependencies:
+ * True dependency
+ * Anti dependency
+ * Ouput dependency
+ Representation is an adjacent list. The number of edges between the
+ vertices is expected to be small.
+ """
+ def __init__(self, optimizer, loop):
+ self.loop = loop
+ self.operations = loop.operations
+ self.optimizer = optimizer
+ self.adjacent_list = [ [] ] * len(self.operations)
+
+ def instr_dependency(self, from_instr_idx, to_instr_idx):
+ """ Does there exist a dependency from the instruction to another?
+ Returns None if there is no dependency or the Dependency object in
+ any other case.
+ """
+ edges = self.adjacent_list[from_instr_idx]
+ for edge in edges:
+ if edge.index == to_instr_idx:
+ return edge
+ return None
+
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
new file mode 100644
--- /dev/null
+++ b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
@@ -0,0 +1,54 @@
+import py
+from rpython.rlib.objectmodel import instantiate
+from rpython.jit.metainterp.optimizeopt.test.test_util import (
+ LLtypeMixin, BaseTest, FakeMetaInterpStaticData,
convert_old_style_to_targets)
+from rpython.jit.metainterp.history import TargetToken, JitCellToken
+from rpython.jit.metainterp.optimizeopt import optimize_trace
+import rpython.jit.metainterp.optimizeopt.optimizer as optimizeopt
+import rpython.jit.metainterp.optimizeopt.virtualize as virtualize
+from rpython.jit.metainterp.optimizeopt.dependency import DependencyGraph
+from rpython.jit.metainterp.optimize import InvalidLoop
+from rpython.jit.metainterp.history import ConstInt, BoxInt,
get_const_ptr_for_string
+from rpython.jit.metainterp import executor, compile, resume
+from rpython.jit.metainterp.resoperation import rop, ResOperation
+from rpython.rlib.rarithmetic import LONG_BIT
+
+class BaseTestDependecyGraph(BaseTest):
+
+ enable_opts =
"intbounds:rewrite:virtualize:string:earlyforce:pure:heap:vectorize"
+
+ def build_dependency(self, ops):
+ loop = self.parse(ops, postprocess=self.postprocess)
+ token = JitCellToken()
+ loop.operations = [ResOperation(rop.LABEL, loop.inputargs, None,
+ descr=TargetToken(token))] + loop.operations
+ if loop.operations[-1].getopnum() == rop.JUMP:
+ loop.operations[-1].setdescr(token)
+ #self._do_optimize_loop(loop, call_pure_results, export_state=False)
+ #print '\n'.join([str(o) for o in loop.operations])
+ #self.assert_equal(loop, expected)
+
+ return DependencyGraph(None, loop)
+
+ def assert_def_use(self, graph, from_instr_index, to_instr_index):
+ assert graph.instr_dependency(from_instr_index,
+ to_instr_index) is not None, \
+ " it is expected that instruction at index" + \
+ " %d depend on instr on index %d but it is not" \
+ % (from_instr_index, to_instr_index)
+
+class TestDependencyGraph(BaseTestDependecyGraph):
+ def test_simple(self):
+ ops = """
+ []
+ i1 = int_add(1,1)
+ i2 = int_add(i1,1)
+ guard_value(i2,3) []
+ jump()
+ """
+ dep_graph = self.build_dependency(ops)
+ self.assert_def_use(dep_graph, 1, 2)
+ self.assert_def_use(dep_graph, 2, 3)
+
+class TestLLtype(TestDependencyGraph, LLtypeMixin):
+ pass
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit