[pypy-svn] r23302 - in pypy/dist/pypy/jit: . test

pedronis at codespeak.net pedronis at codespeak.net
Mon Feb 13 23:41:25 CET 2006


Author: pedronis
Date: Mon Feb 13 23:41:23 2006
New Revision: 23302

Modified:
   pypy/dist/pypy/jit/hintrtyper.py
   pypy/dist/pypy/jit/hinttimeshift.py
   pypy/dist/pypy/jit/rtimeshift.py
   pypy/dist/pypy/jit/test/test_hint_timeshift.py
Log:
experimenting with mix level helpers,

for now using a policy that for functions starting with ll_/_ll_ uses the same specialisation rules
as the low-level policy, we probably need user supplied specialisations for the high/mix level helpers themself.

of course if we start introducing new  classes etc, or mixing signatures we will need to be very careful,
and re-invoke as much as necessary of the normalisation logic.

now HintLowLevelOpList has a first sketch of a method .genmixlevelhelpercall(self, function, args_s, args_v)

it is tentatively used to invoke rtimeshift.retrieve_jitstate_for_merge for merge logic blocks.

The dummy code that is there now in rtimeshift.retrieve_jitstate_for_merge is just there for playing with
the concept.



Modified: pypy/dist/pypy/jit/hintrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/hintrtyper.py	(original)
+++ pypy/dist/pypy/jit/hintrtyper.py	Mon Feb 13 23:41:23 2006
@@ -1,5 +1,6 @@
 from pypy.annotation import model as annmodel
 from pypy.annotation.pairtype import pair, pairtype
+from pypy.rpython import annlowlevel
 from pypy.rpython.rtyper import RPythonTyper, LowLevelOpList
 from pypy.rpython.rmodel import Repr, inputconst
 from pypy.rpython.rstr import string_repr
@@ -101,6 +102,17 @@
         #                         opname2vstr(hop.spaceop.opname),
         #                         v_args, c_restype)
 
