[pypy-commit] pypy kill-gen-store-back-in: kill a short-lived resop
fijal
noreply at buildbot.pypy.org
Wed Jul 24 19:42:56 CEST 2013
Author: Maciej Fijalkowski <fijall at 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)
More information about the pypy-commit
mailing list