[pypy-commit] pypy optresult: start fixing the merge

fijal noreply at buildbot.pypy.org
Sat Jan 3 21:36:36 CET 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r75219:2baf29ac51a3
Date: 2015-01-03 22:36 +0200
http://bitbucket.org/pypy/pypy/changeset/2baf29ac51a3/

Log:	start fixing the merge

diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -173,9 +173,6 @@
 class Const(AbstractValue):
     __slots__ = ()
 
-    is_source_op = True
-    source_op = None
-
     @staticmethod
     def _new(x):
         "NOT_RPYTHON"
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
@@ -151,7 +151,7 @@
                     opnum = OpHelpers.getfield_for_descr(op.getdescr())
                     getop = ResOperation(opnum, [op.getarg(0)],
                                          op.getdescr())
-                    getop.source_op = result
+                    xxx
                     if isinstance(result, Const):
                         optimizer.make_constant(getop, result)
                         getop.is_source_op = True
@@ -165,6 +165,7 @@
                     getop = ResOperation(opnum, [op.getarg(0), op.getarg(1)],
                                          op.getdescr())
                     getop.source_op = result
+                    xxx
                     if isinstance(result, Const):
                         xxx
                         optimizer.make_constant(getop, result)
diff --git a/rpython/jit/metainterp/optimizeopt/intbounds.py b/rpython/jit/metainterp/optimizeopt/intbounds.py
--- a/rpython/jit/metainterp/optimizeopt/intbounds.py
+++ b/rpython/jit/metainterp/optimizeopt/intbounds.py
@@ -245,8 +245,7 @@
             # Transform into INT_ADD.  The following guard will be killed
             # by optimize_GUARD_NO_OVERFLOW; if we see instead an
             # optimize_GUARD_OVERFLOW, then InvalidLoop.
-            xxx
-            op = op.copy_and_change(rop.INT_ADD)
+            op = self.replace_op_with(op, rop.INT_ADD)
         self.emit_operation(op) # emit the op
         r = self.getvalue(op)
         r.getintbound().intersect(resbound)
@@ -527,7 +526,7 @@
     def propagate_bounds_INT_ADD(self, op):
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = r.getintbound().sub_bound(v2.getintbound())
         if v1.getintbound().intersect(b):
             self.propagate_bounds_backward(op.getarg(0), v1)
@@ -538,7 +537,7 @@
     def propagate_bounds_INT_SUB(self, op):
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = r.getintbound().add_bound(v2.getintbound())
         if v1.getintbound().intersect(b):
             self.propagate_bounds_backward(op.getarg(0), v1)
@@ -549,7 +548,7 @@
     def propagate_bounds_INT_MUL(self, op):
         v1 = self.getvalue(op.getarg(0))
         v2 = self.getvalue(op.getarg(1))
-        r = self.getvalue(op.result)
+        r = self.getvalue(op)
         b = r.getintbound().div_bound(v2.getintbound())
         if v1.getintbound().intersect(b):
             self.propagate_bounds_backward(op.getarg(0), v1)
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -324,10 +324,7 @@
         if intbound:
             self.intbound = intbound
         else:
-            if isinstance(box, BoxInt):
-                self.intbound = IntBound(MININT, MAXINT)
-            else:
-                self.intbound = IntUnbounded()
+            self.intbound = IntBound(MININT, MAXINT)
 
     def copy_from(self, other_value):
         assert isinstance(other_value, IntOptValue)
@@ -595,18 +592,16 @@
 
     @specialize.argtype(0)
     def getvalue(self, box):
-        while box.source_op is not None:
-            box = box.source_op
-        assert box.is_source_op
         box = self.getinterned(box)
         try:
             value = self.values[box]
         except KeyError:
-            if isinstance(box, BoxPtr) or isinstance(box, ConstPtr):
+            if box.type == "r":
                 value = self.values[box] = PtrOptValue(box)
-            elif isinstance(box, BoxInt) or isinstance(box, ConstInt):
+            elif box.type == "i":
                 value = self.values[box] = IntOptValue(box)
             else:
