[pypy-commit] pypy result-in-resops: improve hashing

fijal noreply at buildbot.pypy.org
Wed Sep 26 14:37:01 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57605:748b64941b3e
Date: 2012-09-26 12:09 +0200
http://bitbucket.org/pypy/pypy/changeset/748b64941b3e/

Log:	improve hashing

diff --git a/TODO b/TODO
--- a/TODO
+++ b/TODO
@@ -1,5 +1,6 @@
 
-* make OptValue somehow leaner using subclassing instead of one-size-fit-most
+* make OptValue somehow leaner using subclassing instead of one-size-fit-most.
+  right now we have 1-1, so should be easy to make OptValue immutable
 
 * rethink interning vs other ideas of caching for getinterned on optimizer
   and cache fields
\ No newline at end of file
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
@@ -23,6 +23,7 @@
      Const, ConstInt, ConstFloat, AbstractValue
 from pypy.jit.metainterp.typesystem import llhelper
 from pypy.rlib.objectmodel import specialize
+from pypy.tool.pairtype import extendabletype
 
 LEVEL_UNKNOWN    = '\x00'
 LEVEL_NONNULL    = '\x01'
@@ -44,8 +45,10 @@
 
 class OptValue(object):
     _attrs_ = ('known_class', 'last_guard', 'level', 'intbound', 'lenbound', 'is_bool_box')
+
+    __metaclass__ = extendabletype
+    
     last_guard = None
-
     level = LEVEL_UNKNOWN
     known_class = None
     intbound = ImmutableIntUnbounded()
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
@@ -40,6 +40,8 @@
                 return
 
             # did we do the exact same operation already?
+            import pdb
+            pdb.set_trace()
             oldop = self.pure_operations.get(op)
             if oldop is not None:
                 self.replace(op, oldop)
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
@@ -138,8 +138,16 @@
                 a.values = self.values[:]
             return a
 
-        def __repr__(self):
-            return 'ArgsSet(%s)' % ([item for item in self.buckets if item is not None],)
+        if has_value:
+            def __repr__(self):
+                return 'ArgsDict(%s)' % (['%s: %s' % (item, self.values[i])
+                                          for i, item in
+                                          enumerate(self.buckets)
+                                          if item is not None],)
+        else:
+            def __repr__(self):
+                return 'ArgsSet(%s)' % ([item for item in self.buckets
+                                         if item is not None],)
     return ArgsSet
 ArgsSet = new_args_set()
 ArgsDict = new_args_set(True)
diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py
--- a/pypy/jit/metainterp/optimizeopt/vstring.py
+++ b/pypy/jit/metainterp/optimizeopt/vstring.py
@@ -6,7 +6,7 @@
 from pypy.jit.metainterp.optimizeopt.optimizer import llhelper, REMOVED
 from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method
 from pypy.jit.metainterp.resoperation import rop, Const, ConstInt, ConstPtr,\
-     BoxInt, BoxPtr, REF, INT
+     BoxInt, BoxPtr, REF, INT, create_resop_1
 from pypy.rlib.objectmodel import specialize, we_are_translated
 from pypy.rlib.unroll import unrolling_iterable
 from pypy.rpython import annlowlevel
@@ -59,10 +59,10 @@
         if string_optimizer is None:
             return None
         self.ensure_nonnull()
-        box = self.force_box(string_optimizer)
-        if lengthbox is None:
-            lengthbox = BoxInt()
-        string_optimizer.emit_operation(ResOperation(mode.STRLEN, [box], lengthbox))
+        self.force_box(string_optimizer)
+        # ???
+        #lengthop = create_resop_1(mode.STRLEN, 0, box)
+        string_optimizer.emit_operation(lengthbox)
         return lengthbox
 
     @specialize.arg(1)
@@ -482,11 +482,11 @@
 
     def _optimize_STRLEN(self, op, mode):
         value = self.getvalue(op.getarg(0))
-        lengthbox = value.getstrlen(self, mode, op.result)
-        if op.result in self.optimizer.values:
-            assert self.getvalue(op.result) is self.getvalue(lengthbox)
-        elif op.result is not lengthbox:
-            self.make_equal_to(op.result, self.getvalue(lengthbox))
+        lengthbox = value.getstrlen(self, mode, op)
+        if op.has_extra("optimize_value"):
+            assert self.getvalue(op) is self.getvalue(lengthbox)
+        elif op is not lengthbox:
+            self.replace(op, lengthbox)
 
     def optimize_COPYSTRCONTENT(self, op):
         self._optimize_COPYSTRCONTENT(op, mode_string)
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
@@ -293,6 +293,9 @@
     def nonconstbox(self):
         return self
 
+    def _get_hash_(self):
+        return compute_identity_hash(self)
+
     def __repr__(self):
         result = str(self)
         if self._extended_display:
@@ -374,9 +377,6 @@
     def getaddr(self):
         return heaptracker.int2adr(self.value)
 
-    def _get_hash_(self):
-        return make_hashable_int(self.value)
-
     def nonnull(self):
         return self.value != 0
 
@@ -406,9 +406,6 @@
     def getfloatstorage(self):
         return self.value
 
-    def _get_hash_(self):
-        return longlong.gethash(self.value)
-
     def nonnull(self):
         return self.value != longlong.ZEROF
 
@@ -445,12 +442,6 @@
     def getaddr(self):
         return llmemory.cast_ptr_to_adr(self.value)
 
-    def _get_hash_(self):
-        if self.value:
-            return lltype.identityhash(self.value)
-        else:
-            return 0
-
     def nonnull(self):
         return bool(self.value)
 
@@ -718,7 +709,7 @@
         if self._hash != 0:
             return self._hash
         hash = (self.getopnum() ^
-                self.get_result_hash() ^
+                intmask(self.get_result_hash() << 4) ^
                 self.get_descr_hash() ^
                 self.get_arg_hash())
         if hash == 0:
@@ -1210,7 +1201,7 @@
         return res
 
     def get_arg_hash(self):
-        return (intmask(self._arg0._get_hash_() << 16) +
+        return (intmask(self._arg0._get_hash_() << 1) ^
                 self._arg1._get_hash_())
 
     def args_eq(self, other):
@@ -1273,8 +1264,8 @@
         return r
 
     def get_arg_hash(self):
-        return (intmask(self._arg0._get_hash_() << 24) +
-                intmask(self._arg1._get_hash_() << 16) +
+        return (intmask(self._arg0._get_hash_() << 2) ^
+                intmask(self._arg1._get_hash_() << 1) ^
                 self._arg2._get_hash_())
 
     def args_eq(self, other):


More information about the pypy-commit mailing list