[pypy-commit] pypy optresult-unroll: fix test_bug_3
fijal
noreply at buildbot.pypy.org
Tue Aug 11 16:56:48 CEST 2015
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult-unroll
Changeset: r78910:7c3ad0460623
Date: 2015-08-11 14:53 +0200
http://bitbucket.org/pypy/pypy/changeset/7c3ad0460623/
Log: fix test_bug_3
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
@@ -128,6 +128,9 @@
assert not self.is_virtual()
self._fields = [None] * len(self._fields)
+ def all_items(self):
+ return self._fields
+
def setfield(self, descr, struct, op, optheap=None, cf=None):
self.init_fields(descr.get_parent_descr(), descr.get_index())
assert isinstance(op, AbstractValue)
@@ -175,7 +178,6 @@
getfield_op = ResOperation(opnum, [structbox], descr=descr)
shortboxes.add_heap_op(op, getfield_op)
-
class InstancePtrInfo(AbstractStructPtrInfo):
_attrs_ = ('_known_class',)
_fields = None
@@ -193,6 +195,14 @@
assert self.is_virtual()
return visitor.visit_virtual(self.vdescr, fielddescrs)
+ def make_guards(self, op, short):
+ if self._known_class is not None:
+ op = ResOperation(rop.GUARD_NONNULL_CLASS, [op, self._known_class],
+ None)
+ short.append(op)
+ else:
+ AbstractStructPtrInfo.make_guards(self, op, short)
+
class StructPtrInfo(AbstractStructPtrInfo):
def __init__(self, vdescr=None):
self.vdescr = vdescr
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
@@ -2776,7 +2776,7 @@
p3 = getfield_gc_r(p1, descr=otherdescr)
guard_nonnull(ConstPtr(nodeaddr)) []
guard_class(p3, ConstClass(node_vtable)) []
- setfield_gc(p3, p2, descr=otherdescr)
+ setfield_gc(p3, p2, descr=nextdescr)
p1a = new_with_vtable(descr=nodesize2)
p2a = new_with_vtable(descr=nodesize)
p3a = new_with_vtable(descr=nodesize)
@@ -2793,7 +2793,7 @@
p3 = getfield_gc_r(p1, descr=otherdescr)
guard_class(p3, ConstClass(node_vtable)) []
p3a = new_with_vtable(descr=nodesize)
- setfield_gc(p3, p2, descr=otherdescr)
+ setfield_gc(p3, p2, descr=nextdescr)
escape_n(p3a)
jump(p3a)
"""
@@ -2807,7 +2807,7 @@
# p2a = new_with_vtable(descr=nodesize)
p3anew = new_with_vtable(descr=nodesize)
p2 = new_with_vtable(descr=nodesize)
- setfield_gc(p3a, p2, descr=otherdescr) # p3a.other = p2a
+ setfield_gc(p3a, p2, descr=nextdescr) # p3a.other = p2a
escape_n(p3anew)
jump(p3anew)
"""
@@ -2819,10 +2819,10 @@
guard_nonnull(p1) []
guard_class(p1, ConstClass(node_vtable2)) []
p2 = getfield_gc_r(p1, descr=nextdescr)
- guard_nonnull(12) []
+ guard_nonnull(ConstPtr(nodeaddr)) []
guard_class(p2, ConstClass(node_vtable)) []
p3 = getfield_gc_r(p1, descr=otherdescr)
- guard_nonnull(12) []
+ guard_nonnull(ConstPtr(nodeaddr)) []
guard_class(p3, ConstClass(node_vtable)) []
p1a = new_with_vtable(descr=nodesize2)
p2a = new_with_vtable(descr=nodesize)
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
@@ -26,12 +26,22 @@
return op
return preamble_op
- def setinfo_from_preamble(self, op, preamble_info):
+ def setinfo_from_preamble_list(self, lst, infos):
+ for item in lst:
+ if item is None:
+ continue
+ i = infos.get(item, None)
+ if i is not None:
+ self.setinfo_from_preamble(item, i, infos)
+
+ def setinfo_from_preamble(self, op, preamble_info, exported_infos):
op = self.get_box_replacement(op)
if isinstance(preamble_info, info.PtrInfo):
if preamble_info.is_virtual():
# XXX do we want to sanitize this?
op.set_forwarded(preamble_info)
+ self.setinfo_from_preamble_list(preamble_info.all_items(),
+ exported_infos)
return
if op.is_constant():
return # nothing we can learn
@@ -245,6 +255,8 @@
for arg in end_args:
infos[arg] = self.optimizer.getinfo(arg)
label_args = virtual_state.make_inputargs(end_args, self.optimizer)
+ for arg in label_args:
+ infos[arg] = self.optimizer.getinfo(arg)
sb = ShortBoxes()
short_boxes = sb.create_short_boxes(self.optimizer, renamed_inputargs,
label_args)
@@ -314,7 +326,8 @@
source.set_forwarded(target)
info = exported_state.exported_infos.get(target, None)
if info is not None:
- self.optimizer.setinfo_from_preamble(source, info)
+ self.optimizer.setinfo_from_preamble(source, info,
+ exported_state.exported_infos)
# import the optimizer state, starting from boxes that can be produced
# by short preamble
self.short_preamble_producer = ShortPreambleBuilder(
More information about the pypy-commit
mailing list