[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