Author: Richard Plangger <[email protected]>
Branch: vecopt-merge
Changeset: r79586:50d4f3bd716c
Date: 2015-09-10 19:15 +0200
http://bitbucket.org/pypy/pypy/changeset/50d4f3bd716c/
Log: finished the new dependency model. label and jump are tracked no
more. this greatly reduces the edge count in the graph
diff --git a/rpython/jit/metainterp/optimizeopt/dependency.py
b/rpython/jit/metainterp/optimizeopt/dependency.py
--- a/rpython/jit/metainterp/optimizeopt/dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/dependency.py
@@ -450,32 +450,30 @@
def definition(self, arg, node=None, argcell=None):
if arg.is_constant():
return None
- if arg.is_inputarg():
+ def_chain = self.defs.get(arg,None)
+ if not def_chain:
return None
- def_chain = self.defs[arg]
- if len(def_chain) == 1:
- return def_chain[0][0]
+ if not argcell:
+ return def_chain[-1][0]
else:
- if not argcell:
- return def_chain[-1][0]
- else:
- assert node is not None
- i = len(def_chain)-1
- try:
- mref = node.memory_ref
- while i >= 0:
- def_node = def_chain[i][0]
- oref = def_node.memory_ref
- if oref is not None and mref.alias(oref):
- return def_node
- elif oref is None:
- return def_node
- i -= 1
- except KeyError:
- # when a key error is raised, this means
- # no information is available, safe default
- pass
- return def_chain[-1][0]
+ assert node is not None
+ i = len(def_chain)-1
+ try:
+ mref = node.memory_ref
+ while i >= 0:
+ def_node = def_chain[i][0]
+ oref = def_node.memory_ref
+ if oref is not None and mref.alias(oref):
+ return def_node
+ elif oref is None:
+ return def_node
+ i -= 1
+ return None
+ except KeyError:
+ # when a key error is raised, this means
+ # no information is available, safe default
+ pass
+ return def_chain[-1][0]
def depends_on_arg(self, arg, to, argcell=None):
try:
@@ -703,7 +701,9 @@
# handle fail args
if guard_op.getfailargs():
for arg in guard_op.getfailargs():
- if arg is None or not tracker.is_defined(arg):
+ if arg is None:
+ continue
+ if not tracker.is_defined(arg):
continue
try:
for at in tracker.redefinitions(arg):
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_dependency.py
@@ -333,7 +333,7 @@
"""
self.assert_dependencies(ops, full_check=True)
- def test_not_forced(self):
+ def test_call_not_forced_exception(self):
ops="""
[p0, p1, i2, i5] # 0: 1,2,4?,5,6
i4 = call_i(i5, i2, descr=nonwritedescr) # 1: 2,4,6
@@ -344,8 +344,8 @@
jump(p2, p1, i2, i5) # 6:
"""
self.assert_dependencies(ops, full_check=True)
+ assert self.last_graph.nodes[1].priority == 100
assert self.last_graph.nodes[2].priority == 100
- assert self.last_graph.nodes[3].priority == 100
def test_setarrayitem_dependency(self):
ops="""
@@ -368,7 +368,6 @@
"""
self.assert_dependencies(ops, full_check=True)
self.assert_dependent(1,2)
- self.assert_dependent(0,3)
def test_setarrayitem_dont_depend_with_memref_info(self):
ops="""
@@ -424,7 +423,7 @@
def test_cyclic(self):
trace = """
[p0, p1, p5, p6, p7, p9, p11, p12] # 0: 1,6
- guard_early_exit() [] # 1: 2,4,6,7
+ guard_early_exit() [] # 1:
p13 = getfield_gc_r(p9) # 2: 3,5,6
guard_nonnull(p13) [] # 3: 5,6
i14 = getfield_gc_i(p9) # 4: 6
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit