Author: Richard Plangger <r...@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: _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit