[pypy-commit] pypy optresult: hack on failargs a bit
fijal
noreply at buildbot.pypy.org
Mon Nov 17 11:03:42 CET 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r74546:10ebae54d9f8
Date: 2014-11-17 09:55 +0200
http://bitbucket.org/pypy/pypy/changeset/10ebae54d9f8/
Log: hack on failargs a bit
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
@@ -315,6 +315,7 @@
raise InvalidLoop('A GUARD_VALUE (%s) was proven to always fail' % r)
op = old_guard_op.copy_and_change(rop.GUARD_VALUE,
args = [old_guard_op.getarg(0), op.getarg(1)])
+ self.getvalue(old_guard_op).box = op
self.optimizer.replaces_guard[op] = old_guard_op
# hack hack hack. Change the guard_opnum on
# new_guard_op.getdescr() so that when resuming,
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
@@ -338,11 +338,21 @@
class Storage(compile.ResumeGuardDescr):
"for tests."
+ def __init__(self, metainterp_sd=None, original_greenkey=None):
+ self.metainterp_sd = metainterp_sd
+ self.original_greenkey = original_greenkey
+ def store_final_boxes(self, op, boxes, metainterp_sd):
+ op.setfailargs(boxes)
+ def __eq__(self, other):
+ return type(self) is type(other) # xxx obscure
def clone_if_mutable(self):
- return Storage()
+ res = Storage(self.metainterp_sd, self.original_greenkey)
+ self.copy_all_attributes_into(res)
+ return res
- def store_final_boxes(self, *args):
- pass
+def _sortboxes(boxes):
+ _kind2count = {history.INT: 1, history.REF: 2, history.FLOAT: 3}
+ return sorted(boxes, key=lambda box: _kind2count[box.type])
class BaseTest(object):
@@ -366,6 +376,8 @@
if fail_args is None:
return None
descr = Storage()
+ descr.rd_frame_info_list = resume.FrameInfo(None, "code", 11)
+ descr.rd_snapshot = resume.Snapshot(None, _sortboxes(fail_args))
return descr
def assert_equal(self, optimized, expected, text_right=None):
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
@@ -170,5 +170,24 @@
remap[op2] = op1
if op1.getopnum() not in (rop.JUMP, rop.LABEL) and not op1.is_guard(): # xxx obscure
assert op1.getdescr() == op2.getdescr()
+ if op1.getfailargs() or op2.getfailargs():
+ assert len(op1.getfailargs()) == len(op2.getfailargs())
+ if strict_fail_args:
+ for x, y in zip(op1.getfailargs(), op2.getfailargs()):
+ if x is None:
+ assert remap.get(y, y) is None
+ else:
+ assert x.same_box(remap.get(y, y))
+ else:
+ fail_args1 = set(op1.getfailargs())
+ fail_args2 = set([remap.get(y, y) for y in op2.getfailargs()])
+ for x in fail_args1:
+ for y in fail_args2:
+ if x.same_box(y):
+ fail_args2.remove(y)
+ break
+ else:
+ assert False
+
assert len(oplist1) == len(oplist2)
return True
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
@@ -46,7 +46,7 @@
def visitor_walk_recursive(self, visitor):
# checks for recursion: it is False unless
# we have already seen the very same keybox
- if self.box is None and not visitor.already_seen_virtual(self.keybox):
+ if self.box is None and not visitor.already_seen_virtual(self.source_op):
self._visitor_walk_recursive(visitor)
def _visitor_walk_recursive(self, visitor):
@@ -189,7 +189,7 @@
def _visitor_walk_recursive(self, visitor):
lst = self._get_field_descr_list()
fieldboxes = [self._fields[ofs].get_key_box() for ofs in lst]
- visitor.register_virtual_fields(self.keybox, fieldboxes)
+ visitor.register_virtual_fields(self.source_op, fieldboxes)
for ofs in lst:
fieldvalue = self._fields[ofs]
fieldvalue.visitor_walk_recursive(visitor)
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -93,7 +93,8 @@
if descr is None:
descr = self.getdescr()
newop = ResOperation(opnum, args, descr)
- newop.copy_value_from(self)
+ if self.type != 'v':
+ newop.copy_value_from(self)
return newop
@specialize.argtype(1)
diff --git a/rpython/jit/metainterp/resume.py b/rpython/jit/metainterp/resume.py
--- a/rpython/jit/metainterp/resume.py
+++ b/rpython/jit/metainterp/resume.py
@@ -335,7 +335,7 @@
self._register_boxes(fieldboxes)
def register_box(self, box):
- if (isinstance(box, Box) and box not in self.liveboxes_from_env
+ if (not isinstance(box, Const) and box not in self.liveboxes_from_env
and box not in self.liveboxes):
self.liveboxes[box] = UNASSIGNED
More information about the pypy-commit
mailing list