[pypy-commit] pypy vecopt-merge: typo name should be name1, added test case that creates cycle in dependency
plan_rich
noreply at buildbot.pypy.org
Tue Aug 18 14:40:04 CEST 2015
Author: Richard Plangger <rich at pasra.at>
Branch: vecopt-merge
Changeset: r79039:61d63941604d
Date: 2015-08-18 14:40 +0200
http://bitbucket.org/pypy/pypy/changeset/61d63941604d/
Log: typo name should be name1, added test case that creates cycle in
dependency
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
@@ -69,6 +69,19 @@
def cut_off_at(self, index):
self.path = self.path[:index]
+ def check_acyclic(self):
+ """NOT_RPYTHON"""
+ seen = set()
+ for segment in self.path:
+ if segment in seen:
+ print "path:"
+ for segment in self.path:
+ print " ->", segment
+ print ""
+ assert 0, "segment %s was already seen. this makes the path cyclic!" % segment
+ else:
+ seen.add(segment)
+
def clone(self):
return Path(self.path[:])
@@ -107,6 +120,8 @@
def edge_to(self, to, arg=None, failarg=False, label=None):
if self is to:
return
+ if self.getindex() > to.getindex():
+ import pdb; pdb.set_trace()
dep = self.depends_on(to)
if not dep:
#if force or self.independent(idx_from, idx_to):
@@ -805,7 +820,7 @@
def operation_{name}(self, op, node):
descr = op.getdescr()
idx_ref = self.get_or_create(op.getarg(1))
- if descr.is_array_of_primitives():
+ if descr and descr.is_array_of_primitives():
node.memory_ref = MemoryRef(op, idx_ref, {raw_access})
self.memory_refs[node] = node.memory_ref
"""
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
@@ -356,5 +356,19 @@
self.assert_dependencies(ops, full_check=False)
self.assert_dependent(2,12)
+ def test_cyclic(self):
+ pass
+ trace = """
+ [p0, p1, p5, p6, p7, p9, p11, p12] # 0: 1,6
+ guard_early_exit() [] # 1: 2,6,7
+ p13 = getfield_gc(p9) # 2: 3,4,5,6
+ guard_nonnull(p13) [] # 3: 4,5,6
+ i14 = getfield_gc(p9) # 4: 5,6,7
+ p15 = getfield_gc(p13) # 5: 6
+ guard_class(p15, 140737326900656) [p1, p0, p9, i14, p15, p13, p5, p6, p7] # 6: 7
+ jump(p0,p1,p5,p6,p7,p9,p11,p12) # 7:
+ """
+ self.assert_dependencies(trace, full_check=True)
+
class TestLLtype(BaseTestDependencyGraph, LLtypeMixin):
pass
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_vectorize.py
@@ -90,6 +90,7 @@
guard.setfailargs([])
guard.setdescr(compile.ResumeAtLoopHeaderDescr())
loop.operations.insert(idx+1, guard)
+ self.show_dot_graph(DependencyGraph(opt.loop), "original_" + self.test_name)
opt.analyse_index_calculations()
if opt.dependency_graph is not None:
self.show_dot_graph(opt.dependency_graph, "early_exit_" + self.test_name)
@@ -1383,5 +1384,116 @@
opt = self.schedule(self.parse_loop(trace))
self.debug_print_operations(opt.loop)
+ def test_1(self):
+ trace = """
+ [p0, p1, p5, p6, p7, p9, p11, p12]
+ debug_merge_point(0, 0, '<code object <module>. file '/home/rich/fijal.py'. line 2> #34 FOR_ITER')
+ guard_early_exit(descr=<ResumeAtLoopHeaderDescr object at 0x7ffff7e3cc80>) [p1, p0, p5, p6, p7, p9]
+ p13 = getfield_gc(p9, descr=<FieldP pypy.objspace.std.iterobject.W_AbstractSeqIterObject.inst_w_seq 16>)
+ guard_nonnull(p13, descr=<ResumeGuardNonnullDescr object at 0x7ffff7e3cce0>) [p1, p0, p9, p13, p5, p6, p7]
+ i14 = getfield_gc(p9, descr=<FieldS pypy.objspace.std.iterobject.W_AbstractSeqIterObject.inst_index 8>)
+ p15 = getfield_gc(p13, descr=<FieldP pypy.objspace.std.listobject.W_ListObject.inst_strategy 16>)
+ guard_class(p15, 140737326900656, descr=<ResumeGuardClassDescr object at 0x7ffff7e3cd40>) [p1, p0, p9, i14, p15, p13, p5, p6, p7]
+ p17 = getfield_gc(p13, descr=<FieldP pypy.objspace.std.listobject.W_ListObject.inst_lstorage 8>)
+ i18 = getfield_gc_pure(p17, descr=<FieldS tuple1.item0 8>)
+ i20 = int_lt(i14, 0)
+ guard_false(i20, descr=<ResumeGuardFalseDescr object at 0x7ffff7e3cda0>) [p1, p0, p9, i14, i18, p5, p6, p7]
+ i21 = int_ge(i14, i18)
+ guard_false(i21, descr=<ResumeGuardFalseDescr object at 0x7ffff7e3ce00>) [p1, p0, p9, i14, p5, p6, p7]
+ i23 = int_add(i14, 1)
+ debug_merge_point(0, 0, '<code object <module>. file '/home/rich/fijal.py'. line 2> #37 STORE_NAME')
+ p24 = getfield_gc(p5, descr=<FieldP pypy.interpreter.pyframe.FrameDebugData.inst_w_locals 48>)
+ setfield_gc(p9, i23, descr=<FieldS pypy.objspace.std.iterobject.W_AbstractSeqIterObject.inst_index 8>)
+ guard_value(p24, 25, descr=<ResumeGuardValueDescr object at 0x7ffff7e3ce60>) [p1, p0, p24, p5, p6, p7, p9, i14]
+ p26 = getfield_gc(p24, descr=<FieldP pypy.objspace.std.dictmultiobject.W_DictMultiObject.inst_strategy 16>)
+ guard_value(p26, 27, descr=<ResumeGuardValueDescr object at 0x7ffff7e3cec0>) [p1, p0, p26, p24, p5, p6, p7, p9, i14]
+ guard_not_invalidated(descr=<ResumeGuardNotInvalidated object at 0x7ffff7e3cf20>) [p1, p0, p24, p5, p6, p7, p9, i14]
+ debug_merge_point(0, 0, '<code object <module>. file '/home/rich/fijal.py'. line 2> #40 LOAD_NAME')
+ debug_merge_point(0, 0, '<code object <module>. file '/home/rich/fijal.py'. line 2> #43 CALL_FUNCTION')
+ p28 = force_token()
+ enter_portal_frame(15, 8070450532247933488)
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #0 LOAD_CONST')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #3 STORE_FAST')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #6 SETUP_LOOP')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #9 LOAD_FAST')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #12 LOAD_CONST')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #15 COMPARE_OP')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #18 POP_JUMP_IF_FALSE')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #21 LOAD_GLOBAL')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #24 LOAD_FAST')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #27 BINARY_SUBSCR')
+ p32 = getfield_gc(31, descr=<FieldP pypy.objspace.std.listobject.W_ListObject.inst_strategy 16>)
+ setfield_gc(33, i14, descr=<FieldS pypy.objspace.std.typeobject.IntMutableCell.inst_intvalue 8>)
+ guard_class(p32, 140737326657856, descr=<ResumeGuardClassDescr object at 0x7ffff7e3cf80>) [p1, p0, p11, p32, p5, p6, p7, p9, p28, p12, None]
+ p36 = getfield_gc(31, descr=<FieldP pypy.objspace.std.listobject.W_ListObject.inst_lstorage 8>)
+ i37 = getfield_gc(p36, descr=<FieldS list.length 8>)
+ i39 = uint_ge(0, i37)
+ guard_false(i39, descr=<ResumeGuardFalseDescr object at 0x7ffff7e3cfe0>) [p1, p0, p11, i37, p36, p5, p6, p7, p9, p28, p12, None]
+ p40 = getfield_gc(p36, descr=<FieldP list.items 16>)
+ i41 = getarrayitem_gc(p40, 0, descr=intarraydescr)
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #28 LOAD_CONST')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #31 BINARY_ADD')
+ i43 = int_add_ovf(i41, 1)
+ guard_no_overflow(descr=<ResumeGuardNoOverflowDescr object at 0x7ffff7e3d040>) [p1, p0, p11, i43, p5, p6, p7, p9, i41, p28, p12, None]
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #32 LOAD_GLOBAL')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #35 LOAD_FAST')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #38 STORE_SUBSCR')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #39 LOAD_FAST')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #42 LOAD_CONST')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #45 INPLACE_ADD')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #46 STORE_FAST')
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #49 JUMP_ABSOLUTE')
+ i45 = getfield_raw(140737351875840, descr=<FieldS pypysig_long_struct.c_value 0>)
+ setarrayitem_gc(p40, 0, i43, descr=intarraydescr)
+ i48 = int_lt(i45, 0)
+ guard_false(i48, descr=<ResumeGuardFalseDescr object at 0x7ffff7e3d0a0>) [p1, p0, p11, p5, p6, p7, p9, None, p28, p12, None]
+ debug_merge_point(1, 1, '<code object f. file '/home/rich/fijal.py'. line 4> #9 LOAD_FAST')
+ p49 = force_token()
+ p51 = new_with_vtable(140737326477112)
+ p53 = new_array_clear(4, descr=<ArrayP 8>)
+ p55 = new_with_vtable(100000)
+ p57 = new_with_vtable(140737326516800)
+ setfield_gc(p57, p28, descr=<FieldP JitVirtualRef.virtual_token 8>)
+ setfield_gc(p57, 0, descr=<FieldP JitVirtualRef.forced 16>)
+ setfield_gc(p11, p57, descr=<FieldP pypy.interpreter.executioncontext.ExecutionContext.inst_topframeref 72>)
+ setfield_gc(p0, p49, descr=<FieldP pypy.interpreter.pyframe.PyFrame.vable_token 8>)
+ setfield_gc(p51, 0, descr=<FieldU pypy.interpreter.pyframe.PyFrame.inst_escaped 88>)
+ setfield_gc(p51, 0, descr=<FieldU pypy.interpreter.pyframe.PyFrame.inst_frame_finished_execution 89>)
+ setfield_gc(p51, 9, descr=<FieldS pypy.interpreter.pyframe.PyFrame.inst_last_instr 40>)
+ setfield_gc(p51, 1, descr=<FieldS pypy.interpreter.pyframe.PyFrame.inst_valuestackdepth 72>)
+ setfield_gc(p51, 25, descr=<FieldP pypy.interpreter.pyframe.PyFrame.inst_w_globals 80>)
+ setfield_gc(p51, 63, descr=<FieldP pypy.interpreter.pyframe.PyFrame.inst_pycode 64>)
+ setfield_gc(p55, 1, descr=<FieldS pypy.objspace.std.intobject.W_IntObject.inst_intval 8>)
+ setarrayitem_gc(p53, 0, p55, descr=<ArrayP 8>)
+ setfield_gc(p51, p53, descr=<FieldP pypy.interpreter.pyframe.PyFrame.inst_locals_cells_stack_w 56>)
+ setfield_gc(p51, p12, descr=<FieldP pypy.interpreter.pyframe.PyFrame.inst_f_backref 24>)
+ setfield_gc(p51, 66, descr=<FieldP pypy.interpreter.pyframe.PyFrame.inst_lastblock 48>)
+ p67 = call_assembler(p51, p11, descr=<Loop2>)
+ guard_not_forced(descr=<ResumeGuardForcedDescr object at 0x7ffff7e4b4d8>) [p1, p0, p11, p51, p67, p57, p5, p6, p7, p9]
+ keepalive(p51)
+ guard_no_exception(descr=<ResumeGuardNoExceptionDescr object at 0x7ffff7e3d100>) [p1, p0, p11, p51, p67, p57, p5, p6, p7, p9]
+ leave_portal_frame(15)
+ p69 = getfield_gc(p11, descr=<FieldP pypy.interpreter.executioncontext.ExecutionContext.inst_topframeref 72>)
+ p70 = getfield_gc(p51, descr=<FieldP pypy.interpreter.pyframe.PyFrame.inst_f_backref 24>)
+ i71 = getfield_gc(p51, descr=<FieldU pypy.interpreter.pyframe.PyFrame.inst_escaped 88>)
+ setfield_gc(p11, p70, descr=<FieldP pypy.interpreter.executioncontext.ExecutionContext.inst_topframeref 72>)
+ guard_false(i71, descr=<ResumeGuardFalseDescr object at 0x7ffff7e3d160>) [p1, p0, p67, p69, p51, p57, p5, p6, p7, p9]
+ i72 = getfield_gc(p5, descr=<FieldU pypy.interpreter.pyframe.FrameDebugData.inst_is_being_profiled 56>)
+ setfield_gc(p57, 0, descr=<FieldP JitVirtualRef.virtual_token 8>)
+ guard_value(i72, 0, descr=<ResumeGuardValueDescr object at 0x7ffff7e3d1c0>) [i72, p1, p0, p5, p6, p7, p9, p67]
+ debug_merge_point(0, 0, '<code object <module>. file '/home/rich/fijal.py'. line 2> #46 POP_TOP')
+ p75 = getfield_gc(p5, descr=<FieldP pypy.interpreter.pyframe.FrameDebugData.inst_w_f_trace 40>)
+ guard_isnull(p75, descr=<ResumeGuardIsnullDescr object at 0x7ffff7e3d220>) [p1, p0, p75, p5, p6, p7, p9, p67]
+ debug_merge_point(0, 0, '<code object <module>. file '/home/rich/fijal.py'. line 2> #47 JUMP_ABSOLUTE')
+ guard_not_invalidated(descr=<ResumeGuardNotInvalidated object at 0x7ffff7e3d280>) [p1, p0, p5, p6, p7, p9]
+ i77 = getfield_raw(140737351875840, descr=<FieldS pypysig_long_struct.c_value 0>)
+ i79 = int_lt(i77, 0)
+ guard_false(i79, descr=<ResumeGuardFalseDescr object at 0x7ffff7e3d2e0>) [p1, p0, p5, p6, p7, p9]
+ debug_merge_point(0, 0, '<code object <module>. file '/home/rich/fijal.py'. line 2> #34 FOR_ITER')
+ jump(p0, p1, p5, p6, p7, p9, p11, p70)
+ """
+ opt = self.schedule(self.parse_loop(trace))
+ self.debug_print_operations(opt.loop)
+
class TestLLtype(BaseTestVectorize, LLtypeMixin):
pass
diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py b/rpython/jit/metainterp/optimizeopt/vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/vectorize.py
@@ -521,6 +521,8 @@
modify_later = []
last_prev_node = None
for path in guard_node.iterate_paths(ee_guard_node, True):
+ if not we_are_translated():
+ path.check_acyclic()
prev_node = path.second()
dep = prev_node.depends_on(guard_node)
if dep.is_failarg():
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -179,7 +179,7 @@
primitive type (int,float) """
if self.is_primitive_load() or self.is_primitive_store():
descr = self.getdescr()
- if descr.is_array_of_primitives():
+ if descr and descr.is_array_of_primitives():
return True
return False
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -803,7 +803,7 @@
set_param(driver, 'vec_params', value)
else:
for name1, _ in unroll_parameters:
- if name1 == name and name1 != 'vec_params' and name != 'enable_opts':
+ if name1 == name and name1 != 'vec_params' and name1 != 'enable_opts':
try:
set_param(driver, name1, int(value))
except ValueError:
More information about the pypy-commit
mailing list