Author: Richard Plangger <[email protected]>
Branch: vecopt-merge
Changeset: r80152:32dc0789de74
Date: 2015-10-13 09:52 +0200
http://bitbucket.org/pypy/pypy/changeset/32dc0789de74/
Log: guard dependency construction moved to the first pass
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
@@ -133,9 +133,6 @@
self.emitted = False
self.schedule_position = -1
self.priority = 0
- # save the operation that produces the result for the first argument
- # only for guard_true/guard_false
- self.guard_bool_bool_node = None
self._stack = False
def is_imaginary(self):
@@ -625,11 +622,9 @@
nonpure.edge_to(node, failarg=True, label="nonpure")
tracker.non_pure = []
self.guards.append(node)
+ self.build_guard_dependencies(node, tracker)
else:
self.build_non_pure_dependencies(node, tracker)
- # pass 2 correct guard dependencies
- for guard_node in self.guards:
- self.build_guard_dependencies(guard_node, tracker)
def guard_argument_protection(self, guard_node, tracker):
""" the parameters the guard protects are an indicator for
@@ -642,27 +637,15 @@
"""
guard_op = guard_node.getoperation()
guard_opnum = guard_op.getopnum()
- if guard_opnum in (rop.GUARD_TRUE, rop.GUARD_FALSE):
- for dep in guard_node.depends():
- op = dep.to.getoperation()
- if op.returns_bool_result() and op is guard_op.getarg(0):
- guard_node.guard_bool_bool_node = dep.to
- for arg in op.getarglist():
- if not arg.is_constant():
- self.guard_exit_dependence(guard_node, arg,
tracker)
- break
- else:
- # in this case the guard protects an integer
- # example:
- # i = int_and(j, 255)
- # guard_true(i) [...]
- pass
- elif guard_op.is_foldable_guard():
- # these guards carry their protected variables directly as a
parameter
- for arg in guard_node.getoperation().getarglist():
- if not arg.is_constant():
- self.guard_exit_dependence(guard_node, arg, tracker)
- elif guard_opnum == rop.GUARD_NOT_FORCED_2:
+ for arg in guard_op.getarglist():
+ if not arg.is_constant() and arg.type not in ('i','f'):
+ # redefine pointers, consider the following example
+ # guard_nonnull(r1)
+ # i1 = getfield(r1, ...)
+ # guard must be emitted before the getfield, thus
+ # redefine r1 at guard_nonnull
+ tracker.define(arg, guard_node)
+ if guard_opnum == rop.GUARD_NOT_FORCED_2:
# must be emitted before finish, thus delayed the longest
guard_node.setpriority(-10)
elif guard_opnum in (rop.GUARD_OVERFLOW, rop.GUARD_NO_OVERFLOW):
@@ -695,7 +678,7 @@
else:
raise AssertionError("(no)exception/not_forced: not op raises
for them")
else:
- pass # not invalidated, early exit, future condition!
+ pass # not invalidated, future condition!
def guard_exit_dependence(self, guard_node, var, tracker):
def_node = tracker.definition(var)
@@ -721,7 +704,7 @@
return
# handle fail args
if guard_op.getfailargs():
- for arg in guard_op.getfailargs():
+ for i,arg in enumerate(guard_op.getfailargs()):
if arg is None:
continue
if not tracker.is_defined(arg):
@@ -748,6 +731,7 @@
tracker.depends_on_arg(index_var, node)
else:
tracker.depends_on_arg(cobj, node)
+ break
else:
for arg, argcell, destroyed in node.side_effect_arguments():
if argcell is not None:
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
@@ -170,7 +170,7 @@
assert dependency is not None or node_b.getopnum() ==
rop.JUMP, \
" it is expected that instruction at index" + \
" %s depends on instr on index %s but it does not.\n%s"
\
- % (node_a, node_b, graph)
+ % (node_a.getindex(), node_b.getindex(), graph)
elif dependency is not None:
dependencies.remove(dependency)
assert dependencies == [], \
@@ -489,31 +489,33 @@
def test_dependency_complex_trace(self):
graph = self.build_dependency("""
- [i0, i1, i2, i3, i4, i5, i6, i7] # 0:
1,2,3,4,6,7,8,9,10,12,14,17,19,20,21
+ [i0, i1, i2, i3, i4, i5, i6, i7] # 0:
i9 = int_mul(i0, 8) # 1: 2
i10 = raw_load_i(i3, i9, descr=arraydescr) # 2: 5, 10
i11 = int_mul(i0, 8) # 3: 4
i12 = raw_load_i(i4, i11, descr=arraydescr) # 4: 5,10
i13 = int_add(i10, i12) # 5: 7,10
i14 = int_mul(i0, 8) # 6: 7
- raw_store(i5, i14, i13, descr=arraydescr) # 7: 21
+ raw_store(i3, i14, i13, descr=arraydescr) # 7: 10,12,20
i16 = int_add(i0, 1) # 8: 9,10,11,13,16,18
i17 = int_lt(i16, i7) # 9: 10
- guard_true(i17) [i7, i13, i5, i4, i3, i12, i10, i16] # 10:
11,13,16,18,19,21
- i18 = int_mul(i16, 8) # 11:
- i19 = raw_load_i(i3, i18, descr=arraydescr) # 12:
- i20 = int_mul(i16, 8) # 13:
- i21 = raw_load_i(i4, i20, descr=arraydescr) # 14:
- i22 = int_add(i19, i21) # 15:
- i23 = int_mul(i16, 8) # 16:
- raw_store(i5, i23, i22, descr=arraydescr) # 17:
- i24 = int_add(i16, 1) # 18:
- i25 = int_lt(i24, i7) # 19:
+ guard_true(i17) [i7, i13, i5, i4, i3, i12, i10, i16] # 10: 17, 20
+ i18 = int_mul(i16, 9) # 11: 12
+ i19 = raw_load_i(i3, i18, descr=arraydescr) # 12: 15, 20
+ i20 = int_mul(i16, 8) # 13: 14
+ i21 = raw_load_i(i4, i20, descr=arraydescr) # 14: 15, 20
+ i22 = int_add(i19, i21) # 15: 17, 20
+ i23 = int_mul(i16, 8) # 16: 17
+ raw_store(i5, i23, i22, descr=arraydescr) # 17: 20
+ i24 = int_add(i16, 1) # 18: 19, 20
+ i25 = int_lt(i24, i7) # 19: 20
guard_true(i25) [i7, i22, i5, i4, i3, i21, i19, i24] # 20:
jump(i24, i19, i21, i3, i4, i5, i22, i7) # 21:
""")
- self.assert_dependencies(graph, full_check=False)
+ self.assert_dependencies(graph, full_check=True)
self.assert_dependent(graph, 2,12)
+ self.assert_dependent(graph, 7,12)
+ self.assert_dependent(graph, 4,12)
def test_getfield(self):
graph = self.build_dependency("""
@@ -529,7 +531,7 @@
def test_cyclic(self):
graph = self.build_dependency("""
[p0, p1, p5, p6, p7, p9, p11, p12] # 0: 1,6
- p13 = getfield_gc_r(p9) # 1: 2,4,5
+ p13 = getfield_gc_r(p9) # 1: 2,5
guard_nonnull(p13) [] # 2: 4,5
i14 = getfield_gc_i(p9) # 3: 5
p15 = getfield_gc_r(p13) # 4: 5
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit