[pypy-svn] r34832 - pypy/dist/pypy/jit/timeshifter

pedronis at codespeak.net pedronis at codespeak.net
Tue Nov 21 17:18:55 CET 2006


Author: pedronis
Date: Tue Nov 21 17:18:46 2006
New Revision: 34832

Modified:
   pypy/dist/pypy/jit/timeshifter/hrtyper.py
   pypy/dist/pypy/jit/timeshifter/oop.py
   pypy/dist/pypy/jit/timeshifter/rtimeshift.py
   pypy/dist/pypy/jit/timeshifter/vdict.py
Log:
(arre, arigo, pedronis)

add support for folding at compile-time oop container ops on deep-frozen containers, enabled with .couldfold on the respective
oop_ helper. Enabled only for virtual dict getitem in this check-in.



Modified: pypy/dist/pypy/jit/timeshifter/hrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/hrtyper.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/hrtyper.py	Tue Nov 21 17:18:46 2006
@@ -1044,7 +1044,10 @@
         # Pass them as constant Nones.
         ts = self
         ll_handler = oopspecdesc.ll_handler
-        missing_args = ((ll_handler.func_code.co_argcount - 2) -
+
+        couldfold = oopspecdesc.couldfold
+        
+        missing_args = ((ll_handler.func_code.co_argcount - 2 - couldfold) -
                         len(oopspecdesc.argtuple))
         assert missing_args >= 0
         if missing_args > 0:
@@ -1054,9 +1057,17 @@
             args_v.extend([hop.llops.genconst(ll_None)] * missing_args)
 
         args_s = [ts.s_RedBox] * len(args_v)
+
         if oopspecdesc.is_method:
             args_s[0] = ts.s_PtrRedBox    # for more precise annotations
             args_v[0] = hop.llops.as_ptrredbox(args_v[0])
+
+        if couldfold:
+            args_s.insert(0, annmodel.s_Bool)
+            hs_self = hop.args_s[oopspecdesc.argtuple[0].n]
+            c_deepfrozen = inputconst(lltype.Bool, hs_self.deepfrozen)
+            args_v.insert(0, c_deepfrozen)
+        
         RESULT = originalconcretetype(hop.s_result)
         if RESULT is lltype.Void:
             s_result = annmodel.s_None

Modified: pypy/dist/pypy/jit/timeshifter/oop.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/oop.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/oop.py	Tue Nov 21 17:18:46 2006
@@ -3,6 +3,7 @@
 from pypy.jit.timeshifter.rcontainer import cachedtype
 from pypy.jit.timeshifter import rvalue, rtimeshift
 from pypy.translator.c import exceptiontransform
+from pypy.rlib.unroll import unrolling_iterable
 
 
 class Index:
@@ -13,6 +14,8 @@
 class OopSpecDesc:
     __metaclass__ = cachedtype
 
+    do_call = None
+
     def __init__(self, hrtyper, fnobj):
         ll_func = fnobj._callable
         FUNCTYPE = lltype.typeOf(fnobj)
@@ -42,15 +45,18 @@
 
         RGenOp = hrtyper.RGenOp
         self.args_gv = [None] * nb_args
-        self.gv_fnptr = RGenOp.constPrebuiltGlobal(fnobj._as_ptr())
-        self.result_kind = RGenOp.kindToken(FUNCTYPE.RESULT)
+        fnptr = fnobj._as_ptr()
+        self.gv_fnptr = RGenOp.constPrebuiltGlobal(fnptr)
+        result_kind = RGenOp.kindToken(FUNCTYPE.RESULT)
+        self.result_kind = result_kind
         if FUNCTYPE.RESULT is lltype.Void:
             self.errorbox = None
         else:
             error_value = exceptiontransform.error_value(FUNCTYPE.RESULT)
             self.errorbox = rvalue.redbox_from_prebuilt_value(RGenOp,
                                                               error_value)
-        self.redboxbuilder = rvalue.ll_redboxbuilder(FUNCTYPE.RESULT)
+        redboxbuilder = rvalue.ll_redboxbuilder(FUNCTYPE.RESULT)
+        self.redboxbuilder = redboxbuilder
         self.sigtoken = RGenOp.sigToken(FUNCTYPE)
 
         if operation_name == 'newlist':
@@ -71,6 +77,7 @@
                              None, None, [method])
         self.typedesc = vmodule.TypeDesc(hrtyper, SELFTYPE)
         self.ll_handler = getattr(vmodule, method)
+        self.couldfold = getattr(self.ll_handler, 'couldfold', False)
 
         # exception handling
         graph = fnobj.graph
@@ -78,15 +85,42 @@
         self.can_raise = etrafo.raise_analyzer.analyze_direct_call(graph)
         self.fetch_global_excdata = hrtyper.fetch_global_excdata
 
-    def residual_call(self, jitstate, argboxes):
+        if self.couldfold:
+            ARGS = FUNCTYPE.ARGS
+            argpos = unrolling_iterable(enumerate(self.argpositions))
+
+            def do_call(rgenop, argboxes):
+                args = (None,)*nb_args
+                for i, pos in argpos:
+                    if pos >= 0:
+                        T = ARGS[pos]
+                        v = rvalue.ll_getvalue(argboxes[i], T)
+                        args = args[:pos] +(v,) + args[pos+1:]
+                result = fnptr(*args)
+                if FUNCTYPE.RESULT == lltype.Void:
+                    return None
+                gv_result = rgenop.genconst(result)
+                return redboxbuilder(result_kind, gv_result)
+
+            self.do_call = do_call
+            
+    def residual_call(self, jitstate, argboxes, deepfrozen=False):
         builder = jitstate.curbuilder
         args_gv = self.args_gv[:]
         argpositions = self.argpositions
+        fold = deepfrozen
         for i in range(len(argpositions)):
             pos = argpositions[i]
             if pos >= 0:
                 gv_arg = argboxes[i].getgenvar(builder)
                 args_gv[pos] = gv_arg
+                fold &= gv_arg.is_const
+        if fold:
+            try:
+                return self.do_call(builder.rgenop, argboxes)
+            except Exception, e:
+                jitstate.residual_exception(e)
+                return self.errorbox
         gv_result = builder.genop_call(self.sigtoken, self.gv_fnptr, args_gv)
         if self.can_raise:
             self.fetch_global_excdata(jitstate)
@@ -94,11 +128,7 @@
 
     def residual_exception(self, jitstate, ExcCls):
         ll_evalue = get_ll_instance_for_exccls(ExcCls)
-        ll_etype  = ll_evalue.typeptr
-        etypebox  = rvalue.ll_fromvalue(jitstate, ll_etype)
-        evaluebox = rvalue.ll_fromvalue(jitstate, ll_evalue)
-        rtimeshift.setexctypebox (jitstate, etypebox )
-        rtimeshift.setexcvaluebox(jitstate, evaluebox)
+        jitstate.residual_ll_exception(ll_evalue)
         return self.errorbox
     residual_exception._annspecialcase_ = 'specialize:arg(2)'
 

Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py	Tue Nov 21 17:18:46 2006
@@ -828,6 +828,17 @@
         self.exc_value_box = self.exc_value_box.replace(memo)
 
 
+    def residual_ll_exception(self, ll_evalue):
+        ll_etype  = ll_evalue.typeptr
+        etypebox  = rvalue.ll_fromvalue(self, ll_etype)
+        evaluebox = rvalue.ll_fromvalue(self, ll_evalue)
+        setexctypebox (self, etypebox )
+        setexcvaluebox(self, evaluebox)
+
+    def residual_exception(self, e):
+        self.residual_ll_exception(cast_instance_to_base_ptr(e))
+        
+
 def ensure_queue(jitstate, DispatchQueueClass):
     return DispatchQueueClass()
 ensure_queue._annspecialcase_ = 'specialize:arg(1)'

Modified: pypy/dist/pypy/jit/timeshifter/vdict.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/vdict.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/vdict.py	Tue Nov 21 17:18:46 2006
@@ -242,7 +242,7 @@
     else:
         oopspecdesc.residual_call(jitstate, [selfbox, keybox, valuebox])
 
-def oop_dict_getitem(jitstate, oopspecdesc, selfbox, keybox):
+def oop_dict_getitem(jitstate, oopspecdesc, deepfrozen, selfbox, keybox):
     content = selfbox.content
     if isinstance(content, AbstractVirtualDict) and keybox.is_constant():
         try:
@@ -250,4 +250,6 @@
         except KeyError:
             return oopspecdesc.residual_exception(jitstate, KeyError)
     else:
-        return oopspecdesc.residual_call(jitstate, [selfbox, keybox])
+        return oopspecdesc.residual_call(jitstate, [selfbox, keybox],
+                                         deepfrozen=deepfrozen)
+oop_dict_getitem.couldfold = True



More information about the Pypy-commit mailing list