[pypy-commit] pypy optresult: (fijal, arigo) completely in-progress

fijal noreply at buildbot.pypy.org
Tue Feb 24 15:05:31 CET 2015


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r76099:9e2e51f4f8a5
Date: 2015-02-24 16:03 +0200
http://bitbucket.org/pypy/pypy/changeset/9e2e51f4f8a5/

Log:	(fijal, arigo) completely in-progress

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
@@ -177,6 +177,8 @@
 class Const(AbstractValue):
     __slots__ = ()
 
+    forwarded = None
+
     @staticmethod
     def _new(x):
         "NOT_RPYTHON"
@@ -207,6 +209,9 @@
     def repr(self, memo):
         return self.repr_rpython()
 
+    def is_constant(self):
+        return True
+
     def __repr__(self):
         return 'Const(%s)' % self._getrepr_()
 
diff --git a/rpython/jit/metainterp/optimizeopt/generalize.py b/rpython/jit/metainterp/optimizeopt/generalize.py
--- a/rpython/jit/metainterp/optimizeopt/generalize.py
+++ b/rpython/jit/metainterp/optimizeopt/generalize.py
@@ -1,5 +1,5 @@
 from rpython.jit.metainterp.optimizeopt.optimizer import MININT, MAXINT,\
-     IntOptValue
+     IntOptInfo
 
 
 class GeneralizationStrategy(object):
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
@@ -4,7 +4,7 @@
 from rpython.jit.metainterp.optimizeopt.intutils import (IntBound, IntLowerBound,
     IntUpperBound)
 from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, CONST_1,
-    CONST_0, MODE_ARRAY, MODE_STR, MODE_UNICODE, IntOptValue)
+    CONST_0, MODE_ARRAY, MODE_STR, MODE_UNICODE, IntOptInfo)
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
 from rpython.jit.metainterp.resoperation import rop, AbstractResOp
 from rpython.jit.backend.llsupport import symbolic
@@ -111,9 +111,10 @@
             r.getintbound().intersect(IntBound(0, next_pow2_m1(lesser)))
 
     def optimize_INT_SUB(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
+        v1 = self.getinfo(op.getarg(0))
+        v2 = self.getinfo(op.getarg(1))
         self.emit_operation(op)
+        xxx
         r = self.getvalue(op)
         b = v1.getintbound().sub_bound(v2.getintbound())
         if b.bounded():
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
@@ -2,13 +2,11 @@
 from rpython.jit.metainterp.executor import execute_nonspec_const
 from rpython.jit.metainterp.logger import LogOperations
 from rpython.jit.metainterp.history import Const, ConstInt, REF
-from rpython.jit.metainterp.optimizeopt.intutils import IntBound, IntUnbounded, \
-                                                     ImmutableIntUnbounded, \
-                                                     IntLowerBound, MININT,\
-                                                     MAXINT
+from rpython.jit.metainterp.optimizeopt.intutils import IntBound,\
+     ImmutableIntUnbounded, IntLowerBound, MININT, MAXINT
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
 from rpython.jit.metainterp.resoperation import rop, ResOperation,\
-     AbstractResOp, AbstractInputArg, DONT_CHANGE, GuardResOp
+     AbstractResOp, AbstractInputArg, GuardResOp
 from rpython.jit.metainterp.typesystem import llhelper
 from rpython.tool.pairtype import extendabletype
 from rpython.rlib.debug import debug_print
@@ -45,21 +43,17 @@
                 self.descr == other.descr and
                 self.bound.contains_bound(other.bound))
 
-class OptValue(object):
-    __metaclass__ = extendabletype
-    _attrs_ = ('box', '_tag')
-
+class OptInfo(object):
+    _attrs_ = ('_tag',)
     _tag = 0
 
-    def __init__(self, box, level=None, known_class=None, intbound=None):
-        self.box = box
+    forwarded = None
+
+    def __init__(self, level=LEVEL_UNKNOWN, known_class=None, intbound=None):
+        assert isinstance(level, int)
         if level is not None:
             self._tag = level
 
-        if isinstance(box, Const):
-            self.make_constant(box)
-        # invariant: box is a Const if and only if level == LEVEL_CONSTANT
-
     def getlevel(self):
         return self._tag & 0x3
 
@@ -92,9 +86,7 @@
         self._tag = other_value._tag
 
     def force_box(self, optforce):
-        return self.box
-
-    def get_key_box(self):
+        xxx
         return self.box
 
     def force_at_end_of_preamble(self, already_forced, optforce):
@@ -155,10 +147,7 @@
         return box.getint()
 
     def is_virtual(self):
-        # Don't check this with 'isinstance(_, VirtualValue)'!
-        # Even if it is a VirtualValue, the 'box' can be non-None,
-        # meaning it has been forced.
-        return self.box is None
+        return False # overwridden in VirtualInfo
 
     def is_forced_virtual(self):
         return False
@@ -214,7 +203,7 @@
     def get_constant_class(self, cpu):
         return None
 
-class PtrOptValue(OptValue):
+class PtrOptInfo(OptInfo):
     _attrs_ = ('known_class', 'last_guard_pos', 'lenbound')
 
     known_class = None
@@ -320,15 +309,13 @@
     def get_known_class(self):
         return self.known_class
 
-class IntOptValue(OptValue):
+class IntOptInfo(OptInfo):
     _attrs_ = ('intbound',)
 
     intbound = ImmutableIntUnbounded()
 
-    def __init__(self, box, level=None, known_class=None, intbound=None):
-        OptValue.__init__(self, box, level, None, None)
-        if isinstance(box, Const):
-            return
+    def __init__(self, level=LEVEL_UNKNOWN, known_class=None, intbound=None):
+        OptInfo.__init__(self, level, None, None)
         if intbound:
             self.intbound = intbound
         else:
@@ -395,32 +382,11 @@
     def getlenbound(self):
         return None
 
-class ConstantFloatValue(OptValue):
-    def __init__(self, box):
-        self.make_constant(box)
-
-    def __repr__(self):
-        return 'Constant(%r)' % (self.box,)
-
-class ConstantIntValue(IntOptValue):
-    def __init__(self, box):
-        self.make_constant(box)
-
-    def __repr__(self):
-        return 'Constant(%r)' % (self.box,)
-
-class ConstantPtrValue(PtrOptValue):
-    def __init__(self, box):
-        self.make_constant(box)
-
-    def __repr__(self):
-        return 'Constant(%r)' % (self.box,)
 
 CONST_0      = ConstInt(0)
 CONST_1      = ConstInt(1)
-CVAL_ZERO    = ConstantIntValue(CONST_0)
-CVAL_ZERO_FLOAT = ConstantFloatValue(Const._new(0.0))
-llhelper.CVAL_NULLREF = ConstantPtrValue(llhelper.CONST_NULL)
+CONST_ZERO_FLOAT = Const._new(0.0)
+llhelper.CONST_NULLREF = llhelper.CONST_NULL
 REMOVED = AbstractResOp()
 
 
@@ -438,8 +404,11 @@
         self.next_optimization.propagate_forward(op)
 
     # FIXME: Move some of these here?
-    def getvalue(self, box):
-        return self.optimizer.getvalue(box)
+    def getinfo(self, op, create=True):
+        return self.optimizer.getinfo(op, create=create)
+
+    def get_box_replacement(self, op):
+        return self.optimizer.get_box_replacement(op)
 
     def getlastop(self):
         return self.optimizer._last_emitted_op
@@ -603,8 +572,25 @@
         else:
             return box
 
-    @specialize.argtype(0)
-    def getvalue(self, box):
+    def getinfo(self, op, create=False):
+        while op.forwarded is not None:
+            op = op.forwarded
+        if isinstance(op, OptInfo) or isinstance(op, Const):
+            return op
+        if not create:
+            return None
+        if op.type == 'r':
+            optinfo = PtrOptInfo()
+        elif op.type == 'i':
+            optinfo = IntOptInfo()
+        else:
+            optinfo = OptInfo()
+        op.forwarded = optinfo
+        return optinfo
+        xxx
+        yyy
+
+        XXX
         box = self.getinterned(box)
         try:
             value = self.values[box]
@@ -619,12 +605,14 @@
         self.ensure_imported(value)
         return value
 
-    def get_box_replacement(self, box):
-        try:
-            v = self.values[box]
-        except KeyError:
-            return box
-        return v.get_key_box()
+    def get_box_replacement(self, op):
+        orig_op = op
+        while (op.forwarded is not None and
+               not isinstance(op.forwarded, OptInfo)):
+            op = op.forwarded
+        if op is not orig_op:
+            orig_op.forwarded = op
+        return op
 
     def ensure_imported(self, value):
         pass
@@ -667,11 +655,8 @@
     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)
-            if val.box is not None:
-                assert val.box is op
-                val.box = newop
-            self.values[newop] = val
+            assert op.forwarded is None
+            op.forwarded = newop
         return newop
 
     def make_constant(self, box, constbox):
@@ -775,6 +760,7 @@
 
     def get_op_replacement(self, op):
         # XXX this is wrong
+        xxx
         changed = False
         for i, arg in enumerate(op.getarglist()):
             try:
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
@@ -39,12 +39,13 @@
                 return
 
             # did we do the exact same operation already?
-            args = self.optimizer.make_args_key(op.getopnum(),
-                                                op.getarglist(), op.getdescr())
-            oldval = self.pure_operations.get(args, None)
-            if oldval is not None:
-                self.optimizer.make_equal_to(op, oldval)
-                return
+            if 0:
+                args = self.optimizer.make_args_key(op.getopnum(),
+                                                    op.getarglist(), op.getdescr())
+                oldval = self.pure_operations.get(args, None)
+                if oldval is not None:
+                    self.optimizer.make_equal_to(op, oldval)
+                    return
 
         # otherwise, the operation remains
         self.emit_operation(op)
@@ -52,8 +53,8 @@
             self.optimizer.bool_boxes[self.getvalue(op)] = None
         if nextop:
             self.emit_operation(nextop)
-        if args is not None:
-            self.pure_operations[args] = self.getvalue(op)
+        #if args is not None:
+        #    self.pure_operations[args] = self.getvalue(op)
 
     def optimize_CALL_PURE_I(self, op):
         # Step 1: check if all arguments are constant
@@ -102,6 +103,7 @@
         self.optimizer.optpure = self
 
     def pure(self, opnum, args, result):
+        return # XXX
         key = self.optimizer.make_args_key(opnum, args, None)
         if key not in self.pure_operations:
             self.pure_operations[key] = self.getvalue(result)
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
@@ -6,7 +6,7 @@
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound
 from rpython.jit.metainterp.optimizeopt.optimizer import (Optimization, REMOVED,
-    CONST_0, CONST_1, PtrOptValue)
+    CONST_0, CONST_1, PtrOptInfo)
 from rpython.jit.metainterp.optimizeopt.util import _findall, make_dispatcher_method
 from rpython.jit.metainterp.resoperation import rop, ResOperation, opclasses,\
      OpHelpers
@@ -108,14 +108,16 @@
             self.emit_operation(op)
 
     def optimize_INT_SUB(self, op):
-        v1 = self.getvalue(op.getarg(0))
-        v2 = self.getvalue(op.getarg(1))
-        if v2.is_constant() and v2.box.getint() == 0:
+        arg1 = self.get_box_replacement(op.getarg(0))
+        arg2 = self.get_box_replacement(op.getarg(1))
+        if arg2.is_constant() and arg2.getint() == 0:
+            xxx
             self.make_equal_to(op, v1)
-        elif v1.is_constant() and v1.box.getint() == 0:
+        elif arg1.is_constant() and arg1.getint() == 0:
+            xxx
             op = self.replace_op_with(op, rop.INT_NEG, args=[v2.box])
             self.emit_operation(op)
-        elif v1 is v2:
+        elif arg1 is arg2:
             self.make_constant_int(op, 0)
         else:
             self.emit_operation(op)
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
@@ -4,7 +4,7 @@
 from rpython.jit.metainterp.history import Const, ConstInt, BoxInt
 from rpython.jit.metainterp.history import CONST_NULL, BoxPtr
 from rpython.jit.metainterp.optimizeopt import optimizer
-from rpython.jit.metainterp.optimizeopt.optimizer import OptValue, REMOVED
+from rpython.jit.metainterp.optimizeopt.optimizer import OptInfo, REMOVED
 from rpython.jit.metainterp.optimizeopt.util import (make_dispatcher_method,
                                                      descrlist_dict, sort_descrs)
 
@@ -13,7 +13,7 @@
 from rpython.rlib.objectmodel import we_are_translated, specialize
 from rpython.jit.metainterp.optimizeopt.intutils import IntUnbounded
 
-class AbstractVirtualValue(optimizer.PtrOptValue):
+class AbstractVirtualValue(optimizer.PtrOptInfo):
     _attrs_ = ('keybox', 'source_op', '_cached_vinfo')
     box = None
     _tag = optimizer.LEVEL_NONNULL
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
@@ -4,7 +4,7 @@
 from rpython.jit.metainterp.optimizeopt import virtualize
 from rpython.jit.metainterp.optimizeopt.intutils import IntUnbounded
 from rpython.jit.metainterp.optimizeopt.optimizer import (LEVEL_CONSTANT,
-    LEVEL_KNOWNCLASS, LEVEL_NONNULL, LEVEL_UNKNOWN, OptValue)
+    LEVEL_KNOWNCLASS, LEVEL_NONNULL, LEVEL_UNKNOWN, OptInfo)
 from rpython.jit.metainterp.resoperation import rop, ResOperation,\
      AbstractInputArg
 from rpython.jit.metainterp.compile import Memo
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
@@ -45,46 +45,46 @@
 # ____________________________________________________________
 
 
