Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r79160:ed85c661a0e3
Date: 2015-08-23 17:49 +0200
http://bitbucket.org/pypy/pypy/changeset/ed85c661a0e3/
Log: pass arraydescr a bit everywhere for short preamble
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -198,17 +198,17 @@
return op.getarg(2)
def _getfield(self, opinfo, descr, optheap):
- res = opinfo.getitem(self.index, optheap)
+ res = opinfo.getitem(descr, self.index, optheap)
if isinstance(res, PreambleOp):
index = res.preamble_op.getarg(1).getint()
res = optheap.optimizer.force_op_from_preamble(res)
- opinfo.setitem(index, None, res, optheap=optheap)
+ opinfo.setitem(descr, index, None, res, optheap=optheap)
return res
def _setfield(self, op, opinfo, optheap):
arg = optheap.get_box_replacement(op.getarg(2))
struct = optheap.get_box_replacement(op.getarg(0))
- opinfo.setitem(self.index, struct, arg, self, optheap)
+ opinfo.setitem(op.getdescr(), self.index, struct, arg, self, optheap)
def invalidate(self, descr):
for opinfo in self.cached_infos:
@@ -589,7 +589,7 @@
self.emit_operation(op)
# the remember the result of reading the array item
if cf is not None:
- arrayinfo.setitem(indexb.getint(),
+ arrayinfo.setitem(op.getdescr(), indexb.getint(),
self.get_box_replacement(op.getarg(0)),
self.get_box_replacement(op), cf,
self)
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
@@ -317,16 +317,19 @@
return visitor.visit_vrawslice(self.offset)
class ArrayPtrInfo(AbstractVirtualPtrInfo):
- _attrs_ = ('length', '_items', 'lenbound', '_clear')
+ _attrs_ = ('length', '_items', 'lenbound', '_clear', 'arraydescr')
_items = None
lenbound = None
length = -1
- def __init__(self, const=None, size=0, clear=False, vdescr=None):
+ def __init__(self, arraydescr, const=None, size=0, clear=False,
+ vdescr=None):
from rpython.jit.metainterp.optimizeopt import intutils
self.vdescr = vdescr
+ self.arraydescr = arraydescr
if vdescr is not None:
+ assert vdescr is arraydescr
self._init_items(const, size, clear)
self.lenbound = intutils.ConstIntBound(size)
self._clear = clear
@@ -350,9 +353,9 @@
def all_items(self):
return self._items
- def copy_fields_to_const(self, constinfo, optheap):
+ def copy_fields_to_const(self, arraydescr, constinfo, optheap):
if self._items is not None:
- info = constinfo._get_array_info(optheap)
+ info = constinfo._get_array_info(arraydescr, optheap)
info._items = self._items[:]
def _force_elements(self, op, optforce, descr):
@@ -371,7 +374,7 @@
optforce.emit_operation(setop)
optforce.pure_from_args(rop.ARRAYLEN_GC, [op],
ConstInt(len(self._items)))
- def setitem(self, index, struct_op, op, cf=None, optheap=None):
+ def setitem(self, descr, index, struct_op, op, cf=None, optheap=None):
if self._items is None:
self._items = [None] * (index + 1)
if index >= len(self._items):
@@ -381,7 +384,7 @@
assert not self.is_virtual()
cf.register_dirty_field(struct_op, self)
- def getitem(self, index, optheap=None):
+ def getitem(self, descr, index, optheap=None):
if self._items is None or index >= len(self._items):
return None
return self._items[index]
@@ -418,7 +421,7 @@
def make_guards(self, op, short):
AbstractVirtualPtrInfo.make_guards(self, op, short)
if self.lenbound is not None:
- lenop = ResOperation(rop.ARRAYLEN_GC, [op])
+ lenop = ResOperation(rop.ARRAYLEN_GC, [op], descr=self.arraydescr)
short.append(lenop)
self.lenbound.make_guards(lenop, short)
@@ -503,11 +506,11 @@
optheap.const_infos[ref] = info
return info
- def _get_array_info(self, optheap):
+ def _get_array_info(self, arraydescr, optheap):
ref = self._const.getref_base()
info = optheap.const_infos.get(ref, None)
if info is None:
- info = ArrayPtrInfo()
+ info = ArrayPtrInfo(arraydescr)
optheap.const_infos[ref] = info
return info
@@ -515,13 +518,13 @@
info = self._get_info(optheap)
return info.getfield(descr)
- def getitem(self, index, optheap=None):
- info = self._get_array_info(optheap)
- return info.getitem(index)
+ def getitem(self, descr, index, optheap=None):
+ info = self._get_array_info(descr, optheap)
+ return info.getitem(descr, index)
- def setitem(self, index, struct, op, cf=None, optheap=None):
- info = self._get_array_info(optheap)
- info.setitem(index, struct, op, cf)
+ def setitem(self, descr, index, struct, op, cf=None, optheap=None):
+ info = self._get_array_info(descr, optheap)
+ info.setitem(descr, index, struct, op, cf)
def setfield(self, descr, struct, op, optheap=None, cf=None):
info = self._get_info(optheap)
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
@@ -549,7 +549,7 @@
# XXX fish fish fish
for index in range(length.getint()):
if source_info and source_info.is_virtual():
- val = source_info.getitem(index + source_start)
+ val = source_info.getitem(arraydescr, index + source_start)
else:
opnum = OpHelpers.getarrayitem_for_descr(arraydescr)
newop = ResOperation(opnum,
@@ -561,7 +561,7 @@
if val is None:
continue
if dest_info and dest_info.is_virtual():
- dest_info.setitem(index + dest_start,
+ dest_info.setitem(arraydescr, index + dest_start,
self.get_box_replacement(op.getarg(2)),
val)
else:
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -69,7 +69,8 @@
else:
index = g.getarg(1).getint()
assert index >= 0
- opinfo.setitem(index, self.res, pop, optheap=optheap)
+ opinfo.setitem(self.getfield_op.getdescr(), index, self.res,
+ pop, optheap=optheap)
def add_op_to_short(self, sb):
sop = self.getfield_op
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_virtualstate.py
@@ -489,7 +489,7 @@
info2 = VArrayStateInfo(descr)
info2.fieldstate = [innerinfo2]
- value1 = info.ArrayPtrInfo(vdescr=descr, size=1)
+ value1 = info.ArrayPtrInfo(descr, vdescr=descr, size=1)
box = InputArgRef(self.nodeaddr)
value1._items[0] = box
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -48,7 +48,7 @@
if known_class:
self.make_constant_class(op, known_class, False)
if isinstance(preamble_info, info.ArrayPtrInfo):
- arr_info = info.ArrayPtrInfo(None)
+ arr_info = info.ArrayPtrInfo(preamble_info.arraydescr)
arr_info.lenbound = preamble_info.getlenbound(None)
op.set_forwarded(arr_info)
if preamble_info.is_nonnull():
@@ -210,25 +210,27 @@
def inline_short_preamble(self, jump_args, short_inputargs, short_ops,
short_jump_op, patchguardop):
- self._check_no_forwarding([short_inputargs, short_ops], False)
- assert len(short_inputargs) == len(jump_args)
- for i in range(len(jump_args)):
- short_inputargs[i].set_forwarded(None)
- self.make_equal_to(short_inputargs[i], jump_args[i])
- for op in short_ops:
- if op.is_guard():
- op = self.replace_op_with(op, op.getopnum(),
-
descr=compile.ResumeAtPositionDescr())
- op.rd_snapshot = patchguardop.rd_snapshot
- op.rd_frame_info_list = patchguardop.rd_frame_info_list
- self.optimizer.send_extra_operation(op)
- res = [self.optimizer.get_box_replacement(op) for op in
- short_jump_op]
- for op in short_inputargs:
- op.set_forwarded(None)
- for op in short_ops:
- op.set_forwarded(None)
- return res
+ try:
+ self._check_no_forwarding([short_inputargs, short_ops], False)
+ assert len(short_inputargs) == len(jump_args)
+ for i in range(len(jump_args)):
+ short_inputargs[i].set_forwarded(None)
+ self.make_equal_to(short_inputargs[i], jump_args[i])
+ for op in short_ops:
+ if op.is_guard():
+ op = self.replace_op_with(op, op.getopnum(),
+ descr=compile.ResumeAtPositionDescr())
+ op.rd_snapshot = patchguardop.rd_snapshot
+ op.rd_frame_info_list = patchguardop.rd_frame_info_list
+ self.optimizer.send_extra_operation(op)
+ res = [self.optimizer.get_box_replacement(op) for op in
+ short_jump_op]
+ return res
+ finally:
+ for op in short_inputargs:
+ op.set_forwarded(None)
+ for op in short_ops:
+ op.set_forwarded(None)
def export_state(self, start_label, original_label_args,
renamed_inputargs):
end_args = [self.get_box_replacement(a) for a in original_label_args]
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
@@ -28,7 +28,8 @@
opinfo = info.ArrayStructInfo(size, vdescr=arraydescr)
else:
const = self.new_const_item(arraydescr)
- opinfo = info.ArrayPtrInfo(const, size, clear, vdescr=arraydescr)
+ opinfo = info.ArrayPtrInfo(arraydescr, const, size, clear,
+ vdescr=arraydescr)
newop = self.replace_op_with(source_op, source_op.getopnum())
newop.set_forwarded(opinfo)
return opinfo
@@ -277,7 +278,7 @@
if opinfo and opinfo.is_virtual():
indexbox = self.get_constant_box(op.getarg(1))
if indexbox is not None:
- item = opinfo.getitem(indexbox.getint())
+ item = opinfo.getitem(op.getdescr(), indexbox.getint())
if item is None: # reading uninitialized array items?
assert False, "can't read uninitialized items"
itemvalue = value.constvalue # bah, just return 0
@@ -299,7 +300,7 @@
if opinfo and opinfo.is_virtual():
indexbox = self.get_constant_box(op.getarg(1))
if indexbox is not None:
- opinfo.setitem(indexbox.getint(),
+ opinfo.setitem(op.getdescr(), indexbox.getint(),
self.get_box_replacement(op.getarg(0)),
self.get_box_replacement(op.getarg(2)))
return
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -223,7 +223,7 @@
if len(self.fieldstate) > info.getlength():
raise BadVirtualState
for i in range(len(self.fieldstate)):
- fieldbox = info.getitem(i)
+ fieldbox = info.getitem(self.arraydescr, i)
if fieldbox is None:
xxx
v = value.get_missing_null_value()
diff --git a/rpython/jit/metainterp/test/test_resume.py
b/rpython/jit/metainterp/test/test_resume.py
--- a/rpython/jit/metainterp/test/test_resume.py
+++ b/rpython/jit/metainterp/test/test_resume.py
@@ -1285,7 +1285,8 @@
modifier.liveboxes = {}
modifier.vfieldboxes = {}
- v2 = info.ArrayPtrInfo(vdescr=LLtypeMixin.arraydescr, size=2)
+ v2 = info.ArrayPtrInfo(LLtypeMixin.arraydescr,
+ vdescr=LLtypeMixin.arraydescr, size=2)
b2s.set_forwarded(v2)
v2._items = [b4s, c1s]
modifier.register_virtual_fields(b2s, [b4s, c1s])
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit