Author: fijal Branch: jit-leaner-frontend Changeset: r82852:2c79e6dbfade Date: 2016-03-07 18:28 +0200 http://bitbucket.org/pypy/pypy/changeset/2c79e6dbfade/
Log: in-progress diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py --- a/rpython/jit/metainterp/compile.py +++ b/rpython/jit/metainterp/compile.py @@ -82,10 +82,10 @@ """ This represents ops() with a jump at the end that goes to some loop, we need to deal with virtual state and inlining of short preamble """ - def __init__(self, start_label, operations, call_pure_results=None, + def __init__(self, trace, runtime_boxes, call_pure_results=None, enable_opts=None, inline_short_preamble=False): - self.start_label = start_label - self.operations = operations + self.trace = trace + self.runtime_boxes = runtime_boxes self.call_pure_results = call_pure_results self.enable_opts = enable_opts self.inline_short_preamble = inline_short_preamble @@ -94,7 +94,7 @@ from rpython.jit.metainterp.optimizeopt.unroll import UnrollOptimizer opt = UnrollOptimizer(metainterp_sd, jitdriver_sd, optimizations) - return opt.optimize_bridge(self.start_label, self.operations, + return opt.optimize_bridge(self.trace, self.runtime_boxes, self.call_pure_results, self.inline_short_preamble, self.box_names_memo) @@ -200,8 +200,9 @@ # ____________________________________________________________ -def compile_simple_loop(metainterp, greenkey, start, inputargs, ops, jumpargs, +def compile_simple_loop(metainterp, greenkey, start, trace, jumpargs, enable_opts): + xxxx from rpython.jit.metainterp.optimizeopt import optimize_trace jitdriver_sd = metainterp.jitdriver_sd @@ -261,8 +262,8 @@ jitcell_token = make_jitcell_token(jitdriver_sd) history.record(rop.JUMP, jumpargs, None, descr=jitcell_token) if 'unroll' not in enable_opts or not metainterp.cpu.supports_guard_gc_type: - xxx - return compile_simple_loop(metainterp, greenkey, start, inputargs, ops, + return compile_simple_loop(metainterp, greenkey, start, inputargs, + history.trace, jumpargs, enable_opts) call_pure_results = metainterp.call_pure_results preamble_data = LoopCompileData(history.trace, inputargs, @@ -1033,8 +1034,7 @@ call_pure_results = metainterp.call_pure_results if metainterp.history.ends_with_jump: - xxx - data = BridgeCompileData(label, operations[:], + data = BridgeCompileData(trace, inputargs, call_pure_results=call_pure_results, enable_opts=enable_opts, inline_short_preamble=inline_short_preamble) diff --git a/rpython/jit/metainterp/logger.py b/rpython/jit/metainterp/logger.py --- a/rpython/jit/metainterp/logger.py +++ b/rpython/jit/metainterp/logger.py @@ -12,6 +12,15 @@ self.metainterp_sd = metainterp_sd self.guard_number = guard_number + def log_loop_from_trace(self, trace, memo): + if not have_debug_prints(): + return + ops = [] + i = trace.get_iter() + while not i.done(): + ops.append(i.next()) + self.log_loop(i.inputargs, ops, memo=memo) + def log_loop(self, inputargs, operations, number=0, type=None, ops_offset=None, name='', memo=None): if type is None: diff --git a/rpython/jit/metainterp/optimizeopt/__init__.py b/rpython/jit/metainterp/optimizeopt/__init__.py --- a/rpython/jit/metainterp/optimizeopt/__init__.py +++ b/rpython/jit/metainterp/optimizeopt/__init__.py @@ -53,7 +53,7 @@ """ debug_start("jit-optimize") try: - #metainterp_sd.logger_noopt.log_loop(compile_data.trace, memo=memo) + metainterp_sd.logger_noopt.log_loop_from_trace(compile_data.trace, memo=memo) if memo is None: memo = {} compile_data.box_names_memo = memo diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py b/rpython/jit/metainterp/optimizeopt/unroll.py --- a/rpython/jit/metainterp/optimizeopt/unroll.py +++ b/rpython/jit/metainterp/optimizeopt/unroll.py @@ -224,13 +224,12 @@ return token.virtual_state return label_vs - def optimize_bridge(self, start_label, operations, call_pure_results, + def optimize_bridge(self, trace, runtime_boxes, call_pure_results, inline_short_preamble, box_names_memo): - self._check_no_forwarding([start_label.getarglist()]) - info, ops = self.optimizer.propagate_all_forward( - start_label.getarglist()[:], operations[:-1], + self._check_no_forwarding([trace.inputargs]) + info, ops = self.optimizer.propagate_all_forward(trace.get_iter(), call_pure_results) - jump_op = operations[-1] + jump_op = info.jump_op cell_token = jump_op.getdescr() assert isinstance(cell_token, JitCellToken) if not inline_short_preamble or len(cell_token.target_tokens) == 1: @@ -241,9 +240,9 @@ for a in jump_op.getarglist(): self.optimizer.force_box_for_end_of_preamble(a) try: - vs = self.jump_to_existing_trace(jump_op, None) + vs = self.jump_to_existing_trace(jump_op, None, runtime_boxes) except InvalidLoop: - return self.jump_to_preamble(cell_token, jump_op, info) + return self.jump_to_preamble(cell_token, jump_op, info) if vs is None: return info, self.optimizer._newoperations[:] warmrunnerdescr = self.optimizer.metainterp_sd.warmrunnerdesc @@ -254,6 +253,7 @@ else: debug_print("Retrace count reached, jumping to preamble") return self.jump_to_preamble(cell_token, jump_op, info) + xxx exported_state = self.export_state(start_label, operations[-1].getarglist(), info.inputargs, box_names_memo) 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 @@ -2609,14 +2609,12 @@ self.history.record(rop.JUMP, live_arg_boxes[num_green_args:], None, descr=target_jitcell_token) self.history.ends_with_jump = True - try: - target_token = compile.compile_trace(self, self.resumekey) - finally: - self.history.operations.pop() # remove the JUMP + target_token = compile.compile_trace(self, self.resumekey) if target_token is not None: # raise if it *worked* correctly assert isinstance(target_token, TargetToken) jitcell_token = target_token.targeting_jitcell_token self.raise_continue_running_normally(live_arg_boxes, jitcell_token) + xxxx # remove the jump op and continue tracing def compile_done_with_this_frame(self, exitbox): # temporarily put a JUMP to a pseudo-loop @@ -2709,7 +2707,7 @@ self.history = history.History() inputargs_and_holes = self.rebuild_state_after_failure(resumedescr, deadframe) - self.history.inputargs = [box for box in inputargs_and_holes if box] + self.history.set_inputargs([box for box in inputargs_and_holes if box]) finally: rstack._stack_criticalcode_stop() diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -1436,7 +1436,16 @@ def is_pure_with_descr(opnum, descr): if rop.is_always_pure(opnum): return True - xxxx + if (opnum == rop.GETFIELD_RAW_I or + opnum == rop.GETFIELD_RAW_R or + opnum == rop.GETFIELD_RAW_F or + opnum == rop.GETFIELD_GC_I or + opnum == rop.GETFIELD_GC_R or + opnum == rop.GETFIELD_GC_F or + opnum == rop.GETARRAYITEM_RAW_I or + opnum == rop.GETARRAYITEM_RAW_F): + return descr.is_always_pure() + return False @staticmethod def is_pure_getfield(opnum, descr): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit