[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