-class __extend__(optimizer.OptValue):
-    """New methods added to the base class OptValue for this file."""
+# class __extend__(optimizer.OptValue):
+#     """New methods added to the base class OptValue for this file."""
 
-    def getstrlen(self, string_optimizer, mode, lengthop):
-        if mode is mode_string:
-            s = self.get_constant_string_spec(mode_string)
-            if s is not None:
-                return ConstInt(len(s))
-        else:
-            s = self.get_constant_string_spec(mode_unicode)
-            if s is not None:
-                return ConstInt(len(s))
-        if string_optimizer is None:
-            return None
-        self.ensure_nonnull()
-        box = self.force_box(string_optimizer)
-        if lengthop is not None:
-            lengthop = string_optimizer.optimizer.replace_op_with(lengthop,
-                mode.STRLEN, [box])
-        else:
-            lengthop = ResOperation(mode.STRLEN, [box])
-        string_optimizer.emit_operation(lengthop)
-        return lengthop
+#     def getstrlen(self, string_optimizer, mode, lengthop):
+#         if mode is mode_string:
+#             s = self.get_constant_string_spec(mode_string)
+#             if s is not None:
+#                 return ConstInt(len(s))
+#         else:
+#             s = self.get_constant_string_spec(mode_unicode)
+#             if s is not None:
+#                 return ConstInt(len(s))
+#         if string_optimizer is None:
+#             return None
+#         self.ensure_nonnull()
+#         box = self.force_box(string_optimizer)
+#         if lengthop is not None:
+#             lengthop = string_optimizer.optimizer.replace_op_with(lengthop,
+#                 mode.STRLEN, [box])
+#         else:
+#             lengthop = ResOperation(mode.STRLEN, [box])
+#         string_optimizer.emit_operation(lengthop)
+#         return lengthop
 
-    @specialize.arg(1)
-    def get_constant_string_spec(self, mode):
-        if self.is_constant():
-            s = self.box.getref(lltype.Ptr(mode.LLTYPE))
-            return mode.hlstr(s)
-        else:
-            return None
+#     @specialize.arg(1)
+#     def get_constant_string_spec(self, mode):
+#         if self.is_constant():
+#             s = self.box.getref(lltype.Ptr(mode.LLTYPE))
+#             return mode.hlstr(s)
+#         else:
+#             return None
 
-    def string_copy_parts(self, string_optimizer, targetbox, offsetbox, mode):
-        # Copies the pointer-to-string 'self' into the target string
-        # given by 'targetbox', at the specified offset.  Returns the offset
-        # at the end of the copy.
-        lengthbox = self.getstrlen(string_optimizer, mode, None)
-        srcbox = self.force_box(string_optimizer)
-        return copy_str_content(string_optimizer, srcbox, targetbox,
-                                CONST_0, offsetbox, lengthbox, mode)
+#     def string_copy_parts(self, string_optimizer, targetbox, offsetbox, mode):
+#         # Copies the pointer-to-string 'self' into the target string
+#         # given by 'targetbox', at the specified offset.  Returns the offset
+#         # at the end of the copy.
+#         lengthbox = self.getstrlen(string_optimizer, mode, None)
+#         srcbox = self.force_box(string_optimizer)
+#         return copy_str_content(string_optimizer, srcbox, targetbox,
+#                                 CONST_0, offsetbox, lengthbox, mode)
 
 
 class VAbstractStringValue(virtualize.AbstractVirtualValue):
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
@@ -15,6 +15,9 @@
     def repr_short(self, memo):
         return self.repr(memo)
 
+    def is_constant(self):
+        return False
+
 DONT_CHANGE = AbstractValue()
 
 def ResOperation(opnum, args, descr=None):
@@ -42,8 +45,9 @@
     type = 'v'
     boolreflex = -1
     boolinverse = -1
+    forwarded = None # either another resop or OptInfo
 
-    _attrs_ = ()
+    _attrs_ = ('forwarded',)
 
     def getopnum(self):
         return self.opnum
@@ -394,6 +398,7 @@
         return InputArgRef()
 
 class AbstractInputArg(AbstractValue):
+    forwarded = None
     
     def repr(self, memo):
         try:
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
@@ -213,8 +213,8 @@
         numb = lltype.malloc(NUMBERING, length)
         for i in range(length):
             box = boxes[i]
-            value = optimizer.getvalue(box)
-            box = value.get_key_box()
+            box = optimizer.get_box_replacement(box)
+            info = optimizer.getinfo(box, create=False)
 
             if isinstance(box, Const):
                 tagged = self.getconst(box)


More information about the pypy-commit mailing list