Author: fijal
Branch: jit-leaner-frontend
Changeset: r82962:5008701233ab
Date: 2016-03-11 13:57 +0200
http://bitbucket.org/pypy/pypy/changeset/5008701233ab/

Log:    an attempt to compress list of consts

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
@@ -205,7 +205,7 @@
 
 
 class Const(AbstractValue):
-    __slots__ = ()
+    __attrs__ = ()
 
     @staticmethod
     def _new(x):
diff --git a/rpython/jit/metainterp/opencoder.py 
b/rpython/jit/metainterp/opencoder.py
--- a/rpython/jit/metainterp/opencoder.py
+++ b/rpython/jit/metainterp/opencoder.py
@@ -7,14 +7,14 @@
 <virtualref size> <virtualref boxes> [<size> <jitcode> <pc> <boxes...> ...]
 """
 
-from rpython.jit.metainterp.history import ConstInt, Const
+from rpython.jit.metainterp.history import ConstInt, Const, ConstFloat, 
ConstPtr
 from rpython.jit.metainterp.resoperation import AbstractResOp, 
AbstractInputArg,\
     ResOperation, oparity, rop, opwithdescr, GuardResOp
 from rpython.rlib.rarithmetic import intmask
 from rpython.rlib.objectmodel import we_are_translated
-from rpython.rtyper.lltypesystem import rffi, lltype
+from rpython.rtyper.lltypesystem import rffi, lltype, llmemory
 
-TAGINT, TAGCONST, TAGBOX = range(3)
+TAGINT, TAGCONSTPTR, TAGCONSTOTHER, TAGBOX = range(4)
 TAGMASK = 0x3
 TAGSHIFT = 2
 SMALL_INT_STOP  = 2 ** (15 - TAGSHIFT)
@@ -116,8 +116,13 @@
             return self._get(v)
         elif tag == TAGINT:
             return ConstInt(v)
-        elif tag == TAGCONST:
-            return self.trace._consts[v]
+        elif tag == TAGCONSTPTR:
+            return ConstPtr(self.trace._refs[v])
+        elif tag == TAGCONSTOTHER:
+            if v & 1:
+                return ConstFloat(self.trace._floats[v >> 1])
+            else:
+                return ConstInt(self.trace._bigints[v >> 1])
         else:
             assert False
 
@@ -173,7 +178,12 @@
         self._ops = [rffi.cast(rffi.SHORT, -15)] * 30000
         self._pos = 0
         self._descrs = [None]
-        self._consts = [None]
+        self._refs = []
+        self._refs_dict = {}
+        self._bigints = []
+        self._bigints_dict = {}
+        self._floats = []
+        self._floats_dict = {}
         for i, inparg in enumerate(inputargs):
             assert isinstance(inparg, AbstractInputArg)
             inparg.position = -i - 1
@@ -188,6 +198,11 @@
         self._ops[self._pos] = rffi.cast(rffi.SHORT, v)
         self._pos += 1
 
+    def done(self):
+        self._bigints_dict = {}
+        self._refs_dict = {}
+        self._floats_dict = {}
+
     def length(self):
         return self._pos
 
@@ -207,9 +222,34 @@
                 isinstance(box.getint(), int) and # symbolics
                 SMALL_INT_START <= box.getint() < SMALL_INT_STOP):
                 return tag(TAGINT, box.getint())
+            elif isinstance(box, ConstInt):
+                if not isinstance(box.getint(), int):
+                    # symbolics, for tests, don't worry about caching
+                    v = len(self._bigints) << 1
+                    self._bigints.append(box.getint())
+                else:
+                    v = self._bigints_dict.get(box.getint(), -1)
+                    if v == -1:
+                        v = len(self._bigints) << 1
+                        self._bigints_dict[box.getint()] = v
+                        self._bigints.append(box.getint())
+                return tag(TAGCONSTOTHER, v)
+            elif isinstance(box, ConstFloat):
+                v = self._floats_dict.get(box.getfloat(), -1)
+                if v == -1:
+                    v = (len(self._floats) << 1) | 1
+                    self._floats_dict[box.getfloat()] = v
+                    self._floats.append(box.getfloat())
+                return tag(TAGCONSTOTHER, v)
             else:
-                self._consts.append(box)
-                return tag(TAGCONST, len(self._consts) - 1)
+                assert isinstance(box, ConstPtr)
+                addr = llmemory.cast_ptr_to_adr(box.getref_base())
+                v = self._refs_dict.get(addr, -1)
+                if v == -1:
+                    v = len(self._refs)
+                    self._refs_dict[addr] = v
+                    self._refs.append(box.getref_base())
+                return tag(TAGCONSTPTR, v)
         elif isinstance(box, AbstractResOp):
             return tag(TAGBOX, box.get_position())
         elif isinstance(box, AbstractInputArg):
diff --git a/rpython/jit/metainterp/pyjitpl.py 
b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -2566,6 +2566,7 @@
                      try_disabling_unroll=False, exported_state=None):
         num_green_args = self.jitdriver_sd.num_green_args
         greenkey = original_boxes[:num_green_args]
+        self.history.trace.done()
         if not self.partial_trace:
             ptoken = self.get_procedure_token(greenkey)
             if ptoken is not None and ptoken.target_tokens is not None:
@@ -2618,6 +2619,7 @@
         self.history.record(rop.JUMP, live_arg_boxes[num_green_args:], None,
                             descr=target_jitcell_token)
         self.history.ends_with_jump = True
+        self.history.trace.done()
         try:
             target_token = compile.compile_trace(self, self.resumekey,
                 live_arg_boxes[num_green_args:])
_______________________________________________
pypy-commit mailing list
pypy-commit@python.org
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to