[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