[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