+                assert box.type == "f"
                 value = self.values[box] = OptValue(box)
         self.ensure_imported(value)
         return value
@@ -625,8 +620,6 @@
     def get_constant_box(self, box):
         if isinstance(box, Const):
             return box
-        while box.source_op is not None:
-            box = box.source_op
         try:
             value = self.values[box]
             self.ensure_imported(value)
@@ -657,11 +650,21 @@
                 # replacing with a different box
                 cur_value.copy_from(value)
                 return
+        if not replace:
+            assert box not in self.values
         self.values[box] = value
 
+    def replace_op_with(self, op, newopnum, args=None, descr=None):
+        newop = op.copy_and_change(newopnum, args, descr)
+        if newop.type != 'v':
+            val = self.getvalue(op)
+            val.box = newop
+            self.values[newop] = val
+        return newop
+
     def make_constant(self, box, constbox):
         if isinstance(constbox, ConstInt):
-            self.make_equal_to(box, ConstantIntValue(constbox))
+            self.getvalue(box).make_constant(constbox)
         elif isinstance(constbox, ConstPtr):
             self.make_equal_to(box, ConstantPtrValue(constbox))
         elif isinstance(constbox, ConstFloat):
@@ -734,10 +737,6 @@
     @specialize.argtype(0)
     def _emit_operation(self, op):
         assert not op.is_call_pure()
-        if op.getopnum() == rop.GUARD_VALUE:
-            val = self.getvalue(op.getarg(0))
-        else:
-            val = None
         changed = False
         orig_op = op
         for i in range(op.numargs()):
@@ -751,7 +750,7 @@
                 newbox = value.force_box(self)
                 if arg is not newbox:
                     if not changed:
-                        op = op.clone()
+                        op = self.replace_op_with(op, op.getopnum())
                         changed = True
                     op.setarg(i, newbox)
         self.metainterp_sd.profiler.count(jitprof.Counters.OPT_OPS)
@@ -760,13 +759,12 @@
             pendingfields = self.pendingfields
             self.pendingfields = None
             if self.replaces_guard and orig_op in self.replaces_guard:
-                self.replace_op(self.replaces_guard[orig_op], op)
+                self.replace_guard_op(self.replaces_guard[orig_op], op)
                 del self.replaces_guard[op]
                 return
             else:
-                guard_op = op.clone()
-                op = self.store_final_boxes_in_guard(guard_op, pendingfields,
-                                                     val)
+                guard_op = self.replace_op_with(op, op.getopnum())
+                op = self.store_final_boxes_in_guard(guard_op, pendingfields)
         elif op.can_raise():
             self.exception_might_have_happened = True
         self._last_emitted_op = orig_op
@@ -784,11 +782,11 @@
                 if box is not arg:
                     if not changed:
                         changed = True
-                        op = op.clone()
+                        op = self.replace_op_with(op, op.getopnum())
                     op.setarg(i, box)
         return op
 
-    def replace_op(self, old_op_pos, new_op):
+    def replace_guard_op(self, old_op_pos, new_op):
         old_op = self._newoperations[old_op_pos]
         assert old_op.is_guard()
         old_descr = old_op.getdescr()
@@ -796,7 +794,7 @@
         new_descr.copy_all_attributes_from(old_descr)
         self._newoperations[old_op_pos] = new_op
 
-    def store_final_boxes_in_guard(self, op, pendingfields, val):
+    def store_final_boxes_in_guard(self, op, pendingfields):
         assert pendingfields is not None
         if op.getdescr() is not None:
             descr = op.getdescr()
@@ -818,12 +816,12 @@
         descr.store_final_boxes(op, newboxes, self.metainterp_sd)
         #
         if op.getopnum() == rop.GUARD_VALUE:
+            val = self.getvalue(op.getarg(0))
             if val in self.bool_boxes:
                 # Hack: turn guard_value(bool) into guard_true/guard_false.
                 # This is done after the operation is emitted to let
                 # store_final_boxes_in_guard set the guard_opnum field of the
                 # descr to the original rop.GUARD_VALUE.
