[pypy-commit] pypy vecopt-merge: test_vectorize passes again

plan_rich noreply at buildbot.pypy.org
Fri Aug 21 14:10:46 CEST 2015


Author: Richard Plangger <rich at pasra.at>
Branch: vecopt-merge
Changeset: r79107:97f9f17c7fc2
Date: 2015-08-21 12:00 +0200
http://bitbucket.org/pypy/pypy/changeset/97f9f17c7fc2/

Log:	test_vectorize passes again

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
@@ -536,7 +536,7 @@
             self.cpu.profile_agent.native_code_written(name,
                                                        rawstart, full_size)
         return AsmInfo(ops_offset, rawstart + looppos,
-                       size_excluding_failure_stuff - looppos)
+                       size_excluding_failure_stuff - looppos, rawstart)
 
     @rgc.no_release_gil
     def assemble_bridge(self, faildescr, inputargs, operations,
@@ -569,7 +569,6 @@
         fullsize = self.mc.get_relative_pos()
         #
         rawstart = self.materialize_loop(original_loop_token)
-        original_loop_token.rawstart = rawstart
         self.patch_stack_checks(frame_depth_no_fixed_size + JITFRAME_FIXED_SIZE,
                                 rawstart)
         debug_bridge(descr_number, rawstart, codeendpos)
@@ -590,11 +589,11 @@
             name = "Bridge # %s" % (descr_number,)
             self.cpu.profile_agent.native_code_written(name,
                                                        rawstart, fullsize)
-        return AsmInfo(ops_offset, startpos + rawstart, codeendpos - startpos)
+        return AsmInfo(ops_offset, startpos + rawstart, codeendpos - startpos, rawstart)
 
     def stitch_bridge(self, faildescr, target):
         assert target != 0
-        self.patch_jump_for_descr(faildescr, target)
+        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
@@ -202,14 +202,17 @@
             vl.inputargs = version.inputargs
             vl.operations = version.operations
             vl.original_jitcell_token = jitcell_token
-            send_bridge_to_backend(jitdriver_sd, metainterp_sd,
+            asminfo = send_bridge_to_backend(jitdriver_sd, metainterp_sd,
                                    faildescr, version.inputargs,
                                    version.operations, jitcell_token)
             record_loop_or_bridge(metainterp_sd, vl)
+            assert asminfo is not None
+            version.compiled = asminfo
         # stitch the rest of the traces
         for version in loop.versions:
             for faildescr in version.faildescrs[1:]:
-                cpu.stitch_bridge(faildescr, jitcell_token)
+                if faildescr.version.compiled:
+                    cpu.stitch_bridge(faildescr, version.compiled)
     loop.versions = None
 
 def compile_retrace(metainterp, greenkey, start,
@@ -441,6 +444,7 @@
     #if metainterp_sd.warmrunnerdesc is not None:    # for tests
     #    metainterp_sd.warmrunnerdesc.memory_manager.keep_loop_alive(
     #        original_loop_token)
+    return asminfo
 
 # ____________________________________________________________
 
@@ -746,11 +750,6 @@
     def loop_version(self):
         return True
 
-    def clone(self):
-        cloned = ResumeGuardDescr.clone(self)
-        cloned.version = self.version
-        return cloned
-
 class AllVirtuals:
     llopaque = True
     cache = None
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
@@ -746,7 +746,6 @@
                 pass_by -= 1
     return -1
 
-
 class LoopVersion(object):
 
     def __init__(self, operations):
@@ -766,8 +765,8 @@
         assert isinstance(op, GuardResOp)
         descr = op.getdescr()
         assert isinstance(descr, CompileLoopVersionDescr)
+        self.faildescrs.append(descr)
         descr.version = self
-        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
         op.setfailargs(self.renamed_inputargs)
@@ -873,12 +872,18 @@
         return None
 
     def snapshot(self):
-        version = LoopVersion(self.copy_operations())
+        faildescrs = []
+        version = LoopVersion(self.copy_operations(faildescrs))
+        version.faildescrs = faildescrs
+        if not we_are_translated():
+            print "LOOP SNAPSHOT"
+            for op in version.operations:
+                print "", op
         self.versions.append(version)
         return version
 
-    def copy_operations(self):
-        from rpython.jit.metainterp.compile import ResumeGuardDescr, CompileLoopVersionDescr
+    def copy_operations(self, faildescrs=None):
+        from rpython.jit.metainterp.compile import ResumeGuardDescr
         ignore = (rop.DEBUG_MERGE_POINT,)
         operations = []
         for op in self.operations:
@@ -890,8 +895,8 @@
             if cloned.is_guard() and descr:
                 assert isinstance(descr, ResumeGuardDescr)
                 cloned.setdescr(descr.clone())
-                if isinstance(descr, CompileLoopVersionDescr):
-                    descr.version.register_guard(cloned)
+                if faildescrs and descr.loop_version():
+                    faildescrs.append(cloned.getdescr())
         return operations
 
     def get_display_text(self):    # for graphpage.py
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
@@ -272,10 +272,10 @@
             if not op.is_guard():
                 continue
             descr = op.getdescr()
-            if isinstance(descr, CompileLoopVersionDescr):
+            if descr.loop_version():
                 version.register_guard(op)
 
-        if user_code and False:
+        if user_code:
             version = loop.snapshot()
             self.eliminate_array_bound_checks(loop, version)
 
diff --git a/rpython/jit/metainterp/test/test_vectorize.py b/rpython/jit/metainterp/test/test_vectorize.py
--- a/rpython/jit/metainterp/test/test_vectorize.py
+++ b/rpython/jit/metainterp/test/test_vectorize.py
@@ -233,8 +233,8 @@
             # in this case a guard k <= d is inserted which fails right away!
             while i < d:
                 myjitdriver.jit_merge_point()
-                #if not(i < k):
-                #    k -= 1
+                if not(i < k):
+                    k -= 1
                 r += va[i]
                 i += 1
             lltype.free(va, flavor='raw')
diff --git a/rpython/rlib/jit.py b/rpython/rlib/jit.py
--- a/rpython/rlib/jit.py
+++ b/rpython/rlib/jit.py
@@ -1004,11 +1004,13 @@
     ops_offset - dict of offsets of operations or None
     asmaddr - (int) raw address of assembler block
     asmlen - assembler block length
+    rawstart - address a guard can jump to
     """
-    def __init__(self, ops_offset, asmaddr, asmlen):
+    def __init__(self, ops_offset, asmaddr, asmlen, rawstart):
         self.ops_offset = ops_offset
         self.asmaddr = asmaddr
         self.asmlen = asmlen
+        self.rawstart = rawstart
 
 class JitDebugInfo(object):
     """ An object representing debug info. Attributes meanings:


More information about the pypy-commit mailing list