[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