[pypy-svn] r67375 - in pypy/branch/newtrunk/pypy: . jit/metainterp jit/metainterp/test

pedronis at codespeak.net pedronis at codespeak.net
Tue Sep 1 10:37:08 CEST 2009


Author: pedronis
Date: Tue Sep  1 10:37:06 2009
New Revision: 67375

Modified:
   pypy/branch/newtrunk/pypy/   (props changed)
   pypy/branch/newtrunk/pypy/jit/metainterp/optimizefindnode.py
   pypy/branch/newtrunk/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/newtrunk/pypy/jit/metainterp/test/oparser.py
   pypy/branch/newtrunk/pypy/jit/metainterp/test/test_optimizefindnode.py
   pypy/branch/newtrunk/pypy/jit/metainterp/test/test_recursive.py
   pypy/branch/newtrunk/pypy/jit/metainterp/test/test_zrpy_recursive.py
Log:
(micke, pedronis)

merge 67365 to 67370 from branch/pyjitpl5



Modified: pypy/branch/newtrunk/pypy/jit/metainterp/optimizefindnode.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/optimizefindnode.py	(original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/optimizefindnode.py	Tue Sep  1 10:37:06 2009
@@ -127,6 +127,16 @@
         self.nodes[box] = node
         return node
 
+    def is_constant_box(self, box):
+        if isinstance(box, Const):
+            return True
+        try:
+            node = self.nodes[box]
+        except KeyError:
+            return False
+        else:
+            return node.is_constant()
+
     def find_nodes(self, operations):
         for op in operations:
             opnum = op.opnum
@@ -156,7 +166,6 @@
     find_nodes_OOISNULL    = find_nodes_no_escape
     find_nodes_OOIS        = find_nodes_no_escape
     find_nodes_OOISNOT     = find_nodes_no_escape
-    find_nodes_ARRAYLEN_GC = find_nodes_no_escape
     find_nodes_INSTANCEOF  = find_nodes_no_escape
 
     def find_nodes_NEW_WITH_VTABLE(self, op):
@@ -171,13 +180,19 @@
 
     def find_nodes_NEW_ARRAY(self, op):
         lengthbox = op.args[0]
-        if not isinstance(lengthbox, ConstInt):
+        if not self.is_constant_box(lengthbox):
             return     # var-sized arrays are not virtual
         arraynode = InstanceNode()
-        arraynode.arraysize = lengthbox.value
+        arraynode.arraysize = lengthbox.getint()
         arraynode.arraydescr = op.descr
         self.nodes[op.result] = arraynode
 
+    def find_nodes_ARRAYLEN_GC(self, op):
+        arraynode = self.getnode(op.args[0])
+        if arraynode.arraydescr is not None:
+            assert op.result.getint() == arraynode.arraysize
+            self.set_constant_node(op.result)
+
     def find_nodes_GUARD_CLASS(self, op):
         instnode = self.getnode(op.args[0])
         if instnode.fromstart:    # only useful (and safe) in this case
@@ -225,7 +240,7 @@
 
     def find_nodes_SETARRAYITEM_GC(self, op):
         indexbox = op.args[1]
-        if not isinstance(indexbox, ConstInt):
+        if not self.is_constant_box(indexbox):
             self.find_nodes_default(op)            # not a Const index
             return
         arraynode = self.getnode(op.args[0])
@@ -235,18 +250,18 @@
             return     # nothing to be gained from tracking the item
         if arraynode.curitems is None:
             arraynode.curitems = {}
-        arraynode.curitems[indexbox.value] = itemnode
+        arraynode.curitems[indexbox.getint()] = itemnode
         arraynode.add_escape_dependency(itemnode)
 
     def find_nodes_GETARRAYITEM_GC(self, op):
         indexbox = op.args[1]
-        if not isinstance(indexbox, ConstInt):
+        if not self.is_constant_box(indexbox):
             self.find_nodes_default(op)            # not a Const index
             return
         arraynode = self.getnode(op.args[0])
         if arraynode.escaped:
             return     # nothing to be gained from tracking the item
-        index = indexbox.value
+        index = indexbox.getint()
         if arraynode.curitems is not None and index in arraynode.curitems:
             itemnode = arraynode.curitems[index]
         elif arraynode.origitems is not None and index in arraynode.origitems:

Modified: pypy/branch/newtrunk/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/pyjitpl.py	Tue Sep  1 10:37:06 2009
@@ -809,7 +809,8 @@
         pass     # xxx?
 
     def generate_merge_point(self, pc, varargs):
-        if self.metainterp.is_blackholing():
+        # XXX could be sped up by calling the portal if in_recursion is non-zero
+        if self.metainterp.is_blackholing() and not self.metainterp.in_recursion:
             raise self.metainterp.staticdata.ContinueRunningNormally(varargs)
         num_green_args = self.metainterp.staticdata.num_green_args
         for i in range(num_green_args):
@@ -1246,7 +1247,6 @@
                 debug_print('~~~ LEAVE', self.history.extratext)
 
     def interpret(self):
-        self.in_recursion = 0
         if we_are_translated():
             self._interpret()
         else:
@@ -1476,6 +1476,7 @@
                                         *args[1:])
 
     def initialize_state_from_start(self, *args):
+        self.in_recursion = 0
         self.staticdata._setup_once()
         self.staticdata.profiler.start_tracing()
         self.create_empty_history()
@@ -1492,6 +1493,7 @@
 
     def initialize_state_from_guard_failure(self, guard_failure):
         # guard failure: rebuild a complete MIFrame stack
+        self.in_recursion = 0
         resumedescr = guard_failure.descr
         assert isinstance(resumedescr, compile.ResumeGuardDescr)
         warmrunnerstate = self.staticdata.state
@@ -1617,7 +1619,10 @@
             jitcode, pc, exception_target = resumereader.consume_frame_info()
             env = resumereader.consume_boxes()
             f = self.newframe(jitcode)
+            if jitcode is self.staticdata.portal_code:
+                self.in_recursion += 1
             f.setup_resume_at_op(pc, exception_target, env)
+        self.in_recursion -= 1 # always one portal around
 
     def check_synchronized_virtualizable(self):
         if not we_are_translated():

Modified: pypy/branch/newtrunk/pypy/jit/metainterp/test/oparser.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/test/oparser.py	(original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/test/oparser.py	Tue Sep  1 10:37:06 2009
@@ -186,8 +186,10 @@
         ops = []
         newlines = []
         for line in lines:
-            if not line.strip() or line.strip().startswith("#"):
-                continue # a comment
+            if '#' in line:
+                line = line[:line.index('#')]    # remove comment
+            if not line.strip():
+                continue  # a comment or empty line
             newlines.append(line)
         base_indent, inpargs = self.parse_inpargs(newlines[0])
         newlines = newlines[1:]

Modified: pypy/branch/newtrunk/pypy/jit/metainterp/test/test_optimizefindnode.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/test/test_optimizefindnode.py	(original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/test/test_optimizefindnode.py	Tue Sep  1 10:37:06 2009
@@ -74,8 +74,25 @@
     sbox = BoxPtr(lltype.cast_opaque_ptr(llmemory.GCREF, lltype.malloc(S)))
     arraydescr2 = cpu.arraydescrof(lltype.GcArray(lltype.Ptr(S)))
 
+    T = lltype.GcStruct('TUPLE',
+                        ('c', lltype.Signed),
+                        ('d', lltype.Ptr(lltype.GcArray(lltype.Ptr(NODE)))))
+    tsize = cpu.sizeof(T)
+    cdescr = cpu.fielddescrof(T, 'c')
+    ddescr = cpu.fielddescrof(T, 'd')
+    arraydescr3 = cpu.arraydescrof(lltype.GcArray(lltype.Ptr(NODE)))
+
+    U = lltype.GcStruct('U',
+                        ('parent', OBJECT),
+                        ('one', lltype.Ptr(lltype.GcArray(lltype.Ptr(NODE)))))
+    u_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
+    u_vtable_adr = llmemory.cast_ptr_to_adr(u_vtable)
+    usize = cpu.sizeof(U)
+    onedescr = cpu.fielddescrof(U, 'one')
+
     cpu.class_sizes = {cpu.cast_adr_to_int(node_vtable_adr): cpu.sizeof(NODE),
-                      cpu.cast_adr_to_int(node_vtable_adr2): cpu.sizeof(NODE2)}
+                      cpu.cast_adr_to_int(node_vtable_adr2): cpu.sizeof(NODE2),
+                       cpu.cast_adr_to_int(u_vtable_adr): cpu.sizeof(U)}
     namespace = locals()
 
 class OOtypeMixin(object):
@@ -117,6 +134,19 @@
     sbox = BoxObj(ootype.cast_to_object(ootype.new(S)))
     arraydescr2 = cpu.arraydescrof(ootype.Array(S))
 
+    T = ootype.Record({'c': ootype.Signed,
+                       'd': ootype.Array(NODE)})
+    tsize = cpu.typedescrof(T)
+    cdescr = cpu.fielddescrof(T, 'c')
+    ddescr = cpu.fielddescrof(T, 'd')
+    arraydescr3 = cpu.arraydescrof(ootype.Array(NODE))
+
+    U = ootype.Instance('U', ootype.ROOT, {'one': ootype.Array(NODE)})
+    usize = cpu.typedescrof(U)
+    onedescr = cpu.fielddescrof(U, 'one')
+    u_vtable = ootype.runtimeClass(U)
+    u_vtable_adr = ootype.cast_to_object(u_vtable)
+
     # force a consistent order
     valuedescr.sort_key()
     nextdescr.sort_key()
@@ -124,7 +154,8 @@
     bdescr.sort_key()
 
     cpu.class_sizes = {node_vtable_adr: cpu.typedescrof(NODE),
-                       node_vtable_adr2: cpu.typedescrof(NODE2)}
+                       node_vtable_adr2: cpu.typedescrof(NODE2),
+                       u_vtable_adr: cpu.typedescrof(U)}
     namespace = locals()
 
 class BaseTest(object):
@@ -739,6 +770,128 @@
         """
         self.find_nodes(ops, 'Not, Not')
 
+    def test_find_nodes_arithmetic_propagation_bug_0(self):
+        ops = """
+        [p1]
+        i1 = getarrayitem_gc(p1, 0, descr=arraydescr)
+        escape(i1)
+        i2 = int_add(0, 1)
+        p2 = new_array(i2, descr=arraydescr)
+        i3 = escape()
+        setarrayitem_gc(p2, 0, i3, descr=arraydescr)
+        jump(p2)
+        """
+        self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1)
+
+    def test_find_nodes_arithmetic_propagation_bug_1(self):
+        ops = """
+        [p1]
+        i1 = getarrayitem_gc(p1, 0, descr=arraydescr)
+        escape(i1)
+        i2 = same_as(1)
+        p2 = new_array(i2, descr=arraydescr)
+        setarrayitem_gc(p2, 0, 5)
+        jump(p2)
+        """
+        self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1)
+
+    def test_find_nodes_arithmetic_propagation_bug_2(self):
+        ops = """
+        [p1]
+        i0 = int_sub(17, 17)
+        i1 = getarrayitem_gc(p1, i0, descr=arraydescr)
+        escape(i1)
+        i2 = int_add(0, 1)
+        p2 = new_array(i2, descr=arraydescr)
+        i3 = escape()
+        setarrayitem_gc(p2, i0, i3, descr=arraydescr)
+        jump(p2)
+        """
+        self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1, i0=0)
+
+    def test_find_nodes_arithmetic_propagation_bug_3(self):
+        ops = """
+        [p1]
+        i1 = getarrayitem_gc(p1, 0, descr=arraydescr)
+        escape(i1)
+        p3 = new_array(1, descr=arraydescr)
+        i2 = arraylen_gc(p3, descr=arraydescr)
+        p2 = new_array(i2, descr=arraydescr)
+        i3 = escape()
+        setarrayitem_gc(p2, 0, i3, descr=arraydescr)
+        jump(p2)
+        """
+        self.find_nodes(ops, 'VArray(arraydescr, Not)', i2=1)
+
+    def test_find_nodes_bug_1(self):
+        ops = """
+        [p12]
+        i16 = ooisnull(p12)
+        guard_false(i16)
+            fail()
+        guard_class(p12, ConstClass(node_vtable))
+            fail()
+        guard_class(p12, ConstClass(node_vtable))
+            fail()
+        i22 = getfield_gc_pure(p12, descr=valuedescr)
+        escape(i22)
+        i25 = ooisnull(p12)
+        guard_false(i25)
+            fail()
+        guard_class(p12, ConstClass(node_vtable))
+            fail()
+        guard_class(p12, ConstClass(node_vtable))
+            fail()
+        i29 = getfield_gc_pure(p12, descr=valuedescr)
+        i31 = int_add_ovf(i29, 1)
+        guard_no_overflow()
+            fail()
+        p33 = new_with_vtable(ConstClass(node_vtable))      # NODE
+        setfield_gc(p33, i31, descr=valuedescr)
+        #
+        p35 = new_array(1, descr=arraydescr3)               # Array(NODE)
+        setarrayitem_gc(p35, 0, p33, descr=arraydescr3)
+        p38 = new_with_vtable(ConstClass(u_vtable))         # U
+        setfield_gc(p38, p35, descr=onedescr)
+        i39 = ooisnull(p38)
+        guard_false(i39)
+            fail()
+        i40 = oononnull(p38)
+        guard_true(i40)
+            fail()
+        guard_class(p38, ConstClass(u_vtable))
+            fail()
+        p42 = getfield_gc(p38, descr=onedescr)              # Array(NODE)
+        i43 = arraylen_gc(p42, descr=arraydescr3)
+        i45 = int_sub(i43, 0)
+        p46 = new(descr=tsize)                              # T
+        setfield_gc(p46, i45, descr=cdescr)
+        p47 = new_array(i45, descr=arraydescr3)             # Array(NODE)
+        setfield_gc(p46, p47, descr=ddescr)
+        i48 = int_lt(0, i43)
+        guard_true(i48)
+            fail()
+        p49 = getarrayitem_gc(p42, 0, descr=arraydescr3)    # NODE
+        p50 = getfield_gc(p46, descr=ddescr)                # Array(NODE)
+        setarrayitem_gc(p50, 0, p49, descr=arraydescr3)
+        i52 = int_lt(1, i43)
+        guard_false(i52)
+            fail()
+        i53 = getfield_gc(p46, descr=cdescr)
+        i55 = int_ne(i53, 1)
+        guard_false(i55)
+            fail()
+        p56 = getfield_gc(p46, descr=ddescr)                # Array(NODE)
+        p58 = getarrayitem_gc(p56, 0, descr=arraydescr3)    # NODE
+        i59 = ooisnull(p38)
+        guard_false(i59)
+            fail()
+        jump(p58)
+        """
+        self.find_nodes(ops, 'Virtual(node_vtable, valuedescr=Not)',
+                        i16=0, i25=0, i39=0, i52=0, i55=0, i59=0,
+                        i43=1, i45=1, i48=1, i40=1)
+
     # ------------------------------
     # Bridge tests
 

Modified: pypy/branch/newtrunk/pypy/jit/metainterp/test/test_recursive.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/test/test_recursive.py	(original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/test/test_recursive.py	Tue Sep  1 10:37:06 2009
@@ -176,6 +176,41 @@
         else:
             py.test.fail("DID NOT RAISE")
 
+    def test_inner_failure(self):
+        from pypy.rpython.annlowlevel import hlstr
+        def p(code, pc):
+            code = hlstr(code)
+            return "%s %d %s" % (code, pc, code[pc])
+        myjitdriver = JitDriver(greens=['code', 'pc'], reds=['n'], get_printable_location=p)
+        def f(code, n):
+            pc = 0
+            while pc < len(code):
+
+                myjitdriver.jit_merge_point(n=n, code=code, pc=pc)
+                op = code[pc]
+                if op == "-":
+                    n -= 1
+                elif op == "c":
+                    n = f("---i---", n)
+                elif op == "i":
+                    if n % 5 == 1:
+                        return n
+                elif op == "l":
+                    if n > 0:
+                        myjitdriver.can_enter_jit(n=n, code=code, pc=0)
+                        pc = 0
+                        continue
+                else:
+                    assert 0
+                pc += 1
+            return n
+        def main(n):
+            return f("c-l", n)
+        print main(100)
+        res = self.meta_interp(main, [100], optimizer=simple_optimize)
+        assert res == 0
+
+
 class TestLLtype(RecursiveTests, LLJitMixin):
     pass
 

Modified: pypy/branch/newtrunk/pypy/jit/metainterp/test/test_zrpy_recursive.py
==============================================================================
--- pypy/branch/newtrunk/pypy/jit/metainterp/test/test_zrpy_recursive.py	(original)
+++ pypy/branch/newtrunk/pypy/jit/metainterp/test/test_zrpy_recursive.py	Tue Sep  1 10:37:06 2009
@@ -14,6 +14,5 @@
 
     # ==========> test_recursive.py
 
-    @py.test.mark.xfail
     def test_inline_faulty_can_inline(self):
-        test_recursive.RecursiveTests.test_inline_faulty_can_inline(self)
+        py.test.skip("XXX does not work with LLException")



More information about the Pypy-commit mailing list