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