[pypy-commit] pypy optresult: whack at vrefs

fijal noreply at buildbot.pypy.org
Tue May 26 14:44:06 CEST 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r77578:20e90dc30259
Date: 2015-05-26 14:44 +0200
http://bitbucket.org/pypy/pypy/changeset/20e90dc30259/

Log:	whack at vrefs

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
@@ -86,8 +86,9 @@
             newop = optforce.getlastop()
             op.set_forwarded(newop)
             newop.set_forwarded(self)
+            descr = self.vdescr
             self.vdescr = None
-            self._force_elements(newop, optforce)
+            self._force_elements(newop, optforce, descr)
             return newop
         return op
 
@@ -113,10 +114,9 @@
     def getfield(self, descr, optheap=None):
         return self._fields[descr.index]
 
-    def _force_elements(self, op, optforce):
+    def _force_elements(self, op, optforce, descr):
         if self._fields is None:
             return 0
-        descr = op.getdescr()
         count = 0
         for i, flddescr in enumerate(descr.all_fielddescrs):
             fld = self._fields[i]
@@ -189,7 +189,7 @@
         else:
             self._items = [None] * size
 
-    def _force_elements(self, op, optforce):
+    def _force_elements(self, op, optforce, descr):
         arraydescr = op.getdescr()
         count = 0
         for i in range(self.length):
@@ -254,7 +254,7 @@
         index = self._compute_index(index, fielddescr)
         return self._items[index]
 
-    def _force_elements(self, op, optforce):
+    def _force_elements(self, op, optforce, descr):
         i = 0
         fielddescrs = op.getdescr().all_interiorfielddescrs
         count = 0
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
@@ -3017,12 +3017,12 @@
         expected = """
         [p1]
         p0 = force_token()
-        p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+        p2 = new_with_vtable(descr=vref_descr)
+        setfield_gc(p2, p0, descr=virtualtokendescr)
         setfield_gc(p2, NULL, descr=virtualforceddescr)
-        setfield_gc(p2, p0, descr=virtualtokendescr)
         escape_n(p2)
+        setfield_gc(p2, NULL, descr=virtualtokendescr)
         setfield_gc(p2, p1, descr=virtualforceddescr)
-        setfield_gc(p2, NULL, descr=virtualtokendescr)
         jump(p1)
         """
         # XXX we should optimize a bit more the case of a nonvirtual.
@@ -3050,21 +3050,21 @@
         [p0, i1]
         p3 = force_token()
         #
-        p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+        p2 = new_with_vtable(descr=vref_descr)
+        setfield_gc(p2, p3, descr=virtualtokendescr)
         setfield_gc(p2, NULL, descr=virtualforceddescr)
-        setfield_gc(p2, p3, descr=virtualtokendescr)
         setfield_gc(p0, p2, descr=nextdescr)
         #
         call_may_force_n(i1, descr=mayforcevirtdescr)
         guard_not_forced() [i1]
         #
         setfield_gc(p0, NULL, descr=nextdescr)
+        setfield_gc(p2, NULL, descr=virtualtokendescr)
         p1 = new_with_vtable(descr=nodesize)
         p1b = new_with_vtable(descr=nodesize)
         setfield_gc(p1b, 252, descr=valuedescr)
         setfield_gc(p1, p1b, descr=nextdescr)
         setfield_gc(p2, p1, descr=virtualforceddescr)
-        setfield_gc(p2, NULL, descr=virtualtokendescr)
         jump(p0, i1)
         """
         self.optimize_loop(ops, expected)
@@ -3090,21 +3090,21 @@
         [p0, i1]
         p3 = force_token()
         #
-        p2 = new_with_vtable(ConstClass(jit_virtual_ref_vtable))
+        p2 = new_with_vtable(descr=vref_descr)
+        setfield_gc(p2, p3, descr=virtualtokendescr)
         setfield_gc(p2, NULL, descr=virtualforceddescr)
-        setfield_gc(p2, p3, descr=virtualtokendescr)
         setfield_gc(p0, p2, descr=nextdescr)
         #
         call_may_force_n(i1, descr=mayforcevirtdescr)
         guard_not_forced() [p2, i1]
         #
         setfield_gc(p0, NULL, descr=nextdescr)
+        setfield_gc(p2, NULL, descr=virtualtokendescr)
         p1 = new_with_vtable(descr=nodesize)
         p1b = new_with_vtable(descr=nodesize)
         setfield_gc(p1b, i1, descr=valuedescr)
         setfield_gc(p1, p1b, descr=nextdescr)
         setfield_gc(p2, p1, descr=virtualforceddescr)
-        setfield_gc(p2, NULL, descr=virtualtokendescr)
         jump(p0, i1)
         """
         # the point of this test is that 'i1' should show up in the fail_args
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -292,6 +292,7 @@
 
     jit_virtual_ref_vtable = vrefinfo.jit_virtual_ref_vtable
     jvr_vtable_adr = llmemory.cast_ptr_to_adr(jit_virtual_ref_vtable)
+    vref_descr = cpu.sizeof(vrefinfo.JIT_VIRTUAL_REF, False)
 
     register_known_gctype(cpu, node_vtable,  NODE)
     register_known_gctype(cpu, node_vtable2, NODE2)
diff --git a/rpython/jit/metainterp/optimizeopt/util.py b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -157,7 +157,7 @@
             txt2 = txt2[width:]
     print '-' * totwidth
 
-    for op1, op2 in zip(oplist1, oplist2):
+    for i_count, (op1, op2) in enumerate(zip(oplist1, oplist2)):
         assert op1.getopnum() == op2.getopnum()
         assert op1.numargs() == op2.numargs()
         for i in range(op1.numargs()):
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
@@ -601,19 +601,21 @@
         # get some constants
         vrefinfo = self.optimizer.metainterp_sd.virtualref_info
         c_cls = vrefinfo.jit_virtual_ref_const_class
+        vref_descr = vrefinfo.descr
         descr_virtual_token = vrefinfo.descr_virtual_token
         descr_forced = vrefinfo.descr_forced
         #
         # Replace the VIRTUAL_REF operation with a virtual structure of type
         # 'jit_virtual_ref'.  The jit_virtual_ref structure may be forced soon,
         # but the point is that doing so does not force the original structure.
-        newop = ResOperation(rop.NEW_WITH_VTABLE, [c_cls])
-        vrefvalue = self.make_virtual(c_cls, newop)
-        self.optimizer.values[op] = vrefvalue
+        newop = ResOperation(rop.NEW_WITH_VTABLE, [], descr=vref_descr)
+        vrefvalue = self.make_virtual(c_cls, newop, vref_descr)
+        op.set_forwarded(newop)
+        newop.set_forwarded(vrefvalue)
         token = ResOperation(rop.FORCE_TOKEN, [])
         self.emit_operation(token)
-        vrefvalue.setfield(descr_virtual_token, self.getvalue(token))
-        vrefvalue.setfield(descr_forced, self.optimizer.cpu.ts.CVAL_NULLREF)
+        vrefvalue.setfield(descr_virtual_token, token)
+        vrefvalue.setfield(descr_forced, self.optimizer.cpu.ts.CONST_NULLREF)
 
     def optimize_VIRTUAL_REF_FINISH(self, op):
         # This operation is used in two cases.  In normal cases, it
diff --git a/rpython/jit/metainterp/virtualref.py b/rpython/jit/metainterp/virtualref.py
--- a/rpython/jit/metainterp/virtualref.py
+++ b/rpython/jit/metainterp/virtualref.py
@@ -30,6 +30,7 @@
         self.descr_virtual_token = fielddescrof(self.JIT_VIRTUAL_REF,
                                                 'virtual_token')
         self.descr_forced = fielddescrof(self.JIT_VIRTUAL_REF, 'forced')
+        self.descr = self.cpu.sizeof(self.JIT_VIRTUAL_REF, False)
         #
         # record the type JIT_VIRTUAL_REF explicitly in the rtyper, too
         if hasattr(self.warmrunnerdesc, 'rtyper'):    # <-- for tests


More information about the pypy-commit mailing list