[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