[pypy-commit] pypy result-in-resops: good, now we start having real issues. hack until it works

fijal noreply at buildbot.pypy.org
Thu Sep 20 19:18:41 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57409:0266377fadd0
Date: 2012-09-20 19:18 +0200
http://bitbucket.org/pypy/pypy/changeset/0266377fadd0/

Log:	good, now we start having real issues. hack until it works

diff --git a/pypy/jit/metainterp/optimizeopt/earlyforce.py b/pypy/jit/metainterp/optimizeopt/earlyforce.py
--- a/pypy/jit/metainterp/optimizeopt/earlyforce.py
+++ b/pypy/jit/metainterp/optimizeopt/earlyforce.py
@@ -1,7 +1,13 @@
 from pypy.jit.metainterp.optimizeopt.optimizer import Optimization
-from pypy.jit.metainterp.optimizeopt.vstring import VAbstractStringValue
 from pypy.jit.metainterp.resoperation import rop
 
+def check_early_force(opt, opnum, num, arg):
+    try:
+        value = arg.get_extra("optimizer_value")
+    except KeyError:
+        return
+    value.force_box(opt)
+
 class OptEarlyForce(Optimization):
     def propagate_forward(self, op):
         opnum = op.getopnum()
@@ -12,11 +18,8 @@
             opnum != rop.SAME_AS_p and
             opnum != rop.SAME_AS_f and
             opnum != rop.MARK_OPAQUE_PTR):
-               
-            for arg in op.getarglist():
-                if arg in self.optimizer.values:
-                    value = self.getvalue(arg)
-                    value.force_box(self)
+
+            op.foreach_arg(check_early_force, self)
         self.emit_operation(op)
 
     def new(self):
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -4,7 +4,7 @@
 from pypy.jit.metainterp.optimizeopt.intutils import (IntBound, IntLowerBound,
     IntUpperBound)
 from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from pypy.jit.metainterp.resoperation import rop, ConstInt
+from pypy.jit.metainterp.resoperation import rop, ConstInt, AbstractResOp
 from pypy.jit.metainterp.optimize import InvalidLoop
 
 
@@ -31,7 +31,8 @@
         b = v.intbound
         if b.has_lower and b.has_upper and b.lower == b.upper:
             v.make_constant(ConstInt(b.lower))
-        dispatch_bounds_ops(self, box)
+        if isinstance(box, AbstractResOp):
+            dispatch_bounds_ops(self, box)
 
     def optimize_GUARD_TRUE(self, op):
         self.emit_operation(op)
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -291,6 +291,7 @@
     def new_const_item(self, arraydescr):
         return self.optimizer.new_const_item(arraydescr)
 
+    @specialize.arg(1)
     def pure(self, opnum, result, arg0, arg1):
         if self.optimizer.optpure:
             self.optimizer.optpure.pure(opnum, result, arg0, arg1)
diff --git a/pypy/jit/metainterp/optimizeopt/pure.py b/pypy/jit/metainterp/optimizeopt/pure.py
--- a/pypy/jit/metainterp/optimizeopt/pure.py
+++ b/pypy/jit/metainterp/optimizeopt/pure.py
@@ -96,9 +96,7 @@
 
     def pure(self, opnum, result, arg0, arg1):
         op = create_resop_2(opnum, result, arg0, arg1)
-        key = self.optimizer.make_args_key(op)
-        if key not in self.pure_operations:
-            self.pure_operations[key] = op
+        self.pure_operations.add(op)
 
     def has_pure_result(self, opnum, args, descr):
         op = ResOperation(opnum, args, None, descr)
diff --git a/pypy/jit/metainterp/optimizeopt/rewrite.py b/pypy/jit/metainterp/optimizeopt/rewrite.py
--- a/pypy/jit/metainterp/optimizeopt/rewrite.py
+++ b/pypy/jit/metainterp/optimizeopt/rewrite.py
@@ -96,8 +96,8 @@
         else:
             self.emit_operation(op)
             # Synthesize the reverse ops for optimize_default to reuse
