[pypy-commit] pypy jit-threshold-hooks: (fijal, ltratt) Add support for getting/setting threshold on descrs of guards
fijal
noreply at buildbot.pypy.org
Mon Aug 26 16:33:05 CEST 2013
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: jit-threshold-hooks
Changeset: r66318:7bf93e121a95
Date: 2013-08-26 15:32 +0100
http://bitbucket.org/pypy/pypy/changeset/7bf93e121a95/
Log: (fijal, ltratt) Add support for getting/setting threshold on descrs
of guards
diff --git a/pypy/module/pypyjit/interp_resop.py b/pypy/module/pypyjit/interp_resop.py
--- a/pypy/module/pypyjit/interp_resop.py
+++ b/pypy/module/pypyjit/interp_resop.py
@@ -4,7 +4,7 @@
from pypy.interpreter.baseobjspace import W_Root
from pypy.interpreter.gateway import unwrap_spec, interp2app
from pypy.interpreter.pycode import PyCode
-from pypy.interpreter.error import OperationError
+from pypy.interpreter.error import OperationError, operationerrfmt
from rpython.rtyper.lltypesystem import lltype
from rpython.rtyper.annlowlevel import cast_base_ptr_to_instance, hlstr
from rpython.rtyper.lltypesystem.rclass import OBJECT
@@ -180,6 +180,13 @@
def descr_name(self, space):
return space.wrap(hlstr(jit_hooks.resop_getopname(self.op)))
+ def descr_getdescr(self, space):
+ lldescr = jit_hooks.resop_getdescr(self.op)
+ if not lldescr:
+ raise operationerrfmt(space.w_TypeError,
+ "%s is not a guard", self.repr_of_resop)
+ return WrappedDescr(lldescr)
+
@unwrap_spec(no=int)
def descr_getarg(self, space, no):
return WrappedBox(jit_hooks.resop_getarg(self.op, no))
@@ -195,6 +202,24 @@
box = space.interp_w(WrappedBox, w_box)
jit_hooks.resop_setresult(self.op, box.llbox)
+class WrappedDescr(W_Root):
+ """ A class representing a single descr for a ResOperation
+ """
+ def __init__(self, lldescr):
+ self.lldescr = lldescr
+
+ def get_threshold(self, space):
+ return space.wrap(jit_hooks.descr_getthreshold(self.lldescr))
+
+ @unwrap_spec(v=int)
+ def set_threshold(self, space, v):
+ jit_hooks.descr_setthreshold(self.lldescr, v)
+
+WrappedDescr.typedef = TypeDef("Descr",
+ threshold = GetSetProperty(WrappedDescr.get_threshold,
+ WrappedDescr.set_threshold)
+)
+
class DebugMergePoint(WrappedOp):
""" A class representing Debug Merge Point - the entry point
to a jitted loop.
@@ -232,7 +257,8 @@
getarg = interp2app(WrappedOp.descr_getarg),
setarg = interp2app(WrappedOp.descr_setarg),
result = GetSetProperty(WrappedOp.descr_getresult,
- WrappedOp.descr_setresult)
+ WrappedOp.descr_setresult),
+ descr = GetSetProperty(WrappedOp.descr_getdescr)
)
WrappedOp.acceptable_as_base_class = False
diff --git a/pypy/module/pypyjit/test/test_jit_hook.py b/pypy/module/pypyjit/test/test_jit_hook.py
--- a/pypy/module/pypyjit/test/test_jit_hook.py
+++ b/pypy/module/pypyjit/test/test_jit_hook.py
@@ -5,6 +5,7 @@
from rpython.jit.metainterp.history import JitCellToken, ConstInt, ConstPtr,\
BasicFailDescr
from rpython.jit.metainterp.resoperation import rop
+from rpython.jit.metainterp.compile import ResumeGuardDescr
from rpython.jit.metainterp.logger import Logger
from rpython.rtyper.annlowlevel import (cast_instance_to_base_ptr,
cast_base_ptr_to_instance)
@@ -52,13 +53,14 @@
code_gcref = lltype.cast_opaque_ptr(llmemory.GCREF, ll_code)
logger = Logger(MockSD())
+ descr = ResumeGuardDescr()
oplist = parse("""
[i1, i2, p2]
i3 = int_add(i1, i2)
debug_merge_point(0, 0, 0, 0, 0, ConstPtr(ptr0))
guard_nonnull(p2) []
- guard_true(i3) []
- """, namespace={'ptr0': code_gcref}).operations
+ guard_true(i3, descr=descr) []
+ """, namespace={'ptr0': code_gcref, 'descr': descr}).operations
greenkey = [ConstInt(0), ConstInt(0), ConstPtr(code_gcref)]
offset = {}
for i, op in enumerate(oplist):
@@ -67,24 +69,24 @@
token = JitCellToken()
token.number = 0
- di_loop = JitDebugInfo(MockJitDriverSD, logger, token, oplist, 'loop',
- greenkey)
- di_loop_optimize = JitDebugInfo(MockJitDriverSD, logger, JitCellToken(),
- oplist, 'loop', greenkey)
- di_loop.asminfo = AsmInfo(offset, 0, 0)
di_bridge = JitDebugInfo(MockJitDriverSD, logger, JitCellToken(),
oplist, 'bridge', fail_descr=BasicFailDescr())
di_bridge.asminfo = AsmInfo(offset, 0, 0)
def interp_on_compile():
- di_loop.oplist = cls.oplist
+ di_loop = JitDebugInfo(MockJitDriverSD, logger, token, oplist[:],
+ 'loop', greenkey)
+ di_loop.asminfo = AsmInfo(offset, 0, 0)
pypy_hooks.after_compile(di_loop)
def interp_on_compile_bridge():
pypy_hooks.after_compile_bridge(di_bridge)
def interp_on_optimize():
- di_loop_optimize.oplist = cls.oplist
+ di_loop_optimize = JitDebugInfo(MockJitDriverSD, logger,
+ JitCellToken(),
+ oplist[:], 'loop', greenkey)
+ di_loop_optimize.oplist = oplist[:]
pypy_hooks.before_compile(di_loop_optimize)
def interp_on_abort():
@@ -98,12 +100,9 @@
cls.w_int_add_num = space.wrap(rop.INT_ADD)
cls.w_dmp_num = space.wrap(rop.DEBUG_MERGE_POINT)
cls.w_on_optimize = space.wrap(interp2app(interp_on_optimize))
- cls.orig_oplist = oplist
+ cls.oplist = property(lambda : oplist[:])
cls.w_sorted_keys = space.wrap(sorted(Counters.counter_names))
- def setup_method(self, meth):
- self.__class__.oplist = self.orig_oplist[:]
-
def test_on_compile(self):
import pypyjit
all = []
@@ -248,6 +247,22 @@
raises(AttributeError, 'op.pycode')
assert op.call_depth == 5
+ def test_descr_set_threshold(self):
+ import pypyjit
+ all = []
+
+ def hook(info):
+ all.append(info)
+
+ pypyjit.set_compile_hook(hook)
+ assert not all
+ self.on_compile()
+ raises(TypeError, "all[0].operations[0].descr")
+ descr = all[0].operations[-1].descr
+ assert descr.threshold == 0
+ descr.threshold = 1
+ assert descr.threshold == 1
+
def test_get_stats_snapshot(self):
skip("a bit no idea how to test it")
from pypyjit import get_stats_snapshot
diff --git a/rpython/rlib/jit_hooks.py b/rpython/rlib/jit_hooks.py
--- a/rpython/rlib/jit_hooks.py
+++ b/rpython/rlib/jit_hooks.py
@@ -42,6 +42,18 @@
ptr = lltype.cast_opaque_ptr(rclass.OBJECTPTR, llref)
return cast_base_ptr_to_instance(AbstractResOp, ptr)
+def _cast_to_descr(lldescr):
+ from rpython.jit.metainterp.history import AbstractDescr
+ from rpython.jit.metainterp.compile import ResumeGuardDescr
+
+ ptr = lltype.cast_opaque_ptr(rclass.OBJECTPTR, lldescr)
+ if not ptr:
+ return None
+ obj = cast_base_ptr_to_instance(AbstractDescr, ptr)
+ if not isinstance(obj, ResumeGuardDescr):
+ return None
+ return obj
+
@specialize.argtype(0)
def _cast_to_gcref(obj):
return lltype.cast_opaque_ptr(llmemory.GCREF,
@@ -86,6 +98,18 @@
def resop_getresult(llop):
return _cast_to_gcref(_cast_to_resop(llop).result)
+ at register_helper(annmodel.SomePtr(llmemory.GCREF))
+def resop_getdescr(llop):
+ return _cast_to_gcref(_cast_to_resop(llop).getdescr())
+
+ at register_helper(annmodel.SomeInteger())
+def descr_getthreshold(lldescr):
+ return _cast_to_descr(lldescr)._counter
+
+ at register_helper(annmodel.s_None)
+def descr_setthreshold(lldescr, threshold):
+ _cast_to_descr(lldescr)._counter = threshold
+
@register_helper(annmodel.s_None)
def resop_setresult(llop, llbox):
_cast_to_resop(llop).result = _cast_to_box(llbox)
More information about the pypy-commit
mailing list