Author: Maciej Fijalkowski <fij...@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" _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit