Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77853:20ebcf1752f1
Date: 2015-06-04 13:33 +0200
http://bitbucket.org/pypy/pypy/changeset/20ebcf1752f1/

Log:    kill dead code

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
@@ -69,27 +69,10 @@
         quicksort(array, pivotnewindex + 1, right)
 
 def sort_descrs(lst):
+    # unused, should I leave it or kill it?
     quicksort(lst, 0, len(lst)-1)
 
 
-def descrlist_hash(l):
-    res = 0x345678
-    for descr in l:
-        y = compute_identity_hash(descr)
-        res = intmask((1000003 * res) ^ y)
-    return res
-
-def descrlist_eq(l1, l2):
-    if len(l1) != len(l2):
-        return False
-    for i in range(len(l1)):
-        if l1[i] is not l2[i]:
-            return False
-    return True
-
-def descrlist_dict():
-    return r_dict(descrlist_eq, descrlist_hash)
-
 # ____________________________________________________________
 
 def args_eq(args1, args2):
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
@@ -1,518 +1,13 @@
 from rpython.jit.codewriter.effectinfo import EffectInfo
-from rpython.jit.metainterp.executor import execute
-from rpython.jit.codewriter.heaptracker import vtable2descr, descr2vtable
-from rpython.jit.metainterp.history import Const, ConstInt, BoxInt
-from rpython.jit.metainterp.history import CONST_NULL, BoxPtr
+from rpython.jit.codewriter.heaptracker import descr2vtable
+from rpython.jit.metainterp.history import ConstInt
+from rpython.jit.metainterp.history import CONST_NULL
 from rpython.jit.metainterp.optimizeopt import info, optimizer
 from rpython.jit.metainterp.optimizeopt.optimizer import REMOVED
-from rpython.jit.metainterp.optimizeopt.util import (make_dispatcher_method,
-                                                     descrlist_dict, 
sort_descrs)
+from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
 
-from rpython.jit.metainterp.optimizeopt.rawbuffer import RawBuffer, 
InvalidRawOperation
+from rpython.jit.metainterp.optimizeopt.rawbuffer import InvalidRawOperation
 from rpython.jit.metainterp.resoperation import rop, ResOperation
-from rpython.rlib.objectmodel import we_are_translated, specialize
-from rpython.jit.metainterp.optimizeopt.intutils import IntUnbounded
-
-class AbstractVirtualInfo(info.PtrInfo):
-    _attrs_ = ('_cached_vinfo',)
-    is_about_raw = False
-    _cached_vinfo = None
-
-    def is_forced_virtual(self):
-        xxx
-        return self.box is not None
-    
-    #def force_box(self, optforce):
-    #    xxxx
-    #    if self.box is None:
-    #        optforce.forget_numberings(self.source_op)
-    #        self._really_force(optforce)
-    #    return self.box
-
-    def force_at_end_of_preamble(self, already_forced, optforce):
-        xxxx
-        value = already_forced.get(self, None)
-        if value:
-            return value
-        return OptValue(self.force_box(optforce))
-
-    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.source_op):
-            self._visitor_walk_recursive(visitor)
-
-    def _visitor_walk_recursive(self, visitor):
-        raise NotImplementedError("abstract base")
-
-    @specialize.argtype(1)
-    def _visitor_dispatch_virtual_type(self, visitor):
-        raise NotImplementedError("abstract base")
-
-    def _really_force(self, optforce):
-        raise NotImplementedError("abstract base")
-
-    def import_from(self, other, optimizer):
-        raise NotImplementedError("should not be called at this level")
-
-def get_fielddescrlist_cache(cpu):
-    if not hasattr(cpu, '_optimizeopt_fielddescrlist_cache'):
-        result = descrlist_dict()
-        cpu._optimizeopt_fielddescrlist_cache = result
-        return result
-    return cpu._optimizeopt_fielddescrlist_cache
-get_fielddescrlist_cache._annspecialcase_ = "specialize:memo"
-
-class AbstractVirtualStructInfo(AbstractVirtualInfo):
-    _attrs_ = ('_fields',)
-
-    def __init__(self):
-        AbstractVirtualInfo.__init__(self)
-        #self._fields = {}
-
-    def getfield(self, ofs, default):
-        return self._fields.get(ofs, default)
-
-    def setfield(self, ofs, fieldvalue):
-        assert isinstance(fieldvalue, optimizer.OptValue)
-        self._fields[ofs] = fieldvalue
-
-    def _get_descr(self):
-        raise NotImplementedError
-
-    def _is_immutable_and_filled_with_constants(self, memo=None):
-        # check if it is possible to force the given structure into a
-        # compile-time constant: this is allowed only if it is declared
-        # immutable, if all fields are already filled, and if each field
-        # is either a compile-time constant or (recursively) a structure
-        # which also answers True to the same question.
-        #
-        # check that all fields are filled.  The following equality check
-        # also fails if count == -1, meaning "not an immutable at all".
-        count = self._get_descr().count_fields_if_immutable()
-        if count != len(self._fields):
-            return False
-        #
-        # initialize 'memo'
-        if memo is None:
-            memo = {}
-        elif self in memo:
-            return True   # recursive case: assume yes
-        memo[self] = None
-        #
-        for value in self._fields.itervalues():
-            if value.is_constant():
-                pass            # it is a constant value: ok
-            elif (isinstance(value, AbstractVirtualStructValue)
-                  and value.is_virtual()):
-                # recursive check
-                if not value._is_immutable_and_filled_with_constants(memo):
-                    return False
-            else:
-                return False    # not a constant at all
-        return True
-
-    def force_at_end_of_preamble(self, already_forced, optforce):
-        if self in already_forced:
-            return self
-        already_forced[self] = self
-        if self._fields:
-            for ofs in self._fields.keys():
-                self._fields[ofs] = 
self._fields[ofs].force_at_end_of_preamble(already_forced, optforce)
-        return self
-
-    def _really_force(self, optforce):
-        op = self.source_op
-        assert op is not None
-        # ^^^ This case should not occur any more (see test_bug_3).
-        #
-        if not we_are_translated():
-            op.name = 'FORCE ' + self.source_op.name
-
-        if self._is_immutable_and_filled_with_constants():
-            box = optforce.optimizer.constant_fold(op)
-            self.make_constant(box)
-            for ofs, value in self._fields.iteritems():
-                subbox = value.force_box(optforce)
-                assert isinstance(subbox, Const)
-                execute(optforce.optimizer.cpu, None, rop.SETFIELD_GC,
-                        ofs, box, subbox)
-            # keep self._fields, because it's all immutable anyway
-        else:
-            optforce.emit_operation(op)
-            op = optforce.getlastop()
-            self.box = box = op
-            #
-            iteritems = self._fields.iteritems()
-            if not we_are_translated(): #random order is fine, except for tests
-                iteritems = list(iteritems)
-                iteritems.sort(key=lambda (x, y): x.sort_key())
-            for ofs, value in iteritems:
-                subbox = value.force_box(optforce)
-                op = ResOperation(rop.SETFIELD_GC, [box, subbox], descr=ofs)
-                optforce.emit_operation(op)
-
-    def _get_field_descr_list(self):
-        _cached_sorted_fields = self._cached_sorted_fields
-        if self._fields is None:
-            nfields = 0
-        else:
-            nfields = len(self._fields)
-        if (_cached_sorted_fields is not None and
-            nfields == len(_cached_sorted_fields)):
-            lst = self._cached_sorted_fields
-        else:
-            if self._fields is None:
-                lst = []
-            else:
-                lst = self._fields.keys()
-            sort_descrs(lst)
-            cache = get_fielddescrlist_cache(self.cpu)
-            result = cache.get(lst, None)
-            if result is None:
-                cache[lst] = lst
-            else:
-                lst = result
-            # store on self, to not have to repeatedly get it from the global
-            # cache, which involves sorting
-            self._cached_sorted_fields = lst
-        return lst
-
-    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.source_op, fieldboxes)
-        for ofs in lst:
-            fieldvalue = self._fields[ofs]
-            fieldvalue.visitor_walk_recursive(visitor)
-
-class VirtualInfo(AbstractVirtualStructInfo):
-
-    def __init__(self, known_class, descr):
-        AbstractVirtualStructInfo.__init__(self)
-        assert isinstance(known_class, Const)
-        self.known_class = known_class
-        self.descr = descr
-
-    @specialize.argtype(1)
-    def _visitor_dispatch_virtual_type(self, visitor):
-        fielddescrs = self._get_field_descr_list()
-        return visitor.visit_virtual(self.known_class, fielddescrs)
-
-    def _get_descr(self):
-        return vtable2descr(self.cpu, self.known_class.getint())
-
-    def __repr__(self):
-        cls_name = self.known_class.value.adr.ptr._obj._TYPE._name
-        if self._fields is None:
-            return '<VirtualValue FORCED cls=%s>' % (cls_name,)
-        field_names = [field.name for field in self._fields]
-        return "<VirtualValue cls=%s fields=%s>" % (cls_name, field_names)
-
-class VStructInfo(AbstractVirtualStructInfo):
-
-    def __init__(self, cpu, structdescr, source_op):
-        xxx
-        AbstractVirtualStructValue.__init__(self, cpu, source_op)
-        self.structdescr = structdescr
-
-    @specialize.argtype(1)
-    def _visitor_dispatch_virtual_type(self, visitor):
-        fielddescrs = self._get_field_descr_list()
-        return visitor.visit_vstruct(self.structdescr, fielddescrs)
-
-    def _get_descr(self):
-        return self.structdescr
-
-class AbstractVArrayInfo(AbstractVirtualInfo):
-    """
-    Base class for VArrayValue (for normal GC arrays) and VRawBufferValue (for
-    malloc()ed memory)
-    """
-
-    def getlength(self):
-        return len(self._items)
-
-    def get_item_value(self, i):
-        raise NotImplementedError
-
-    def set_item_value(self, i, newval):
-        raise NotImplementedError
-
-    def _visitor_walk_recursive(self, visitor):
-        itemboxes = []
-        for i in range(self.getlength()):
-            itemvalue = self.get_item_value(i)
-            if itemvalue is not None:
-                box = itemvalue.get_key_box()
-            else:
-                box = None
-            itemboxes.append(box)
-        visitor.register_virtual_fields(self.source_op, itemboxes)
-        for i in range(self.getlength()):
-            itemvalue = self.get_item_value(i)
-            if itemvalue is not None:
-                itemvalue.visitor_walk_recursive(visitor)
-
-
-class VArrayInfo(AbstractVArrayInfo):
-
-    def __init__(self, arraydescr, constvalue, size, source_op,
-                 clear=False):
-        AbstractVirtualValue.__init__(self, source_op)
-        self.arraydescr = arraydescr
-        self.constvalue = constvalue
-        if clear:
-            self._items = [constvalue] * size
-        else:
-            self._items = [None] * size
-        self.clear = clear
-
-    def getlength(self):
-        return len(self._items)
-
-    def get_missing_null_value(self):
-        return self.constvalue
-
-    def get_item_value(self, i):
-        """Return the i'th item, unless it is 'constvalue' on a 'clear'
-        array.  In that case (or if the i'th item is already None),
-        return None.  The idea is that this method returns the value
-        that must be set into an array that was allocated "correctly",
-        i.e. if 'clear' is True, that means with zero=True."""
-        subvalue = self._items[i]
-        if self.clear and (subvalue is self.constvalue or
-                           subvalue.is_null()):
-            subvalue = None
-        return subvalue
-
-    def set_item_value(self, i, newval):
-        self._items[i] = newval
-
-    def getitem(self, index):
-        res = self._items[index]
-        return res
-
-    def setitem(self, index, itemvalue):
-        assert isinstance(itemvalue, optimizer.OptValue)
-        self._items[index] = itemvalue        
-
-    def force_at_end_of_preamble(self, already_forced, optforce):
-        # note that this method is on VArrayValue instead of
-        # AbstractVArrayValue because we do not want to support virtualstate
-        # for rawbuffers for now
-        if self in already_forced:
-            return self
-        already_forced[self] = self
-        for index in range(self.getlength()):
-            itemval = self._items[index]
-            # XXX should be skip alltogether, but I don't wanna know or
-            #     fight unrolling just yet
-            if itemval is None:
-                itemval = self.constvalue
-            itemval = itemval.force_at_end_of_preamble(already_forced, 
optforce)
-            self.set_item_value(index, itemval)
-        return self
-
-    def _really_force(self, optforce):
-        assert self.source_op is not None
-        if not we_are_translated():
-            self.source_op.name = 'FORCE ' + self.source_op.name
-        # XXX two possible optimizations:
-        # * if source_op is NEW_ARRAY_CLEAR, emit NEW_ARRAY if it's
-        #   immediately followed by SETARRAYITEM_GC into all items (hard?)
-        # * if source_op is NEW_ARRAY, emit NEW_ARRAY_CLEAR if it's
-        #   followed by setting most items to zero anyway
-        optforce.emit_operation(self.source_op)
-        op = optforce.getlastop() # potentially replaced
-        self.box = box = op
-        for index in range(len(self._items)):
-            subvalue = self._items[index]
-            if subvalue is None:
-                continue
-            if self.clear:
-                if subvalue is self.constvalue or subvalue.is_null():
-                    continue
-            subbox = subvalue.force_box(optforce)
-            op = ResOperation(rop.SETARRAYITEM_GC,
-                              [box, ConstInt(index), subbox],
-                               descr=self.arraydescr)
-            optforce.emit_operation(op)
-
-    @specialize.argtype(1)
-    def _visitor_dispatch_virtual_type(self, visitor):
-        return visitor.visit_varray(self.arraydescr, self.clear)
-
-
-class VArrayStructInfo(AbstractVirtualInfo):
-    def __init__(self, arraydescr, size, source_op):
-        AbstractVirtualValue.__init__(self, source_op)
-        self.arraydescr = arraydescr
-        self._items = [{} for _ in xrange(size)]
-
-    def getlength(self):
-        return len(self._items)
-
-    def getinteriorfield(self, index, ofs, default):
-        return self._items[index].get(ofs, default)
-
-    def setinteriorfield(self, index, ofs, itemvalue):
-        assert isinstance(itemvalue, optimizer.OptValue)
-        self._items[index][ofs] = itemvalue
-
-    def _really_force(self, optforce):
-        assert self.source_op is not None
-        if not we_are_translated():
-            self.source_op.name = 'FORCE ' + self.source_op.name
-        optforce.emit_operation(self.source_op)
-        op = optforce.getlastop()
-        self.box = box = op
-        for index in range(len(self._items)):
-            iteritems = self._items[index].iteritems()
-            # random order is fine, except for tests
-            if not we_are_translated():
-                iteritems = list(iteritems)
-                iteritems.sort(key=lambda (x, y): x.sort_key())
-            for descr, value in iteritems:
-                subbox = value.force_box(optforce)
-                op = ResOperation(rop.SETINTERIORFIELD_GC,
-                    [box, ConstInt(index), subbox], descr=descr
-                )
-                optforce.emit_operation(op)
-
-    def _get_list_of_descrs(self):
-        descrs = []
-        for item in self._items:
-            item_descrs = item.keys()
-            sort_descrs(item_descrs)
-            descrs.append(item_descrs)
-        return descrs
-
-    def _visitor_walk_recursive(self, visitor):
-        itemdescrs = self._get_list_of_descrs()
-        itemboxes = []
-        for i in range(len(self._items)):
-            for descr in itemdescrs[i]:
-                itemboxes.append(self._items[i][descr].get_key_box())
-        visitor.register_virtual_fields(self.keybox, itemboxes)
-        for i in range(len(self._items)):
-            for descr in itemdescrs[i]:
-                self._items[i][descr].visitor_walk_recursive(visitor)
-
-    def force_at_end_of_preamble(self, already_forced, optforce):
-        if self in already_forced:
-            return self
-        already_forced[self] = self
-        for index in range(len(self._items)):
-            for descr in self._items[index].keys():
-                self._items[index][descr] = 
self._items[index][descr].force_at_end_of_preamble(already_forced, optforce)
-        return self
-
-    @specialize.argtype(1)
-    def _visitor_dispatch_virtual_type(self, visitor):
-        return visitor.visit_varraystruct(self.arraydescr, 
self._get_list_of_descrs())
-
-
-class VRawBufferInfo(AbstractVArrayInfo):
-    is_about_raw = True
-
-    def __init__(self, cpu, logops, size, source_op):
-        AbstractVirtualValue.__init__(self, source_op)
-        # note that size is unused, because we assume that the buffer is big
-        # enough to write/read everything we need. If it's not, it's undefined
-        # behavior anyway, although in theory we could probably detect such
-        # cases here
-        self.size = size
-        self.buffer = RawBuffer(cpu, logops)
-
-    def getintbound(self):
-        return IntUnbounded()
-
-    def getlength(self):
-        return len(self.buffer.values)
-
-    def get_item_value(self, i):
-        return self.buffer.values[i]
-
-    def set_item_value(self, i, newval):
-        self.buffer.values[i] = newval
-
-    def getitem_raw(self, offset, length, descr):
-        if not self.is_virtual():
-            raise InvalidRawOperation
-            # see 'test_virtual_raw_buffer_forced_but_slice_not_forced'
-            # for the test above: it's not enough to check is_virtual()
-            # on the original object, because it might be a VRawSliceValue
-            # instead.  If it is a virtual one, then we'll reach here anway.
-        return self.buffer.read_value(offset, length, descr)
-
-    def setitem_raw(self, offset, length, descr, value):
-        if not self.is_virtual():
-            raise InvalidRawOperation
-        self.buffer.write_value(offset, length, descr, value)
-
-    def _really_force(self, optforce):
-        op = self.source_op
-        assert op is not None
-        if not we_are_translated():
-            op.name = 'FORCE ' + self.source_op.name
-        optforce.emit_operation(self.source_op)
-        self.box = optforce.getlastop()
-        for i in range(len(self.buffer.offsets)):
-            # write the value
-            offset = self.buffer.offsets[i]
-            descr = self.buffer.descrs[i]
-            itemvalue = self.buffer.values[i]
-            itembox = itemvalue.force_box(optforce)
-            op = ResOperation(rop.RAW_STORE,
-                              [self.box, ConstInt(offset), itembox],
-                              descr=descr)
-            optforce.emit_operation(op)
-
-    @specialize.argtype(1)
-    def _visitor_dispatch_virtual_type(self, visitor):
-        # I *think* we need to make a copy of offsets and descrs because we
-        # want a snapshot of the virtual state right now: if we grow more
-        # elements later, we don't want them to go in this virtual state
-        return visitor.visit_vrawbuffer(self.size,
-                                        self.buffer.offsets[:],
-                                        self.buffer.descrs[:])
-
-
-class VRawSliceInfo(AbstractVirtualInfo):
-    is_about_raw = True
-
-    def __init__(self, rawbuffer_value, offset, source_op):
-        AbstractVirtualValue.__init__(self, source_op)
-        self.rawbuffer_value = rawbuffer_value
-        self.offset = offset
-
-    def getintbound(self):
-        return IntUnbounded()
-
-    def _really_force(self, optforce):
-        op = self.source_op
-        assert op is not None
-        if not we_are_translated():
-            op.name = 'FORCE ' + self.source_op.name
-        self.rawbuffer_value.force_box(optforce)
-        optforce.emit_operation(op)
-        self.box = optforce.getlastop()
-
-    def setitem_raw(self, offset, length, descr, value):
-        self.rawbuffer_value.setitem_raw(self.offset+offset, length, descr, 
value)
-
-    def getitem_raw(self, offset, length, descr):
-        return self.rawbuffer_value.getitem_raw(self.offset+offset, length, 
descr)
-
-    def _visitor_walk_recursive(self, visitor):
-        box = self.rawbuffer_value.get_key_box()
-        visitor.register_virtual_fields(self.keybox, [box])
-        self.rawbuffer_value.visitor_walk_recursive(visitor)
-
-    @specialize.argtype(1)
-    def _visitor_dispatch_virtual_type(self, visitor):
-        return visitor.visit_vrawslice(self.offset)
 
 
 class OptVirtualize(optimizer.Optimization):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to