[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