Author: Maciej Fijalkowski <fij...@gmail.com> Branch: kill-gen-store-back-in Changeset: r65624:7a884a450023 Date: 2013-07-24 19:41 +0200 http://bitbucket.org/pypy/pypy/changeset/7a884a450023/
Log: kill a short-lived resop diff --git a/rpython/jit/backend/model.py b/rpython/jit/backend/model.py --- a/rpython/jit/backend/model.py +++ b/rpython/jit/backend/model.py @@ -182,7 +182,7 @@ def arraydescrof(self, A): raise NotImplementedError - def calldescrof(self, FUNC, ARGS, RESULT): + def calldescrof(self, FUNC, ARGS, RESULT, extrainfo): # FUNC is the original function type, but ARGS is a list of types # with Voids removed raise NotImplementedError @@ -298,11 +298,6 @@ def bh_copyunicodecontent(self, src, dst, srcstart, dststart, length): raise NotImplementedError - def bh_force_virtualizable(self, v, descr): - vinfo = descr.get_vinfo() - if vinfo is not None: - vinfo.clear_vable_token(v) - class CompiledLoopToken(object): asmmemmgr_blocks = None asmmemmgr_gcroots = 0 diff --git a/rpython/jit/backend/x86/regalloc.py b/rpython/jit/backend/x86/regalloc.py --- a/rpython/jit/backend/x86/regalloc.py +++ b/rpython/jit/backend/x86/regalloc.py @@ -314,8 +314,7 @@ self.assembler.mc.mark_op(op) self.rm.position = i self.xrm.position = i - if (op.has_no_side_effect() and op.result not in self.longevity - and op.opnum != rop.FORCE_VIRTUALIZABLE): + if op.has_no_side_effect() and op.result not in self.longevity: i += 1 self.possibly_free_vars_for_op(op) continue @@ -865,18 +864,6 @@ gc_ll_descr.get_nursery_top_addr(), sizeloc, gcmap) - def consider_force_virtualizable(self, op): - # just do a call for now - vinfo = op.getdescr().get_vinfo() - if vinfo is None: - return # for tests - calldescr = vinfo.clear_vable_descr - assert isinstance(calldescr, CallDescr) - fval = rffi.cast(lltype.Signed, vinfo.clear_vable_ptr) - op = ResOperation(rop.CALL, [ConstInt(fval), op.getarg(0)], None, - descr=calldescr) - self.consider_call(op) - def consider_call_malloc_nursery_varsize(self, op): gc_ll_descr = self.assembler.cpu.gc_ll_descr if not hasattr(gc_ll_descr, 'max_size_of_young_obj'): diff --git a/rpython/jit/codewriter/effectinfo.py b/rpython/jit/codewriter/effectinfo.py --- a/rpython/jit/codewriter/effectinfo.py +++ b/rpython/jit/codewriter/effectinfo.py @@ -84,6 +84,7 @@ OS_UNI_COPY_TO_RAW = 113 OS_JIT_FORCE_VIRTUAL = 120 + OS_JIT_FORCE_VIRTUALIZABLE = 121 # for debugging: _OS_CANRAISE = set([ diff --git a/rpython/jit/metainterp/blackhole.py b/rpython/jit/metainterp/blackhole.py --- a/rpython/jit/metainterp/blackhole.py +++ b/rpython/jit/metainterp/blackhole.py @@ -1320,10 +1320,6 @@ from rpython.jit.metainterp import quasiimmut quasiimmut.do_force_quasi_immutable(cpu, struct, mutatefielddescr) - @arguments("cpu", "r", "d") - def bhimpl_force_virtualizable(cpu, v, descr): - cpu.bh_force_virtualizable(v, descr) - @arguments("r") def bhimpl_hint_force_virtualizable(r): pass diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py --- a/rpython/jit/metainterp/executor.py +++ b/rpython/jit/metainterp/executor.py @@ -281,9 +281,6 @@ def do_keepalive(cpu, _, x): pass -def do_force_virtualizable(cpu, _, v, descr): - cpu.bh_force_virtualizable(v.getref_base(), descr) - # ____________________________________________________________ ##def do_force_token(cpu): diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py --- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py @@ -7090,7 +7090,7 @@ ops = """ [i0] p1 = new_with_vtable(ConstClass(node_vtable)) - force_virtualizable(p1) + cond_call(1, 123, p1, descr=clear_vable) jump(i0) """ expected = """ diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py b/rpython/jit/metainterp/optimizeopt/test/test_util.py --- a/rpython/jit/metainterp/optimizeopt/test/test_util.py +++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py @@ -256,12 +256,19 @@ asmdescr = LoopToken() # it can be whatever, it's not a descr though from rpython.jit.metainterp.virtualref import VirtualRefInfo + class FakeWarmRunnerDesc: pass FakeWarmRunnerDesc.cpu = cpu vrefinfo = VirtualRefInfo(FakeWarmRunnerDesc) virtualtokendescr = vrefinfo.descr_virtual_token virtualforceddescr = vrefinfo.descr_forced + FUNC = lltype.FuncType([], lltype.Void) + ei = EffectInfo([], [], [], [], EffectInfo.EF_CANNOT_RAISE, + can_invalidate=False, + oopspecindex=EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE) + clear_vable = cpu.calldescrof(FUNC, FUNC.ARGS, FUNC.RESULT, ei) + jit_virtual_ref_vtable = vrefinfo.jit_virtual_ref_vtable jvr_vtable_adr = llmemory.cast_ptr_to_adr(jit_virtual_ref_vtable) @@ -447,7 +454,7 @@ preamble.inputargs = inputargs preamble.resume_at_jump_descr = FakeDescrWithSnapshot() - token = JitCellToken() + token = JitCellToken() preamble.operations = [ResOperation(rop.LABEL, inputargs, None, descr=TargetToken(token))] + \ operations + \ [ResOperation(rop.LABEL, jump_args, None, descr=token)] @@ -460,7 +467,7 @@ loop.operations = [preamble.operations[-1]] + \ [inliner.inline_op(op, clone=False) for op in cloned_operations] + \ [ResOperation(rop.JUMP, [inliner.inline_arg(a) for a in jump_args], - None, descr=token)] + None, descr=token)] #[inliner.inline_op(jumpop)] assert loop.operations[-1].getopnum() == rop.JUMP assert loop.operations[0].getopnum() == rop.LABEL @@ -479,7 +486,7 @@ preamble.operations.insert(-1, op) return preamble - + class FakeDescr(compile.ResumeGuardDescr): def clone_if_mutable(self): diff --git a/rpython/jit/metainterp/optimizeopt/virtualize.py b/rpython/jit/metainterp/optimizeopt/virtualize.py --- a/rpython/jit/metainterp/optimizeopt/virtualize.py +++ b/rpython/jit/metainterp/optimizeopt/virtualize.py @@ -543,12 +543,6 @@ else: self.emit_operation(op) - def optimize_FORCE_VIRTUALIZABLE(self, op): - val = self.getvalue(op.getarg(0)) - if val.is_virtual(): - return - self.emit_operation(op) - def optimize_CALL_MAY_FORCE(self, op): effectinfo = op.getdescr().get_extra_info() oopspecindex = effectinfo.oopspecindex @@ -557,6 +551,15 @@ return self.emit_operation(op) + def optimize_COND_CALL(self, op): + effectinfo = op.getdescr().get_extra_info() + oopspecindex = effectinfo.oopspecindex + if oopspecindex == EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE: + value = self.getvalue(op.getarg(2)) + if value.is_virtual(): + return + self.emit_operation(op) + def optimize_VIRTUAL_REF(self, op): # get some constants vrefinfo = self.optimizer.metainterp_sd.virtualref_info diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py --- a/rpython/jit/metainterp/resoperation.py +++ b/rpython/jit/metainterp/resoperation.py @@ -491,7 +491,6 @@ 'NEWSTR/1', 'NEWUNICODE/1', '_MALLOC_LAST', - 'FORCE_VIRTUALIZABLE/1d', # forces a non-standard virtualizable '_CANMALLOC_LAST', 'FORCE_TOKEN/0', 'VIRTUAL_REF/2', # removed before it's passed to the backend diff --git a/rpython/jit/metainterp/test/test_recursive.py b/rpython/jit/metainterp/test/test_recursive.py --- a/rpython/jit/metainterp/test/test_recursive.py +++ b/rpython/jit/metainterp/test/test_recursive.py @@ -796,7 +796,7 @@ return frame.thing.val res = self.meta_interp(main, [0], inline=True) - self.check_resops(force_virtualizable=2) + self.check_resops(cond_call=2) assert res == main(0) def test_directly_call_assembler_virtualizable_reset_token(self): diff --git a/rpython/jit/metainterp/virtualizable.py b/rpython/jit/metainterp/virtualizable.py --- a/rpython/jit/metainterp/virtualizable.py +++ b/rpython/jit/metainterp/virtualizable.py @@ -300,9 +300,12 @@ self.clear_vable_ptr = self.warmrunnerdesc.helper_func( FUNCPTR, self.clear_vable_token) FUNC = FUNCPTR.TO + ei = EffectInfo([], [], [], [], EffectInfo.EF_CANNOT_RAISE, + can_invalidate=False, + oopspecindex=EffectInfo.OS_JIT_FORCE_VIRTUALIZABLE) + self.clear_vable_descr = self.cpu.calldescrof(FUNC, FUNC.ARGS, - FUNC.RESULT, - EffectInfo.LEAST_GENERAL) + FUNC.RESULT, ei) def unwrap_virtualizable_box(self, virtualizable_box): return virtualizable_box.getref(llmemory.GCREF) _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit