Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r78941:49c5c24ec474
Date: 2015-08-12 17:42 +0200
http://bitbucket.org/pypy/pypy/changeset/49c5c24ec474/

Log:    (arigo, fijal) copy contents of heap cache when stuff is proven
        constant

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
@@ -51,6 +51,9 @@
     def getstrlen(self, op, string_optimizer, mode, create_ops=True):
         return None
 
+    def copy_fields_to_const(self, constinfo, optheap):
+        pass
+
     def make_guards(self, op, short):
         pass
     
@@ -128,6 +131,11 @@
         assert not self.is_virtual()
         self._fields = [None] * len(self._fields)
 
+    def copy_fields_to_const(self, constinfo, optheap):
+        if self._fields is not None:
+            info = constinfo._get_info(optheap)
+            info._fields = self._fields[:]
+
     def all_items(self):
         return self._fields
 
@@ -472,12 +480,11 @@
     def getconst(self):
         return self._const
 
-    def _get_info(self, descr, optheap):
+    def _get_info(self, optheap):
         ref = self._const.getref_base()
         info = optheap.const_infos.get(ref, None)
         if info is None:
             info = StructPtrInfo()
-            info.init_fields(descr.get_parent_descr(), descr.get_index())
             optheap.const_infos[ref] = info
         return info
 
@@ -490,7 +497,7 @@
         return info        
 
     def getfield(self, descr, optheap=None):
-        info = self._get_info(descr, optheap)
+        info = self._get_info(optheap)
         return info.getfield(descr)
 
     def getitem(self, index, optheap=None):
@@ -502,7 +509,7 @@
         info.setitem(index, op, cf)
 
     def setfield(self, descr, struct, op, optheap=None, cf=None):
-        info = self._get_info(descr, optheap)
+        info = self._get_info(optheap)
         info.setfield(descr, struct, op, optheap, cf)
 
     def is_null(self):
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
@@ -387,6 +387,9 @@
                 assert box.get_forwarded().contains(constbox.getint())
         if box.is_constant():
             return
+        if box.type == 'r' and box.get_forwarded() is not None:
+            opinfo = box.get_forwarded()
+            opinfo.copy_fields_to_const(self.getptrinfo(constbox), 
self.optheap)
         box.set_forwarded(constbox)
 
     def make_constant_int(self, box, intvalue):
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py 
b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -157,13 +157,8 @@
         opnum = OpHelpers.call_for_descr(op.getdescr())
         newop = self.optimizer.replace_op_with(op, opnum)
         self.emit_operation(newop)
-        # don't move call_pure_with_exception in the short preamble...
-        # issue #2015
-
-        effectinfo = op.getdescr().get_extra_info()
-        if not effectinfo.check_can_raise(ignore_memoryerror=True):
-            self.call_pure_positions.append(
-                len(self.optimizer._newoperations) - 1)
+        self.call_pure_positions.append(
+            len(self.optimizer._newoperations) - 1)
 
     optimize_CALL_PURE_R = optimize_CALL_PURE_I
     optimize_CALL_PURE_F = optimize_CALL_PURE_I
@@ -229,8 +224,13 @@
                 sb.add_pure_op(op)
         for i in self.call_pure_positions:
             op = ops[i]
-            assert op.is_call()
-            sb.add_pure_op(op)
+            # don't move call_pure_with_exception in the short preamble...
+            # issue #2015
+
+            effectinfo = op.getdescr().get_extra_info()
+            if not effectinfo.check_can_raise(ignore_memoryerror=True):
+                assert op.is_call()
+                sb.add_pure_op(op)
 
 dispatch_opt = make_dispatcher_method(OptPure, 'optimize_',
                                       default=OptPure.optimize_default)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -3814,13 +3814,12 @@
         escape_n(i0)
         i3 = call_i(123456, p0, descr=elidable2calldescr)
         guard_no_exception() []
-        # i4 = same_as(i3)
-        jump(p0, i3, i4)
+        jump(p0, i3)
         '''
         expected = '''
-        [p0, i3, i4]
+        [p0, i3]
         escape_n(i3)
-        jump(p0, i4, i4)
+        jump(p0, i3)
         '''
         self.optimize_loop(ops, expected, preamble)
 
@@ -3850,7 +3849,7 @@
         escape_n(i1)
         escape_n(i2)
         escape_n(i9)
-        i4 = call(123456, 4, i0, 6, descr=elidable3calldescr)
+        i4 = call_i(123456, 4, i0, 6, descr=elidable3calldescr)
         guard_no_exception() []
         jump(i0, i4)
         '''
@@ -3858,8 +3857,8 @@
         [i0, i2]
         escape_n(42)
         escape_n(i2)
-        escape(i2)
-        i4 = call(123456, 4, i0, 6, descr=elidable3calldescr)
+        escape_n(i2)
+        i4 = call_i(123456, 4, i0, 6, descr=elidable3calldescr)
         guard_no_exception() []
         jump(i0, i4)
         '''
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to