[pypy-svn] r74575 - in pypy/branch/blackhole-improvement/pypy/jit: codewriter metainterp

arigo at codespeak.net arigo at codespeak.net
Wed May 19 16:08:03 CEST 2010


Author: arigo
Date: Wed May 19 16:08:01 2010
New Revision: 74575

Modified:
   pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
   pypy/branch/blackhole-improvement/pypy/jit/metainterp/warmspot.py
Log:
Move decode_hp_hint_args() into support.py and use it systematically.
It now returns the args in the standard order INT-REF-FLOATs.


Modified: pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/codewriter/support.py	Wed May 19 16:08:01 2010
@@ -69,14 +69,33 @@
         portalblock = link.target
     portalop = portalblock.operations[0]
     # split again, this time enforcing the order of the live vars
-    # specified by the user in the jit_merge_point() call
+    # specified by decode_hp_hint_args().
     assert portalop.opname == 'jit_marker'
     assert portalop.args[0].value == 'jit_merge_point'
-    livevars = [v for v in portalop.args[2:]
-                  if v.concretetype is not lltype.Void]
-    link = split_block(None, portalblock, 0, livevars)
+    greens_v, reds_v = decode_hp_hint_args(portalop)
+    link = split_block(None, portalblock, 0, greens_v + reds_v)
     return link.target
 
+def decode_hp_hint_args(op):
+    # Returns (list-of-green-vars, list-of-red-vars) without Voids.
+    # Both lists are sorted: first INT, then REF, then FLOAT.
+    assert op.opname == 'jit_marker'
+    jitdriver = op.args[1].value
+    numgreens = len(jitdriver.greens)
+    numreds = len(jitdriver.reds)
+    greens_v = op.args[2:2+numgreens]
+    reds_v = op.args[2+numgreens:]
+    assert len(reds_v) == numreds
+    #
+    def _sort(args_v):
+        from pypy.jit.metainterp.history import getkind
+        lst = [v for v in args_v if v.concretetype is not lltype.Void]
+        _kind2count = {'int': 1, 'ref': 2, 'float': 3}
+        lst.sort(key=lambda v: _kind2count[getkind(v.concretetype)])
+        return lst
+    #
+    return (_sort(greens_v), _sort(reds_v))
+
 def maybe_on_top_of_llinterp(rtyper, fnptr):
     # Run a generated graph on top of the llinterp for testing.
     # When translated, this just returns the fnptr.

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/pyjitpl.py	Wed May 19 16:08:01 2010
@@ -1538,12 +1538,13 @@
                                           duplicates)
         live_arg_boxes = greenboxes + redboxes
         if self.staticdata.virtualizable_info is not None:
-            # we use ':-1' to remove the last item, which is the virtualizable
+            # we use pop() to remove the last item, which is the virtualizable
             # itself
             self.remove_consts_and_duplicates(self.virtualizable_boxes,
                                               len(self.virtualizable_boxes)-1,
                                               duplicates)
-            live_arg_boxes += self.virtualizable_boxes[:-1]
+            live_arg_boxes += self.virtualizable_boxes
+            live_arg_boxes.pop()
         assert len(self.virtualref_boxes) == 0, "missing virtual_ref_finish()?"
         # Called whenever we reach the 'can_enter_jit' hint.
         # First, attempt to make a bridge:

Modified: pypy/branch/blackhole-improvement/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/blackhole-improvement/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/blackhole-improvement/pypy/jit/metainterp/warmspot.py	Wed May 19 16:08:01 2010
@@ -409,17 +409,10 @@
     def make_args_specification(self):
         graph, block, index = self.jit_merge_point_pos
         op = block.operations[index]
-        args = op.args[2:]
-        ALLARGS = []
-        self.green_args_spec = []
-        self.red_args_types = []
-        for i, v in enumerate(args):
-            TYPE = v.concretetype
-            ALLARGS.append(TYPE)
-            if i < len(self.jitdriver.greens):
-                self.green_args_spec.append(TYPE)
-            else:
-                self.red_args_types.append(history.getkind(TYPE))
+        greens_v, reds_v = support.decode_hp_hint_args(op)
+        ALLARGS = [v.concretetype for v in (greens_v + reds_v)]
+        self.green_args_spec = [v.concretetype for v in greens_v]
+        self.red_args_types = [history.getkind(v.concretetype) for v in reds_v]
         self.num_green_args = len(self.green_args_spec)
         RESTYPE = graph.getreturnvar().concretetype
         (self.JIT_ENTER_FUNCTYPE,
@@ -441,7 +434,7 @@
                 continue
 
             op = block.operations[index]
-            greens_v, reds_v = decode_hp_hint_args(op)
+            greens_v, reds_v = support.decode_hp_hint_args(op)
             args_v = greens_v + reds_v
 
             vlist = [Constant(jit_enter_fnptr, FUNCPTR)] + args_v
@@ -618,7 +611,7 @@
         op = origblock.operations[origindex]
         assert op.opname == 'jit_marker'
         assert op.args[0].value == 'jit_merge_point'
-        greens_v, reds_v = decode_hp_hint_args(op)
+        greens_v, reds_v = support.decode_hp_hint_args(op)
         vlist = [Constant(self.portal_runner_ptr, self.PTR_PORTAL_FUNCTYPE)]
         vlist += greens_v
         vlist += reds_v
@@ -668,16 +661,3 @@
         all_graphs = self.translator.graphs
         vrefinfo = self.metainterp_sd.virtualref_info
         vrefinfo.replace_force_virtual_with_call(all_graphs)
-
-
-def decode_hp_hint_args(op):
-    # Returns (list-of-green-vars, list-of-red-vars) without Voids.
-    assert op.opname == 'jit_marker'
-    jitdriver = op.args[1].value
-    numgreens = len(jitdriver.greens)
-    numreds = len(jitdriver.reds)
-    greens_v = op.args[2:2+numgreens]
-    reds_v = op.args[2+numgreens:]
-    assert len(reds_v) == numreds
-    return ([v for v in greens_v if v.concretetype is not lltype.Void],
-            [v for v in reds_v if v.concretetype is not lltype.Void])



More information about the Pypy-commit mailing list