Author: Richard Plangger <r...@pasra.at> Branch: memoryerror3 Changeset: r79199:fbcc105f757d Date: 2015-08-24 13:41 +0200 http://bitbucket.org/pypy/pypy/changeset/fbcc105f757d/
Log: memory error does not occur anymore diff --git a/rpython/jit/backend/x86/assembler.py b/rpython/jit/backend/x86/assembler.py --- a/rpython/jit/backend/x86/assembler.py +++ b/rpython/jit/backend/x86/assembler.py @@ -592,9 +592,8 @@ return AsmInfo(ops_offset, startpos + rawstart, codeendpos - startpos, rawstart) def stitch_bridge(self, faildescr, target): - pass - #assert target != 0 - #self.patch_jump_for_descr(faildescr, target.rawstart) + assert target.rawstart != 0 + self.patch_jump_for_descr(faildescr, target.rawstart) def write_pending_failure_recoveries(self, regalloc): # for each pending guard, generate the code of the recovery stub 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 @@ -162,7 +162,7 @@ if loop.versions is not None: # every different loop version must update their target tokens - for version in loop.versions[1:]: + for version in loop.versions: version.update_token(jitcell_token, all_target_tokens) if not loop.quasi_immutable_deps: @@ -195,7 +195,7 @@ # compile each version once for the first fail descr! # this assumes that the root trace (= loop) is already compiled for version in loop.versions: - if not version.compiled(): + if not version.compiled() and version.faildescrs: faildescr = version.faildescrs[0] vl = create_empty_loop(metainterp) vl.inputargs = version.inputargs @@ -214,9 +214,11 @@ # the version was never compiled, do not bother # to assign it's fail descr continue - for faildescr in lv.faildescrs[1:]: - if version and version.compiled(): - cpu.stitch_bridge(faildescr, version.compile_data) + for i,faildescr in enumerate(lv.faildescrs): + if i == 0: + continue + assert isinstance(faildescr, AbstractFailDescr) + cpu.stitch_bridge(faildescr, lv.compile_data) for lv in loop.versions: lv.compile_data = None lv.faildescrs = [] diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py --- a/rpython/jit/metainterp/history.py +++ b/rpython/jit/metainterp/history.py @@ -757,9 +757,11 @@ inputargs = None renamed_inputargs = None - def __init__(self, loop): + def __init__(self, operations): self.faildescrs = [] - self.operations = self.copy_operations(loop.operations) + self.operations = operations + + def setup_once(self): idx = index_of_first(rop.LABEL, self.operations) assert idx >= 0 label = self.operations[idx] @@ -773,36 +775,9 @@ return self.compile_data is not None - def copy_operations(self, operations): - from rpython.jit.metainterp.compile import ResumeGuardDescr, CompileLoopVersionDescr - ignore = (rop.DEBUG_MERGE_POINT,) - oplist = [] - for op in operations: - if op.getopnum() in ignore: - continue - cloned = op.clone() - oplist.append(cloned) - if cloned.is_guard(): - olddescr = cloned.getdescr() - if not olddescr: - continue - descr = olddescr.clone() - cloned.setdescr(descr) - if olddescr.loop_version(): - # copy the version - assert isinstance(descr, CompileLoopVersionDescr) - assert isinstance(olddescr, CompileLoopVersionDescr) - descr.version = olddescr.version - self.faildescrs.append(descr) - return oplist - def register_guard(self, op, version): - from rpython.jit.metainterp.compile import CompileLoopVersionDescr assert isinstance(op, GuardResOp) descr = op.getdescr() - if not descr.loop_version(): - assert 0, "cannot register a guard that is not a CompileLoopVersionDescr" - assert isinstance(descr, CompileLoopVersionDescr) self.faildescrs.append(descr) # note: stitching a guard must resemble the order of the label # otherwise a wrong mapping is handed to the register allocator @@ -909,10 +884,29 @@ return None def snapshot(self): - version = LoopVersion(self) + oplist = self.copy_operations(self.operations) + version = LoopVersion(oplist) + version.setup_once() self.versions.append(version) return version + def copy_operations(self, operations): + ignore = (rop.DEBUG_MERGE_POINT,) + oplist = [] + for op in operations: + if op.getopnum() in ignore: + continue + cloned = op.clone() + oplist.append(cloned) + if cloned.is_guard(): + olddescr = cloned.getdescr() + if not olddescr: + continue + descr = olddescr.clone() + cloned.setdescr(descr) + return oplist + + def get_display_text(self): # for graphpage.py return self.name + '\n' + repr(self.inputargs) diff --git a/rpython/jit/metainterp/optimizeopt/guard.py b/rpython/jit/metainterp/optimizeopt/guard.py --- a/rpython/jit/metainterp/optimizeopt/guard.py +++ b/rpython/jit/metainterp/optimizeopt/guard.py @@ -152,10 +152,10 @@ assert operations[self.index] is self.op operations[self.index] = None descr = self.op.getdescr() - if descr and descr.loop_version(): - from rpython.jit.metainterp.compile import CompileLoopVersionDescr - assert isinstance(descr, CompileLoopVersionDescr) - descr.version = None + #if descr and descr.loop_version(): + # from rpython.jit.metainterp.compile import CompileLoopVersionDescr + # assert isinstance(descr, CompileLoopVersionDescr) + # descr.version = None if operations[self.index-1] is self.cmp_op: operations[self.index-1] = None @@ -266,20 +266,18 @@ self.collect_guard_information(loop) self.eliminate_guards(loop) # - assert len(loop.versions) == 2, "need one orignal loop version (before trans) and the current one" - root_version = loop.versions[0] - version = loop.versions[1] - + assert len(loop.versions) == 1 + version = loop.versions[0] for op in loop.operations: if not op.is_guard(): continue descr = op.getdescr() if descr.loop_version(): - root_version.register_guard(op, version) + version.register_guard(op, version) - if user_code: - version = loop.snapshot() - self.eliminate_array_bound_checks(loop, root_version, version) + #if user_code: + # version = loop.snapshot() + # self.eliminate_array_bound_checks(loop, root_version, version) def emit_operation(self, op): self.renamer.rename(op) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit