Author: Hakan Ardo <ha...@debian.org> Branch: jit-targets Changeset: r48828:82923819cf55 Date: 2011-11-06 16:22 +0100 http://bitbucket.org/pypy/pypy/changeset/82923819cf55/
Log: traces from interpreter now working again diff --git a/pypy/jit/backend/llgraph/runner.py b/pypy/jit/backend/llgraph/runner.py --- a/pypy/jit/backend/llgraph/runner.py +++ b/pypy/jit/backend/llgraph/runner.py @@ -140,17 +140,17 @@ old, oldindex = faildescr._compiled_fail llimpl.compile_redirect_fail(old, oldindex, c) - def compile_loop(self, inputargs, operations, looptoken, log=True, name=''): + def compile_loop(self, inputargs, operations, jitcell_token, log=True, name=''): """In a real assembler backend, this should assemble the given list of operations. Here we just generate a similar CompiledLoop instance. The code here is RPython, whereas the code in llimpl is not. """ c = llimpl.compile_start() - clt = model.CompiledLoopToken(self, looptoken.number) + clt = model.CompiledLoopToken(self, jitcell_token.number) clt.loop_and_bridges = [c] clt.compiled_version = c - looptoken.compiled_loop_token = clt + jitcell_token.compiled_loop_token = clt self._compile_loop_or_bridge(c, inputargs, operations) def free_loop_and_bridges(self, compiled_loop_token): @@ -180,7 +180,7 @@ if isinstance(descr, Descr): llimpl.compile_add_descr(c, descr.ofs, descr.typeinfo, descr.arg_types) - if isinstance(descr, history.ProcedureToken): + if isinstance(descr, history.JitCellToken): assert False if op.getopnum() != rop.JUMP: llimpl.compile_add_loop_token(c, descr) diff --git a/pypy/jit/metainterp/compile.py b/pypy/jit/metainterp/compile.py --- a/pypy/jit/metainterp/compile.py +++ b/pypy/jit/metainterp/compile.py @@ -47,37 +47,39 @@ return loop -def make_procedure_token(jitdriver_sd): - procedure_token = JitCellToken() - procedure_token.outermost_jitdriver_sd = jitdriver_sd - return procedure_token +def make_jitcell_token(jitdriver_sd): + jitcell_token = JitCellToken() + jitcell_token.outermost_jitdriver_sd = jitdriver_sd + return jitcell_token def record_loop_or_bridge(metainterp_sd, loop): """Do post-backend recordings and cleanups on 'loop'. """ - # get the original loop token (corresponding to 'loop', or if that is - # a bridge, to the loop that this bridge belongs to) - looptoken = loop.token - assert looptoken is not None + # get the original jitcell token corresponding to jitcell form which + # this trace starts + original_jitcell_token = loop.original_jitcell_token + assert original_jitcell_token is not None if metainterp_sd.warmrunnerdesc is not None: # for tests - assert looptoken.generation > 0 # has been registered with memmgr - wref = weakref.ref(looptoken) + assert original_jitcell_token.generation > 0 # has been registered with memmgr + wref = weakref.ref(original_jitcell_token) for op in loop.operations: descr = op.getdescr() if isinstance(descr, ResumeDescr): descr.wref_original_loop_token = wref # stick it there n = descr.index if n >= 0: # we also record the resumedescr number - looptoken.compiled_loop_token.record_faildescr_index(n) + original_jitcell_token.compiled_loop_token.record_faildescr_index(n) elif isinstance(descr, JitCellToken): + # for a CALL_ASSEMBLER ... assert False, "FIXME" elif isinstance(descr, TargetToken): - # for a JUMP or a CALL_ASSEMBLER: record it as a potential jump. + # for a JUMP: record it as a potential jump. # (the following test is not enough to prevent more complicated # cases of cycles, but at least it helps in simple tests of # test_memgr.py) - if descr.procedure_token is not looptoken: - looptoken.record_jump_to(descr.procedure_token) + if descr.original_jitcell_token is not original_jitcell_token: + assert descr.original_jitcell_token is not None + original_jitcell_token.record_jump_to(descr.original_jitcell_token) op._descr = None # clear reference, mostly for tests # record this looptoken on the QuasiImmut used in the code if loop.quasi_immutable_deps is not None: @@ -85,9 +87,9 @@ qmut.register_loop_token(wref) # XXX maybe we should clear the dictionary here # mostly for tests: make sure we don't keep a reference to the LoopToken - loop.token = None + loop.original_jitcell_token = None if not we_are_translated(): - loop._looptoken_number = looptoken.number + loop._looptoken_number = original_jitcell_token.number # ____________________________________________________________ @@ -184,12 +186,12 @@ old_loop_tokens.append(loop_token) def send_loop_to_backend(greenkey, jitdriver_sd, metainterp_sd, loop, type): - jitdriver_sd.on_compile(metainterp_sd.logger_ops, loop.token, + original_jitcell_token = loop.original_jitcell_token + jitdriver_sd.on_compile(metainterp_sd.logger_ops, original_jitcell_token, loop.operations, type, greenkey) loopname = jitdriver_sd.warmstate.get_location_str(greenkey) globaldata = metainterp_sd.globaldata - loop_token = loop.token - loop_token.number = n = globaldata.loopnumbering + original_jitcell_token.number = n = globaldata.loopnumbering globaldata.loopnumbering += 1 if not we_are_translated(): @@ -201,7 +203,7 @@ debug_start("jit-backend") try: ops_offset = metainterp_sd.cpu.compile_loop(loop.inputargs, operations, - loop.token, name=loopname) + original_jitcell_token, name=loopname) finally: debug_stop("jit-backend") metainterp_sd.profiler.end_backend() @@ -216,7 +218,7 @@ metainterp_sd.logger_ops.log_loop(loop.inputargs, loop.operations, n, type, ops_offset) # if metainterp_sd.warmrunnerdesc is not None: # for tests - metainterp_sd.warmrunnerdesc.memory_manager.keep_loop_alive(loop.token) + metainterp_sd.warmrunnerdesc.memory_manager.keep_loop_alive(original_jitcell_token) def send_bridge_to_backend(jitdriver_sd, metainterp_sd, faildescr, inputargs, operations, original_loop_token): @@ -610,19 +612,18 @@ metainterp_sd = metainterp.staticdata jitdriver_sd = metainterp.jitdriver_sd redargs = new_loop.inputargs - procedure_token = make_procedure_token(jitdriver_sd) - new_loop.token = procedure_token + new_loop.original_jitcell_token = jitcell_token = make_jitcell_token(jitdriver_sd) send_loop_to_backend(self.original_greenkey, metainterp.jitdriver_sd, metainterp_sd, new_loop, "entry bridge") # send the new_loop to warmspot.py, to be called directly the next time jitdriver_sd.warmstate.attach_procedure_to_interp( - self.original_greenkey, procedure_token) + self.original_greenkey, jitcell_token) def reset_counter_from_failure(self): pass -def compile_new_bridge(metainterp, resumekey, retraced=False): +def compile_trace(metainterp, resumekey, retraced=False): """Try to compile a new bridge leading from the beginning of the history to some existing place. """ @@ -653,7 +654,7 @@ debug_print('InvalidLoop in compile_new_bridge') return None - if new_trace.operations[-1].getopnum() == rop.JUMP: + if new_trace.operations[-1].getopnum() != rop.LABEL: # We managed to create a bridge. Dispatch to resumekey to # know exactly what we must do (ResumeGuardDescr/ResumeFromInterpDescr) target_token = new_trace.operations[-1].getdescr() diff --git a/pypy/jit/metainterp/history.py b/pypy/jit/metainterp/history.py --- a/pypy/jit/metainterp/history.py +++ b/pypy/jit/metainterp/history.py @@ -770,6 +770,7 @@ self.cell_token = cell_token self.virtual_state = None self.exported_state = None + self.original_jitcell_token = None class TreeLoop(object): inputargs = None @@ -782,6 +783,11 @@ raise Exception("TreeLoop.token is killed") token = property(_token, _token) + # This is the jitcell where the trace starts. Labels within the trace might + # belong to some other jitcells in the sens that jumping to this other + # jitcell will result in a jump to the label. + original_jitcell_token = None + def __init__(self, name): self.name = name # self.operations = list of ResOperations @@ -816,6 +822,10 @@ def check_consistency(self): # for testing "NOT_RPYTHON" self.check_consistency_of(self.inputargs, self.operations) + for op in self.operations: + descr = op.getdescr() + if isinstance(descr, TargetToken): + assert descr.original_jitcell_token is self.original_jitcell_token @staticmethod def check_consistency_of(inputargs, operations): diff --git a/pypy/jit/metainterp/optimizeopt/unroll.py b/pypy/jit/metainterp/optimizeopt/unroll.py --- a/pypy/jit/metainterp/optimizeopt/unroll.py +++ b/pypy/jit/metainterp/optimizeopt/unroll.py @@ -78,12 +78,16 @@ start_label = None jumpop = loop.operations[-1] - assert jumpop.getopnum() == rop.JUMP - loop.operations = loop.operations[:-1] + if jumpop.getopnum() == rop.JUMP: + loop.operations = loop.operations[:-1] + else: + jumpop = None self.import_state(start_label) self.optimizer.propagate_all_forward(clear=False) + if not jumpop: + return if self.jump_to_already_compiled_trace(jumpop): return diff --git a/pypy/jit/metainterp/pyjitpl.py b/pypy/jit/metainterp/pyjitpl.py --- a/pypy/jit/metainterp/pyjitpl.py +++ b/pypy/jit/metainterp/pyjitpl.py @@ -2114,7 +2114,7 @@ # FIXME: kill TerminatingLoopToken? # FIXME: can we call compile_trace? self.history.record(rop.FINISH, exits, None, descr=loop_tokens[0].finishdescr) - target_loop_token = compile.compile_new_bridge(self, self.resumekey) + target_loop_token = compile.compile_trace(self, self.resumekey) if not target_loop_token: compile.giveup() _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit