[pypy-commit] pypy memoryerror3: memory error does not occur anymore
plan_rich
noreply at buildbot.pypy.org
Mon Aug 24 13:41:42 CEST 2015
Author: Richard Plangger <rich at 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)
More information about the pypy-commit
mailing list