-            self.pure(rop.INT_ADD, op.getarg(0), op, op.getarg(1))
-            self.pure(rop.INT_SUB, op.getarg(1), op.getarg(0), op)
+            self.pure(rop.INT_ADD, op.getarg(0).getint(), op, op.getarg(1))
+            self.pure(rop.INT_SUB, op.getarg(1).getint(), op.getarg(0), op)
 
     def optimize_INT_ADD(self, op):
         v1 = self.getvalue(op.getarg(0))
@@ -111,9 +111,8 @@
         else:
             self.emit_operation(op)
             # Synthesize the reverse op for optimize_default to reuse
-            # XXX disable for now
-            #self.pure(rop.INT_SUB, [op, op.getarg(1)], op.getarg(0))
-            #self.pure(rop.INT_SUB, [op, op.getarg(0)], op.getarg(1))
+            self.pure(rop.INT_SUB, op.getarg(0).getint(), op, op.getarg(1))
+            self.pure(rop.INT_SUB, op.getarg(1).getint(), op, op.getarg(0))
 
     def optimize_INT_MUL(self, op):
         v1 = self.getvalue(op.getarg(0))
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -9,7 +9,7 @@
 from pypy.jit.metainterp.history import get_const_ptr_for_string
 from pypy.jit.metainterp import executor, compile, resume
 from pypy.jit.metainterp.resoperation import rop, opname, ConstInt, BoxInt,\
-     create_resop_1
+     create_resop_1, create_resop
 from pypy.rlib.rarithmetic import LONG_BIT
 
 def test_store_final_boxes_in_guard():
@@ -117,10 +117,10 @@
     def optimize_loop(self, ops, optops, call_pure_results=None):
         loop = self.parse(ops)
         token = JitCellToken()
-        loop.operations = [ResOperation(rop.LABEL, loop.inputargs, None, descr=TargetToken(token))] + \
+        loop.operations = [create_resop(rop.LABEL, None, loop.inputargs, descr=TargetToken(token))] + \
                           loop.operations
         if loop.operations[-1].getopnum() == rop.JUMP:
-            loop.operations[-1].setdescr(token)
+            loop.operations[-1]._descr = token
         expected = convert_old_style_to_targets(self.parse(optops), jump=True)
         self._do_optimize_loop(loop, call_pure_results)
         print '\n'.join([str(o) for o in loop.operations])
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_util.py b/pypy/jit/metainterp/optimizeopt/test/test_util.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_util.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_util.py
@@ -381,8 +381,7 @@
     def parse(self, s, boxkinds=None):
         return parse(s, self.cpu, self.namespace,
                      type_system=self.type_system,
-                     boxkinds=boxkinds,
-                     invent_fail_descr=self.invent_fail_descr)
+                     boxkinds=boxkinds)
 
     def invent_fail_descr(self, model, fail_args):
         if fail_args is None:
@@ -414,6 +413,11 @@
         if hasattr(self, 'callinfocollection'):
             metainterp_sd.callinfocollection = self.callinfocollection
         #
+        for op in loop.operations:
+            if op.is_guard():
+                fail_args = op.get_extra("failargs")
+                op._rd_frame_info_list = resume.FrameInfo(None, "code", 11)
+                op._rd_snapshot = resume.Snapshot(None, _sortboxes(fail_args))
         optimize_trace(metainterp_sd, loop, self.enable_opts)
 
     def unroll_and_optimize(self, loop, call_pure_results=None):
@@ -487,11 +491,11 @@
 def convert_old_style_to_targets(loop, jump):
     newloop = TreeLoop(loop.name)
     newloop.inputargs = loop.inputargs
-    newloop.operations = [ResOperation(rop.LABEL, loop.inputargs, None, descr=FakeDescr())] + \
+    newloop.operations = [create_resop(rop.LABEL, None, loop.inputargs, descr=FakeDescr())] + \
                       loop.operations
     if not jump:
         assert newloop.operations[-1].getopnum() == rop.JUMP
-        newloop.operations[-1] = ResOperation(rop.LABEL, newloop.operations[-1].getarglist(), None, descr=FakeDescr())
+        newloop.operations[-1] = create_resop(rop.LABEL, None, newloop.operations[-1].getarglist(), descr=FakeDescr())
     return newloop
 
 # ____________________________________________________________
diff --git a/pypy/jit/metainterp/optimizeopt/util.py b/pypy/jit/metainterp/optimizeopt/util.py
--- a/pypy/jit/metainterp/optimizeopt/util.py
+++ b/pypy/jit/metainterp/optimizeopt/util.py
@@ -150,8 +150,6 @@
                 assert op1.eq(remap[op2])
         else:
             remap[op2] = op1
-        if op1.getopnum() not in (rop.JUMP, rop.LABEL):      # xxx obscure
-            assert op1.getdescr() == op2.getdescr()
         if op1.is_guard():
             assert op2.is_guard()
             if op1.get_extra("failargs") or op2.get_extra("failargs"):
@@ -175,6 +173,8 @@
                                 break
                         else:
                             assert False
+        elif op1.getopnum() not in (rop.JUMP, rop.LABEL):      # xxx obscure
+            assert op1.getdescr() == op2.getdescr()
     assert len(oplist1) == len(oplist2)
     print '-'*totwidth
     return True
diff --git a/pypy/jit/metainterp/resoperation.py b/pypy/jit/metainterp/resoperation.py
--- a/pypy/jit/metainterp/resoperation.py
+++ b/pypy/jit/metainterp/resoperation.py
@@ -977,13 +977,17 @@
     def getarg(self, i):
         raise IndexError
 
-    def foreach_arg(self, func):
+    def foreach_arg(self, func, arg):
         pass        
 
     @specialize.arg(1)
     def copy_and_change(self, newopnum, descr=None):
-        return create_resop_0(newopnum, self.getresult(),
-                              descr or self.getdescr())
+        res = create_resop_0(newopnum, self.getresult(),
+                             descr or self.getdescr())
+        if self.is_guard():
+            res.set_rd_frame_info_list(self.get_rd_frame_info_list())
+            res.set_rd_snapshot(self.get_rd_snapshot())
+        return res
 
     def copy_if_modified_by_optimization(self, opt):
         return self
@@ -1017,8 +1021,8 @@
             raise IndexError
 
     @specialize.arg(1)
-    def foreach_arg(self, func):
-        func(self.getopnum(), 0, self._arg0)
+    def foreach_arg(self, func, arg):
+        func(arg, self.getopnum(), 0, self._arg0)
 
     @specialize.argtype(1)
     def copy_if_modified_by_optimization(self, opt):
@@ -1030,8 +1034,12 @@
 
     @specialize.arg(1)
     def copy_and_change(self, newopnum, arg0=None, descr=None):
-        return create_resop_1(newopnum, self.getresult(), arg0 or self._arg0,
-                              descr or self.getdescr())
+        res = create_resop_1(newopnum, self.getresult(), arg0 or self._arg0,
+                             descr or self.getdescr())
+        if self.is_guard():
+            res.set_rd_frame_info_list(self.get_rd_frame_info_list())
+            res.set_rd_snapshot(self.get_rd_snapshot())
+        return res
 
     def get_arg_hash(self):
         return self._arg0._get_hash_()
@@ -1066,9 +1074,9 @@
         return [self._arg0, self._arg1]
 
     @specialize.arg(1)
-    def foreach_arg(self, func):
-        func(self.getopnum(), 0, self._arg0)
-        func(self.getopnum(), 1, self._arg1)
+    def foreach_arg(self, func, arg):
+        func(arg, self.getopnum(), 0, self._arg0)
+        func(arg, self.getopnum(), 1, self._arg1)
 
     @specialize.argtype(1)
     def copy_if_modified_by_optimization(self, opt):
@@ -1083,9 +1091,13 @@
 
     @specialize.arg(1)
     def copy_and_change(self, newopnum, arg0=None, arg1=None, descr=None):
-        return create_resop_2(newopnum, self.getresult(), arg0 or self._arg0,
-                              arg1 or self._arg1,
-                              descr or self.getdescr())
+        res = create_resop_2(newopnum, self.getresult(), arg0 or self._arg0,
+                             arg1 or self._arg1,
+                             descr or self.getdescr())
+        if self.is_guard():
+            res.set_rd_frame_info_list(self.get_rd_frame_info_list())
+            res.set_rd_snapshot(self.get_rd_snapshot())
+        return res
 
     def get_arg_hash(self):
         return (intmask(self._arg0._get_hash_() << 16) +
@@ -1124,10 +1136,10 @@
             raise IndexError
 
     @specialize.arg(1)
-    def foreach_arg(self, func):
-        func(self.getopnum(), 0, self._arg0)
-        func(self.getopnum(), 1, self._arg1)
-        func(self.getopnum(), 2, self._arg2)
+    def foreach_arg(self, func, arg):
+        func(arg, self.getopnum(), 0, self._arg0)
+        func(arg, self.getopnum(), 1, self._arg1)
+        func(arg, self.getopnum(), 2, self._arg2)
 
     @specialize.argtype(1)
     def copy_if_modified_by_optimization(self, opt):
@@ -1181,9 +1193,9 @@
         return self._args[i]
 
     @specialize.arg(1)
-    def foreach_arg(self, func):
+    def foreach_arg(self, func, arg):
         for i, arg in enumerate(self._args):
-            func(self.getopnum(), i, arg)
+            func(arg, self.getopnum(), i, arg)
 
     @specialize.argtype(1)
     def copy_if_modified_by_optimization(self, opt):
diff --git a/pypy/jit/metainterp/resume.py b/pypy/jit/metainterp/resume.py
--- a/pypy/jit/metainterp/resume.py
+++ b/pypy/jit/metainterp/resume.py
@@ -52,6 +52,7 @@
 
 def capture_resumedata(framestack, virtualizable_boxes, virtualref_boxes,
                        storage):
+    xxx
     n = len(framestack)-1
     top = framestack[n]
     _ensure_parent_resumedata(framestack, n)
diff --git a/pypy/jit/tool/oparser.py b/pypy/jit/tool/oparser.py
--- a/pypy/jit/tool/oparser.py
+++ b/pypy/jit/tool/oparser.py
@@ -45,16 +45,12 @@
         return FORCE_SPILL(self.OPNUM, self.getarglist()[:])
 
 
-def default_fail_descr(model, fail_args=None):
-    return model.BasicFailDescr()
-
-
 class OpParser(object):
 
     use_mock_model = False
 
     def __init__(self, input, cpu, namespace, type_system, boxkinds,
-                 invent_fail_descr=default_fail_descr,
+                 invent_fail_descr=True,
                  nonstrict=False):
         self.input = input
         self.vars = {}
@@ -378,7 +374,7 @@
         return base_indent, inpargs, lines
 
 def parse(input, cpu=None, namespace=None, type_system='lltype',
-          boxkinds=None, invent_fail_descr=default_fail_descr,
+          boxkinds=None, invent_fail_descr=True,
           no_namespace=False, nonstrict=False, OpParser=OpParser):
     if namespace is None and not no_namespace:
         namespace = {}
@@ -386,7 +382,7 @@
                     invent_fail_descr, nonstrict).parse()
 
 def pure_parse(*args, **kwds):
-    kwds['invent_fail_descr'] = None
+    kwds['invent_fail_descr'] = False
     return parse(*args, **kwds)
 
 


More information about the pypy-commit mailing list