+class MixLevelAnnotatorPolicy(annlowlevel.LowLevelAnnotatorPolicy):
+
+    def default_specialize(pol, funcdesc, args_s):
+        name = funcdesc.name
+        if name.startswith('ll_') or name.startswith('_ll_'): # xxx can we do better?
+            return annlowlevel.LowLevelAnnotatorPolicy.default_specialize(pol, funcdesc, args_s)
+        else:
+            return funcdesc.cachedgraph(None)
+
+    # TODO finer control specialisations for highlevel helpers ...
+
 class HintLowLevelOpList(LowLevelOpList):
     """Warning: the HintLowLevelOpList's rtyper is the *original*
     rtyper, while the HighLevelOp's rtyper is actually our HintRTyper...
@@ -112,6 +124,23 @@
     def hasparentgraph(self):
         return False   # for now
 
+    def genmixlevelhelpercall(self, function, args_s, args_v):
+        # XXX first approximation, will likely need some fine controlled
+        # specialisation for these helpers too
+        rtyper = self.rtyper
+        rtyper.call_all_setups()  # compute ForwardReferences now
+        graph = rtyper.annotator.annotate_helper(function, args_s,
+                                                 policy=MixLevelAnnotatorPolicy()
+                                                 )
+        self.record_extra_call(graph) # xxx
+
+        # build the 'direct_call' operation
+        f = rtyper.getcallable(graph)
+        c = inputconst(lltype.typeOf(f), f)
+        fobj = rtyper.type_system_deref(f)
+        return self.genop('direct_call', [c]+args_v,
+                          resulttype = lltype.typeOf(fobj).RESULT)
+
     def getjitstate(self):
         v_jitstate = self.originalblock.inputargs[0]
         assert v_jitstate.concretetype == rtimeshift.STATE_PTR
@@ -153,7 +182,7 @@
                                    llops.getjitstate(), v, c_TYPE)
 
     def convert_const(self, ll_value):
-        return rtimeshift.REDBOX.make_from_const(ll_value)
+        return rtimeshift.REDBOX.ll_make_from_const(ll_value)
 
     def residual_values(self, ll_value):
         return [ll_value]

Modified: pypy/dist/pypy/jit/hinttimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/hinttimeshift.py	(original)
+++ pypy/dist/pypy/jit/hinttimeshift.py	Mon Feb 13 23:41:23 2006
@@ -108,10 +108,10 @@
             v_key = rtuple.newtuple(llops, r_key, key_v)
             v_boxes = rlist.newlist(llops, r_box_list, boxes_v)
 
-            v_newjiststate = llops.gendirectcall(rtimeshift.ll_retrieve_jitstate_for_merge,
-                                                 c_state_dic,
-                                                 newinputargs[0], # jitstate
-                                                 v_key, v_boxes)
+
+            v_newjiststate = llops.genmixlevelhelpercall(rtimeshift.retrieve_jitstate_for_merge,
+                                                         [s_state_dic, annmodel.SomePtr(STATE_PTR), s_key_tuple, s_box_list],
+                                                         [c_state_dic, newinputargs[0], v_key, v_boxes])
 
             newinputargs2 = [v_newjiststate]
             i = 0

Modified: pypy/dist/pypy/jit/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/rtimeshift.py	Mon Feb 13 23:41:23 2006
@@ -17,29 +17,29 @@
 STATE_PTR = lltype.Ptr(STATE)
 
 
-def make_for_gvar(gvar):
+def ll_make_for_gvar(gvar):
     box = lltype.malloc(REDBOX)
     box.isvar = True
     box.genvar = gvar
     return box
 
-def make_from_const(value):
+def ll_make_from_const(value):
     sbox = lltype.malloc(REDBOX_FOR_SIGNED) # XXX Float, Ptr
     sbox.value = lltype.cast_primitive(lltype.Signed, value)
     box = lltype.cast_pointer(REDBOX_PTR, sbox)
     box.genvar = lltype.nullptr(REDBOX.genvar.TO)
     return box
 
-def getvalue(box, T):
+def ll_getvalue(box, T):
     sbox = lltype.cast_pointer(REDBOX_FOR_SIGNED_PTR, box)
     return lltype.cast_primitive(T, sbox.value)
 
 REDBOX = lltype.GcStruct("redbox", ("genvar", rgenop.CONSTORVAR),
                                    ("isvar", lltype.Bool),
                          adtmeths = {
-    'make_for_gvar': make_for_gvar,
-    'make_from_const': make_from_const,
-    'getvalue': getvalue,
+    'll_make_for_gvar': ll_make_for_gvar,
+    'll_make_from_const': ll_make_from_const,
+    'll_getvalue': ll_getvalue,
     })
 
 REDBOX_PTR = lltype.Ptr(REDBOX)
@@ -55,7 +55,7 @@
 
 def ll_gvar_from_redbox(jitstate, box, TYPE):
     if not box.genvar:
-        value = box.getvalue(TYPE)
+        value = box.ll_getvalue(TYPE)
         box.genvar = ll_gvar_from_const(jitstate, value)
     return box.genvar
 
@@ -112,13 +112,13 @@
     RESULT = opdesc.RESULT
     opname = opdesc.name
     if not argbox.isvar: # const propagate
-        arg = argbox.getvalue(ARG0)
+        arg = argbox.ll_getvalue(ARG0)
         res = opdesc.llop(RESULT, arg)
-        return REDBOX.make_from_const(res)
+        return REDBOX.ll_make_from_const(res)
     op_args = lltype.malloc(VARLIST.TO, 1)
     op_args[0] = ll_gvar_from_redbox(jitstate, argbox, ARG0)
     gvar = rgenop.genop(jitstate.curblock, opdesc.opname, op_args, RESULT)
-    return REDBOX.make_for_gvar(gvar)
+    return REDBOX.ll_make_for_gvar(gvar)
 
 def ll_generate_operation2(opdesc, jitstate, argbox0, argbox1):
     ARG0 = opdesc.ARG0
@@ -126,27 +126,33 @@
     RESULT = opdesc.RESULT
     opname = opdesc.name
     if not argbox0.isvar and not argbox1.isvar: # const propagate
-        arg0 = argbox0.getvalue(ARG0)
-        arg1 = argbox1.getvalue(ARG1)
+        arg0 = argbox0.ll_getvalue(ARG0)
+        arg1 = argbox1.ll_getvalue(ARG1)
         res = opdesc.llop(RESULT, arg0, arg1)
-        return REDBOX.make_from_const(res)
+        return REDBOX.ll_make_from_const(res)
     op_args = lltype.malloc(VARLIST.TO, 2)
     op_args[0] = ll_gvar_from_redbox(jitstate, argbox0, ARG0)
     op_args[1] = ll_gvar_from_redbox(jitstate, argbox1, ARG1)
     gvar = rgenop.genop(jitstate.curblock, opdesc.opname, op_args, RESULT)
-    return REDBOX.make_for_gvar(gvar)
+    return REDBOX.ll_make_for_gvar(gvar)
 
 #def ll_generate_operation(jitstate, opname, args, RESULTTYPE):
 #    gvar = rgenop.genop(jitstate.curblock, opname, args, RESULTTYPE)
-#    return REDBOX.make_for_gvar(gvar)
+#    return REDBOX.ll_make_for_gvar(gvar)
 
 # ____________________________________________________________
 # other jitstate/graph level operations
 
-# XXX dummy for now
-def ll_retrieve_jitstate_for_merge(states_dic, jitstate, key, redboxes):
+
+# XXX dummy for now, playing with mix level annotation
+def retrieve_jitstate_for_merge(states_dic, jitstate, key, redboxes):
     # modifies redbox in place
+    states_dic[key] = redboxes
+    # fun playing junk
+    if not redboxes[0].isvar and redboxes[0].ll_getvalue(lltype.Signed) == 0:
+        redboxes[0] = redboxes[0]
     return jitstate # XXX
+    
 
 def ll_setup_jitstate():
     jitstate = lltype.malloc(STATE)
@@ -160,4 +166,4 @@
 
 def ll_input_redbox(jitstate, TYPE):
     genvar = rgenop.geninputarg(jitstate.curblock, TYPE)
-    return REDBOX.make_for_gvar(genvar)
+    return REDBOX.ll_make_for_gvar(genvar)

Modified: pypy/dist/pypy/jit/test/test_hint_timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/test/test_hint_timeshift.py	(original)
+++ pypy/dist/pypy/jit/test/test_hint_timeshift.py	Mon Feb 13 23:41:23 2006
@@ -62,7 +62,7 @@
             TYPE = htshift.originalconcretetype(v)
             box = rtimeshift.ll_input_redbox(jitstate, TYPE)
             if i in opt_consts: # XXX what should happen here interface wise is unclear
-                box = rtimeshift.REDBOX.make_from_const(llvalue)
+                box = rtimeshift.REDBOX.ll_make_from_const(llvalue)
             graph1args.append(box)
             residual_graph_args.append(llvalue)
     llinterp = LLInterpreter(rtyper)



More information about the Pypy-commit mailing list