[pypy-commit] pypy optresult: implement some parts of varray

fijal noreply at buildbot.pypy.org
Mon Mar 9 09:41:49 CET 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r76288:bb7065b9e03c
Date: 2015-03-09 10:41 +0200
http://bitbucket.org/pypy/pypy/changeset/bb7065b9e03c/

Log:	implement some parts of varray

diff --git a/rpython/jit/metainterp/optimizeopt/info.py b/rpython/jit/metainterp/optimizeopt/info.py
--- a/rpython/jit/metainterp/optimizeopt/info.py
+++ b/rpython/jit/metainterp/optimizeopt/info.py
@@ -113,6 +113,20 @@
 class ArrayPtrInfo(AbstractVirtualPtrInfo):
     _attrs_ = ('_is_virtual', 'length', '_items', '_descr')
 
+    def __init__(self, descr, const, size, clear, is_virtual):
+        self._is_virtual = is_virtual
+        self.length = size
+        if clear:
+            self._items = [const] * size
+        else:
+            self._items = [None] * size
+
+    def setitem_virtual(self, index, item):
+        self._items[index] = item
+
+    def getitem_virtual(self, index):
+        return self._items[index]
+
     def getlength(self):
         return self.length
 
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -567,49 +567,29 @@
 
     def make_nonnull(self, op):
         op = self.get_box_replacement(op)
+        if op.is_constant():
+            return
         opinfo = op.get_forwarded()
         if opinfo is not None:
             assert opinfo.is_nonnull()
             return
         op.set_forwarded(info.NonNullPtrInfo())
 
-    def new_ptr_box(self):
-        xxx
-        return self.cpu.ts.BoxRef()
-
-    def new_box(self, fieldofs):
-        xxx
-        if fieldofs.is_pointer_field():
-            return self.new_ptr_box()
-        elif fieldofs.is_float_field():
-            return BoxFloat()
-        else:
-            return BoxInt()
-
     def new_const(self, fieldofs):
         if fieldofs.is_pointer_field():
-            return self.cpu.ts.CVAL_NULLREF
+            return self.cpu.ts.CONST_NULL
         elif fieldofs.is_float_field():
-            return CVAL_ZERO_FLOAT
+            return CONST_ZERO_FLOAT
         else:
-            return CVAL_ZERO
-
-    def new_box_item(self, arraydescr):
-        xxx
-        if arraydescr.is_array_of_pointers():
-            return self.new_ptr_box()
-        elif arraydescr.is_array_of_floats():
-            return BoxFloat()
-        else:
-            return BoxInt()
+            return CONST_0
 
     def new_const_item(self, arraydescr):
         if arraydescr.is_array_of_pointers():
-            return self.cpu.ts.CVAL_NULLREF
+            return self.cpu.ts.CONST_NULL
         elif arraydescr.is_array_of_floats():
-            return CVAL_ZERO_FLOAT
+            return CONST_ZERO_FLOAT
         else:
-            return CVAL_ZERO
+            return CONST_0
 
     def propagate_all_forward(self, clear=True):
         if clear:
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -7,7 +7,8 @@
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound
 from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, REMOVED,
     CONST_0, CONST_1)
-from rpython.jit.metainterp.optimizeopt.info import INFO_NONNULL, INFO_NULL
+from rpython.jit.metainterp.optimizeopt.info import INFO_NONNULL, INFO_NULL,\
+     ArrayPtrInfo
 from rpython.jit.metainterp.optimizeopt.util import _findall, make_dispatcher_method
 from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
      OpHelpers
@@ -502,22 +503,25 @@
         if length and length.getint() == 0:
             return True # 0-length arraycopy
 
-        source_value = self.getvalue(op.getarg(1))
-        dest_value = self.getvalue(op.getarg(2))
+        source_info = self.getptrinfo(op.getarg(1))
+        dest_info = self.getptrinfo(op.getarg(2))
         source_start_box = self.get_constant_box(op.getarg(3))
         dest_start_box = self.get_constant_box(op.getarg(4))
         extrainfo = op.getdescr().get_extra_info()
         if (source_start_box and dest_start_box
-            and length and (dest_value.is_virtual() or length.getint() <= 8) and
-            (source_value.is_virtual() or length.getint() <= 8) and
-            len(extrainfo.write_descrs_arrays) == 1):   # <-sanity check
-            from rpython.jit.metainterp.optimizeopt.virtualize import VArrayValue
+            and length and ((dest_info and dest_info.is_virtual()) or
+                            length.getint() <= 8) and
+            ((source_info and source_info.is_virtual()) or length.getint() <= 8)
+            and len(extrainfo.write_descrs_arrays) == 1):   # <-sanity check
             source_start = source_start_box.getint()
             dest_start = dest_start_box.getint()
-            # XXX fish fish fish
             arraydescr = extrainfo.write_descrs_arrays[0]
             if arraydescr.is_array_of_structs():
                 return False       # not supported right now
+            
+            xxx
+            from rpython.jit.metainterp.optimizeopt.virtualize import VArrayValue
+            # XXX fish fish fish
             for index in range(length.getint()):
                 if source_value.is_virtual():
                     assert isinstance(source_value, VArrayValue)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -987,8 +987,8 @@
         ops = """
         [f0, f1]
         p0 = new_array_clear(3, descr=complexarraydescr)
+        setinteriorfield_gc(p0, 0, f1, descr=complexrealdescr)
         setinteriorfield_gc(p0, 0, f0, descr=compleximagdescr)
-        setinteriorfield_gc(p0, 0, f1, descr=complexrealdescr)
         call_n(0, p0, p0, 0, 2, 1, descr=complexarraycopydescr)
         f2 = getinteriorfield_gc_f(p0, 2, descr=complexrealdescr)
         f3 = getinteriorfield_gc_f(p0, 2, descr=compleximagdescr)
@@ -1020,7 +1020,7 @@
     def test_nonvirtual_1(self):
         ops = """
         [i]
-        p1 = new_with_vtable(ConstClass(node_vtable))
+        p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
         setfield_gc(p1, i, descr=valuedescr)
         i0 = getfield_gc_i(p1, descr=valuedescr)
         i1 = int_add(i0, 1)
@@ -1031,7 +1031,7 @@
         expected = """
         [i]
         i1 = int_add(i, 1)
-        p1 = new_with_vtable(ConstClass(node_vtable))
+        p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
         setfield_gc(p1, i, descr=valuedescr)
         escape_n(p1)
         escape_n(p1)
@@ -1045,7 +1045,7 @@
         i0 = getfield_gc_i(p0, descr=valuedescr)
         escape_n(p0)
         i1 = int_add(i0, i)
-        p1 = new_with_vtable(ConstClass(node_vtable))
+        p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
         setfield_gc(p1, i1, descr=valuedescr)
         jump(i, p1)
         """
@@ -1055,7 +1055,7 @@
     def test_nonvirtual_later(self):
         ops = """
         [i]
-        p1 = new_with_vtable(ConstClass(node_vtable))
+        p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
         setfield_gc(p1, i, descr=valuedescr)
         i1 = getfield_gc_i(p1, descr=valuedescr)
         escape_n(p1)
@@ -1065,7 +1065,7 @@
         """
         expected = """
         [i]
-        p1 = new_with_vtable(ConstClass(node_vtable))
+        p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
         setfield_gc(p1, i, descr=valuedescr)
         escape_n(p1)
         i2 = getfield_gc_i(p1, descr=valuedescr)
@@ -1077,7 +1077,7 @@
     def test_nonvirtual_write_null_fields_on_force(self):
         ops = """
         [i]
-        p1 = new_with_vtable(ConstClass(node_vtable))
+        p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
         setfield_gc(p1, i, descr=valuedescr)
         i1 = getfield_gc_i(p1, descr=valuedescr)
         setfield_gc(p1, 0, descr=valuedescr)
@@ -1087,7 +1087,7 @@
         """
         expected = """
         [i]
-        p1 = new_with_vtable(ConstClass(node_vtable))
+        p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
         setfield_gc(p1, 0, descr=valuedescr)
         escape_n(p1)
         i2 = getfield_gc_i(p1, descr=valuedescr)
@@ -1098,7 +1098,7 @@
     def test_getfield_gc_pure_1(self):
         ops = """
         [i]
-        p1 = new_with_vtable(ConstClass(node_vtable))
+        p1 = new_with_vtable(ConstClass(node_vtable), descr=nodesize)
         setfield_gc(p1, i, descr=valuedescr)
         i1 = getfield_gc_pure_i(p1, descr=valuedescr)
         jump(i1)
diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py
--- a/rpython/jit/metainterp/optimizeopt/virtualize.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualize.py
@@ -532,15 +532,11 @@
         if arraydescr.is_array_of_structs():
             assert clear
             opinfo = info.ArrayStructInfo(arraydescr, size, True)
-            source_op.set_forwarded(opinfo)
-            return opinfo
-            vvalue = VArrayStructValue(arraydescr, size, source_op)
         else:
-            constvalue = self.new_const_item(arraydescr)
-            vvalue = VArrayValue(arraydescr, constvalue, size, source_op,
-                                 clear=clear)
-        self.make_equal_to(source_op, vvalue)
-        return vvalue
+            const = self.new_const_item(arraydescr)
+            opinfo = info.ArrayPtrInfo(arraydescr, const, size, clear, True)
+        source_op.set_forwarded(opinfo)
+        return opinfo
 
     def make_vstruct(self, structdescr, source_op):
         vvalue = VStructValue(self.optimizer.cpu, structdescr, source_op)
@@ -670,15 +666,17 @@
 
     def optimize_GETFIELD_GC_I(self, op):
         opinfo = self.getptrinfo(op.getarg(0))
+        # XXX dealt with by heapcache
         # If this is an immutable field (as indicated by op.is_always_pure())
         # then it's safe to reuse the virtual's field, even if it has been
         # forced, because it should never be written to again.
-        if op.is_always_pure():
-            if value.is_forced_virtual() and op.is_always_pure():
-                fieldvalue = value.getfield(op.getdescr(), None)
-                if fieldvalue is not None:
-                    self.make_equal_to(op, fieldvalue)
-                    return
+        #if op.is_always_pure():
+        #    
+        #    if value.is_forced_virtual() and op.is_always_pure():
+        #        fieldvalue = value.getfield(op.getdescr(), None)
+        #        if fieldvalue is not None:
+        #            self.make_equal_to(op, fieldvalue)
+        #            return
         if opinfo and opinfo.is_virtual():
             fieldop = opinfo.getfield_virtual(op.getdescr())
             if fieldop is None:
@@ -785,17 +783,17 @@
             self.emit_operation(op)
 
     def optimize_GETARRAYITEM_GC_I(self, op):
-        value = self.getvalue(op.getarg(0))
-        if value.is_virtual():
-            assert isinstance(value, VArrayValue)
+        opinfo = self.getptrinfo(op.getarg(0))
+        if opinfo and opinfo.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
-                itemvalue = value.getitem(indexbox.getint())
-                if itemvalue is None:   # reading uninitialized array items?
+                item = opinfo.getitem_virtual(indexbox.getint())
+                if item is None:   # reading uninitialized array items?
+                    assert False, "can't read uninitialized items"
                     itemvalue = value.constvalue     # bah, just return 0
-                self.make_equal_to(op, itemvalue)
+                self.make_equal_to(op, item)
                 return
-        value.ensure_nonnull()
+        self.make_nonnull(op.getarg(0))
         self.emit_operation(op)
     optimize_GETARRAYITEM_GC_R = optimize_GETARRAYITEM_GC_I
     optimize_GETARRAYITEM_GC_F = optimize_GETARRAYITEM_GC_I
@@ -807,13 +805,14 @@
     optimize_GETARRAYITEM_GC_PURE_F = optimize_GETARRAYITEM_GC_I
 
     def optimize_SETARRAYITEM_GC(self, op):
-        value = self.getvalue(op.getarg(0))
-        if value.is_virtual():
+        opinfo = self.getptrinfo(op.getarg(0))
+        if opinfo and opinfo.is_virtual():
             indexbox = self.get_constant_box(op.getarg(1))
             if indexbox is not None:
-                value.setitem(indexbox.getint(), self.getvalue(op.getarg(2)))
+                opinfo.setitem_virtual(indexbox.getint(),
+                                       self.get_box_replacement(op.getarg(2)))
                 return
-        value.ensure_nonnull()
+        self.make_nonnull(op.getarg(0))
         self.emit_operation(op)
 
     def _unpack_arrayitem_raw_op(self, op, indexbox):
@@ -907,8 +906,7 @@
                     fieldvalue = self.new_const(descr)
                 self.make_equal_to(op, fld)
                 return
-        xxx
-        value.ensure_nonnull()
+        self.make_nonnull(op.getarg(0))
         self.emit_operation(op)
     optimize_GETINTERIORFIELD_GC_R = optimize_GETINTERIORFIELD_GC_I
     optimize_GETINTERIORFIELD_GC_F = optimize_GETINTERIORFIELD_GC_I
diff --git a/rpython/jit/metainterp/typesystem.py b/rpython/jit/metainterp/typesystem.py
--- a/rpython/jit/metainterp/typesystem.py
+++ b/rpython/jit/metainterp/typesystem.py
@@ -38,7 +38,6 @@
     loops_done_with_this_frame_ref = None # patched by compile.py
     NULLREF = history.ConstPtr.value
     CONST_NULL = history.ConstPtr(NULLREF)
-    CVAL_NULLREF = None # patched by optimizeopt.py
 
     def new_ConstRef(self, x):
         ptrval = lltype.cast_opaque_ptr(llmemory.GCREF, x)


More information about the pypy-commit mailing list