[pypy-commit] pypy separate-jit-compilation: initial checkin - a branch to try to compile the JIT separately from the
fijal
noreply at buildbot.pypy.org
Wed May 7 22:34:35 CEST 2014
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: separate-jit-compilation
Changeset: r71395:1589099e8e20
Date: 2014-05-06 18:39 +0200
http://bitbucket.org/pypy/pypy/changeset/1589099e8e20/
Log: initial checkin - a branch to try to compile the JIT separately from
the interpreter
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
@@ -2000,8 +2000,9 @@
self.staticdata.log(sys.exc_info()[0].__name__)
raise
- @specialize.arg(1)
- def compile_and_run_once(self, jitdriver_sd, *args):
+ def compile_and_run_once(self, jitdriver_sd,
+ green_args_i, green_args_r, green_args_f,
+ args_i, args_r, args_f):
# NB. we pass explicity 'jitdriver_sd' around here, even though it
# is also available as 'self.jitdriver_sd', because we need to
# specialize this function and a few other ones for the '*args'.
@@ -2012,7 +2013,9 @@
self.staticdata.try_to_free_some_loops()
self.create_empty_history()
try:
- original_boxes = self.initialize_original_boxes(jitdriver_sd, *args)
+ original_boxes = self.initialize_original_boxes(
+ jitdriver_sd, green_args_i, green_args_r, green_args_f,
+ args_i, args_r, args_f)
return self._compile_and_run_once(original_boxes)
finally:
self.staticdata.profiler.end_tracing()
@@ -2370,22 +2373,37 @@
if target_token is not token:
compile.giveup()
- @specialize.arg(1)
- def initialize_original_boxes(self, jitdriver_sd, *args):
+ def initialize_original_boxes(self, jitdriver_sd,
+ greens_i, greens_r, greens_f,
+ args_i, args_r, args_f):
original_boxes = []
self._fill_original_boxes(jitdriver_sd, original_boxes,
- jitdriver_sd.num_green_args, *args)
+ greens_i, greens_r, greens_f, args_i, args_r,
+ args_f)
return original_boxes
- @specialize.arg(1)
- def _fill_original_boxes(self, jitdriver_sd, original_boxes,
- num_green_args, *args):
- if args:
- from rpython.jit.metainterp.warmstate import wrap
- box = wrap(self.cpu, args[0], num_green_args > 0)
+ def _fill_original_boxes(self, jitdriver_sd, original_boxes, greens_i,
+ greens_r, greens_f, args_i, args_r, args_f):
+ from rpython.jit.metainterp.warmstate import wrap
+
+ for ival in greens_i:
+ box = wrap(self.cpu, ival, True)
original_boxes.append(box)
- self._fill_original_boxes(jitdriver_sd, original_boxes,
- num_green_args-1, *args[1:])
+ for rval in greens_r:
+ box = wrap(self.cpu, rval, True)
+ original_boxes.append(box)
+ for fval in greens_f:
+ box = wrap(self.cpu, fval, True)
+ original_boxes.append(box)
+ for ival in args_i:
+ box = wrap(self.cpu, ival, False)
+ original_boxes.append(box)
+ for rval in args_r:
+ box = wrap(self.cpu, rval, False)
+ original_boxes.append(box)
+ for fval in args_f:
+ box = wrap(self.cpu, fval, False)
+ original_boxes.append(box)
def initialize_state_from_start(self, original_boxes):
# ----- make a new frame -----
diff --git a/rpython/jit/metainterp/warmspot.py b/rpython/jit/metainterp/warmspot.py
--- a/rpython/jit/metainterp/warmspot.py
+++ b/rpython/jit/metainterp/warmspot.py
@@ -569,6 +569,8 @@
ALLARGS = [v.concretetype for v in (greens_v + reds_v)]
jd._green_args_spec = [v.concretetype for v in greens_v]
jd.red_args_types = [history.getkind(v.concretetype) for v in reds_v]
+ jd.green_args_types = [history.getkind(v.concretetype)
+ for v in greens_v]
jd.num_green_args = len(jd._green_args_spec)
jd.num_red_args = len(jd.red_args_types)
RESTYPE = graph.getreturnvar().concretetype
diff --git a/rpython/jit/metainterp/warmstate.py b/rpython/jit/metainterp/warmstate.py
--- a/rpython/jit/metainterp/warmstate.py
+++ b/rpython/jit/metainterp/warmstate.py
@@ -269,6 +269,19 @@
vinfo = jitdriver_sd.virtualizable_info
index_of_virtualizable = jitdriver_sd.index_of_virtualizable
num_green_args = jitdriver_sd.num_green_args
+ num_green_ints = 0
+ num_green_refs = 0
+ for kind in jitdriver_sd.green_args_types:
+ if kind == 'int':
+ num_green_ints += 1
+ elif kind == 'ref':
+ num_green_refs += 1
+ num_green_floats = num_green_args - num_green_ints - num_green_refs
+ range_green_ints = unrolling_iterable(enumerate(range(num_green_ints)))
+ range_green_refs = unrolling_iterable(enumerate(
+ range(num_green_ints, num_green_ints + num_green_refs)))
+ range_green_floats = unrolling_iterable(enumerate(
+ range(num_green_ints + num_green_refs, num_green_args)))
JitCell = self.make_jitcell_subclass()
self.make_jitdriver_callbacks()
confirm_enter_jit = self.confirm_enter_jit
@@ -276,12 +289,18 @@
range(num_green_args, num_green_args + jitdriver_sd.num_red_args))
# get a new specialized copy of the method
ARGS = []
+ num_red_ints = 0
+ num_red_refs = 0
+ num_red_floats = 0
for kind in jitdriver_sd.red_args_types:
if kind == 'int':
+ num_red_ints += 1
ARGS.append(lltype.Signed)
elif kind == 'ref':
+ num_red_refs += 1
ARGS.append(llmemory.GCREF)
elif kind == 'float':
+ num_red_floats += 1
ARGS.append(longlong.FLOATSTORAGE)
else:
assert 0, kind
@@ -289,6 +308,15 @@
cpu = self.cpu
jitcounter = self.warmrunnerdesc.jitcounter
+ range_red_ints = unrolling_iterable(enumerate(
+ range(num_green_args, num_green_args + num_red_ints)))
+ range_red_refs = unrolling_iterable(enumerate(
+ range(num_green_args + num_red_ints,
+ num_green_args + num_red_ints + num_red_refs)))
+ range_red_floats = unrolling_iterable(enumerate(
+ range(num_green_args + num_red_ints + num_red_refs,
+ jitdriver_sd.num_red_args)))
+
def execute_assembler(loop_token, *args):
# Call the backend to run the 'looptoken' with the given
# input args.
@@ -325,7 +353,26 @@
jitcounter.install_new_cell(hash, cell)
cell.flags |= JC_TRACING
try:
- metainterp.compile_and_run_once(jitdriver_sd, *args)
+ green_ints = [0] * num_green_ints
+ green_refs = [lltype.nullptr(llmemory.GCREF.TO)] * num_green_refs
+ green_floats = [longlong.getfloatstorage(0.0)] * num_green_floats
+ red_ints = [0] * num_red_ints
+ red_refs = [lltype.nullptr(llmemory.GCREF.TO)] * num_red_refs
+ red_floats = [longlong.getfloatstorage(0.0)] * num_red_floats
+ for i, num in range_green_ints:
+ green_ints[i] = args[num]
+ for i, num in range_green_refs:
+ green_refs[i] = args[num]
+ for i, num in range_green_floats:
+ green_floats[i] = args[num]
+ for i, num in range_red_ints:
+ red_ints[i] = args[num]
+ for i, num in range_red_refs:
+ red_refs[i] = args[num]
+ for i, num in range_red_floats:
+ red_floats[i] = args[num]
+ metainterp.compile_and_run_once(jitdriver_sd, green_ints,
+ green_refs, green_floats, red_ints, red_refs, red_floats)
finally:
cell.flags &= ~JC_TRACING
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -512,9 +512,9 @@
# if reds are automatic, they won't be passed to jit_merge_point, so
# _check_arguments will receive only the green ones (i.e., the ones
# which are listed explicitly). So, it is fine to just ignore reds
- self._somelivevars = set([name for name in
+ self._somelivevars = set([_name for _name in
self.greens + (self.reds or [])
- if '.' not in name])
+ if '.' not in _name])
self._heuristic_order = {} # check if 'reds' and 'greens' are ordered
self._make_extregistryentries()
assert get_jitcell_at is None, "get_jitcell_at no longer used"
More information about the pypy-commit
mailing list