-                v = self.getvalue(op)
                 constvalue = op.getarg(1).getint()
                 if constvalue == 0:
                     opnum = rop.GUARD_FALSE
@@ -831,9 +829,8 @@
                     opnum = rop.GUARD_TRUE
                 else:
                     raise AssertionError("uh?")
-                newop = ResOperation(opnum, [op.getarg(0)], descr)
+                newop = self.replace_op_with(op, opnum, [op.getarg(0)], descr)
                 newop.setfailargs(op.getfailargs())
-                v.box = newop
                 return newop
             else:
                 # a real GUARD_VALUE.  Make it use one counter per value.
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -56,7 +56,7 @@
         if nextop:
             self.emit_operation(nextop)
         if args is not None:
-            self.pure_operations[args] = self.getvalue(op.result)
+            self.pure_operations[args] = self.getvalue(op)
         if remember:
             self.remember_emitting_pure(remember)
 
@@ -75,14 +75,13 @@
                                             op.getdescr())
         oldval = self.pure_operations.get(args, None)
         if oldval is not None:
-            assert oldop.getopnum() == op.getopnum()
             # this removes a CALL_PURE that has the same (non-constant)
             # arguments as a previous CALL_PURE.
             self.make_equal_to(op, oldval)
             self.last_emitted_operation = REMOVED
             return
         else:
-            self.pure_operations[args] = self.getvalue(op.result)
+            self.pure_operations[args] = self.getvalue(op)
 
         # replace CALL_PURE with just CALL
         args = op.getarglist()
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
@@ -291,7 +291,6 @@
 
     def optimize_GUARD_VALUE(self, op):
         value = self.getvalue(op.getarg(0))
-        opv = self.getvalue(op)
         if value.is_virtual():
             arg = value.get_constant_class(self.optimizer.cpu)
             if arg:
@@ -346,7 +345,6 @@
         value.make_constant_class(None, expectedclassbox)
 
     def optimize_GUARD_CLASS(self, op):
-        opv = self.getvalue(op)
         value = self.getvalue(op.getarg(0))
         expectedclassbox = op.getarg(1)
         assert isinstance(expectedclassbox, Const)
diff --git a/rpython/jit/metainterp/optimizeopt/simplify.py b/rpython/jit/metainterp/optimizeopt/simplify.py
--- a/rpython/jit/metainterp/optimizeopt/simplify.py
+++ b/rpython/jit/metainterp/optimizeopt/simplify.py
@@ -54,7 +54,7 @@
 
     def optimize_JUMP(self, op):
         if not self.unroll:
-            op = op.clone()
+            op = op.copy_and_change(op.getopnum())
             descr = op.getdescr()
             assert isinstance(descr, JitCellToken)
             if not descr.target_tokens:
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -18,7 +18,7 @@
     b0 = InputArgInt()
     b1 = InputArgInt()
     opt = optimizeopt.Optimizer(FakeMetaInterpStaticData(LLtypeMixin.cpu),
-                                None)
+                                None, None)
     op = ResOperation(rop.GUARD_TRUE, ['dummy'], None)
     # setup rd data
     fi0 = resume.FrameInfo(None, "code0", 11)
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
@@ -97,44 +97,6 @@
 
 
 class OptimizeOptTest(BaseTestWithUnroll):
-<<<<<<< local
-    def setup_method(self, meth=None):
-        class FailDescr(compile.ResumeGuardDescr):
-            oparse = None
-            def _oparser_uses_descr_of_guard(self, oparse, fail_args):
-                # typically called 3 times: once when parsing 'ops',
-                # once when parsing 'preamble', once when parsing 'expected'.
-                self.oparse = oparse
-                self.rd_frame_info_list, self.rd_snapshot = snapshot(fail_args)
-            def _clone_if_mutable(self, memo):
-                assert self is fdescr
-                return fdescr2
-            def __repr__(self):
-                if self is fdescr:
-                    return 'fdescr'
-                if self is fdescr2:
-                    return 'fdescr2'
-                return compile.ResumeGuardDescr.__repr__(self)
-        #
-        def snapshot(fail_args, got=[]):
-            if not got:    # only the first time, i.e. when parsing 'ops'
-                rd_frame_info_list = resume.FrameInfo(None, "code", 11)
-                rd_snapshot = resume.Snapshot(None, fail_args)
-                got.append(rd_frame_info_list)
-                got.append(rd_snapshot)
-            return got
-        #
-        fdescr = instantiate(FailDescr)
-        self.namespace['fdescr'] = fdescr
-        fdescr2 = instantiate(FailDescr)
-        self.namespace['fdescr2'] = fdescr2
-
-    def teardown_method(self, meth):
-        self.namespace.pop('fdescr', None)
-        self.namespace.pop('fdescr2', None)
-
-=======
->>>>>>> other
     def test_simple(self):
         ops = """
         []
@@ -1184,11 +1146,7 @@
         i1 = getfield_gc_i(p0, descr=valuedescr)
         i2 = int_sub(i1, 1)
         i3 = int_add(i0, i1)
-<<<<<<< local
         #i4 = same_as_i(i2) # This same_as should be killed by backend
-=======
-        i4 = same_as(i2) # This same_as should be killed by backend
->>>>>>> other
         jump(i3, i1, i2)
         """
         expected = """
@@ -2448,31 +2406,17 @@
         guard_true(i3) [p1]
         i4 = int_neg(i2)
         setfield_gc(p1, NULL, descr=nextdescr)
-<<<<<<< local
         escape_n()
         #i5 = same_as(i4)
         jump(p1, i2, i4)
-=======
-        escape()
-        i5 = same_as(i4)
-        jump(p1, i2, i4, i5)
->>>>>>> other
-        """
-        expected = """
-<<<<<<< local
-        [p1, i2, i4]
-=======
-        [p1, i2, i4, i5]
->>>>>>> other
+        """
+        expected = """
+        [p1, i2, i4] # i5
         guard_true(i4) [p1]
         setfield_gc(p1, NULL, descr=nextdescr)
-<<<<<<< local
         escape_n()
         jump(p1, i2, 1)
-=======
-        escape()
-        jump(p1, i2, i5, i5)
->>>>>>> other
+        #jump(p1, i2, i5, i5)
         """
         self.optimize_loop(ops, expected, preamble)
 
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
@@ -13,7 +13,7 @@
 from rpython.jit.codewriter.effectinfo import EffectInfo
 from rpython.jit.metainterp.logger import LogOperations
 from rpython.jit.codewriter.heaptracker import register_known_gctype
-from rpython.jit.tool.oparser import parse, pure_parse
+from rpython.jit.tool.oparser import OpParser
 from rpython.jit.metainterp.quasiimmut import QuasiImmutDescr
 from rpython.jit.metainterp import compile, resume, history
 from rpython.jit.metainterp.jitprof import EmptyProfiler
@@ -356,7 +356,7 @@
     _kind2count = {history.INT: 1, history.REF: 2, history.FLOAT: 3}
     return sorted(boxes, key=lambda box: _kind2count[box.type])
 
-final_descr = BasicFinalDescr()
+final_descr = history.BasicFinalDescr()
 
 class BaseTest(object):
 
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
@@ -268,9 +268,7 @@
                 # in case it does, we would prefer to be suboptimal in asm
                 # to a fatal RPython exception.
                 # XXX investigate what is it
-                source_op = newresult
-                while source_op.source_op:
-                    source_op = source_op.source_op
+                xxxx
                 if source_op is not op and \
                    not self.short_boxes.has_producer(newresult) and \
                    not newvalue.is_constant():
@@ -396,6 +394,7 @@
         target_token = start_label.getdescr()
         assert isinstance(target_token, TargetToken)
 
+        xxx
         # Turn guards into conditional jumps to the preamble
         #for i in range(len(short)):
         #    op = short[i]
@@ -607,7 +606,6 @@
         while i < len(short_preamble):
             shop = short_preamble[i]
             newop = shop.clone(memo)
-            newop.is_source_op = True
             if newop.is_guard():
                 if not patchguardop:
                     raise InvalidLoop("would like to have short preamble, but it has a guard and there's no guard_future_condition")
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
@@ -638,6 +638,7 @@
         return alts
 
     def add_to_short(self, box, op):
+        xxx
         #if op:
         #    op = op.clone(self.memo)
         #    op.is_source_op = True
diff --git a/rpython/jit/metainterp/optimizeopt/vstring.py b/rpython/jit/metainterp/optimizeopt/vstring.py
--- a/rpython/jit/metainterp/optimizeopt/vstring.py
+++ b/rpython/jit/metainterp/optimizeopt/vstring.py
@@ -66,7 +66,6 @@
                 mode.STRLEN, [box])
         else:
             lengthop = ResOperation(mode.STRLEN, [box])
-            lengthop.is_source_op = True
         string_optimizer.emit_operation(lengthop)
         return lengthop
 
@@ -111,7 +110,7 @@
         assert self.source_op is not None
         lengthbox = self.getstrlen(optforce, self.mode, None)
         op = ResOperation(self.mode.NEWSTR, [lengthbox])
-        op.source_op = self.source_op
+        xxx
         self.box = op
         if not we_are_translated():
             op.name = 'FORCE'
@@ -360,7 +359,7 @@
     if string_optimizer is None:
         return None
     op = ResOperation(rop.INT_ADD, [box1, box2])
-    op.is_source_op = True
+    xxx
     string_optimizer.emit_operation(op)
     return op
 
@@ -371,7 +370,7 @@
         if isinstance(box1, ConstInt):
             return ConstInt(box1.value - box2.value)
     op = ResOperation(rop.INT_SUB, [box1, box2])
-    op.is_source_op = True
+    xxx
     string_optimizer.emit_operation(op)
     return op
 
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
@@ -292,8 +292,8 @@
     def setfailargs(self, fail_args):
         self._fail_args = fail_args
 
-    def copy_and_change(self, opnum, args=None, result=None, descr=None):
-        newop = AbstractResOp.copy_and_change(self, opnum, args, result, descr)
+    def copy_and_change(self, opnum, args=None, descr=None):
+        newop = AbstractResOp.copy_and_change(self, opnum, args, descr)
         assert isinstance(newop, GuardResOp)
         newop.setfailargs(self.getfailargs())
         newop.rd_snapshot = self.rd_snapshot
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
@@ -372,15 +372,8 @@
         storage = self.storage
         # make sure that nobody attached resume data to this guard yet
         assert not storage.rd_numb
-<<<<<<< local
-        snapshot = storage.rd_snapshot
-        if snapshot is None:
-            assert not we_are_translated()
-            return # for tests in optimizeopt
-=======
         snapshot = self.snapshot_storage.rd_snapshot
         assert snapshot is not None # is that true?
->>>>>>> other
         numb, liveboxes_from_env, v = self.memo.number(optimizer, snapshot)
         self.liveboxes_from_env = liveboxes_from_env
         self.liveboxes = {}
diff --git a/rpython/jit/tool/oparser.py b/rpython/jit/tool/oparser.py
--- a/rpython/jit/tool/oparser.py
+++ b/rpython/jit/tool/oparser.py
@@ -22,6 +22,16 @@
     def getopname(self):
         return 'escape'
 
+    def copy_and_change(self, opnum, args=None, descr=None):
+        assert opnum == self.OPNUM
+        op = self.__class__()
+        if args is not None:
+            op.initarglist(args)
+        else:
+            op.initarglist(self._args)
+        assert descr is None
+        return op
+
     def clone(self, memo):
         op = self.__class__()
         op.initarglist([memo.get(arg, arg) for arg in self.getarglist()])
@@ -71,7 +81,7 @@
         op.initarglist(self.getarglist()[:])
         return op
 
-    def _copy_and_change(self, opnum, args=None, descr=None):
+    def copy_and_change(self, opnum, args=None, descr=None):
         assert opnum == self.OPNUM
         newop = FORCE_SPILL()
         newop.initarglist(args or self.getarglist())


More information about the pypy-commit mailing list