[pypy-svn] r34810 - in pypy/dist/pypy/jit/timeshifter: . test
pedronis at codespeak.net
pedronis at codespeak.net
Mon Nov 20 21:13:44 CET 2006
Author: pedronis
Date: Mon Nov 20 21:13:39 2006
New Revision: 34810
Modified:
pypy/dist/pypy/jit/timeshifter/hrtyper.py
pypy/dist/pypy/jit/timeshifter/rtimeshift.py
pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py
Log:
(arigo, pedronis)
implement support for deepfrozen in the timeshifter, fix the folding of getfield and getarrayitem,
support for pointer equality ops.
=> the strange test passes (but slow..ly)
Modified: pypy/dist/pypy/jit/timeshifter/hrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/hrtyper.py (original)
+++ pypy/dist/pypy/jit/timeshifter/hrtyper.py Mon Nov 20 21:13:39 2006
@@ -460,9 +460,9 @@
del link.args[0] # Void
link.args = [v_jitstate] + link.args
- def generic_translate_operation(self, hop, force=False):
+ def generic_translate_operation(self, hop):
# detect constant-foldable all-green operations
- if not force and hop.spaceop.opname not in rtimeshift.FOLDABLE_OPS:
+ if hop.spaceop.opname not in rtimeshift.FOLDABLE_GREEN_OPS:
return None
green = True
for r_arg in hop.args_r:
@@ -526,49 +526,39 @@
ts.s_RedBox)
# non virtual case
PTRTYPE = originalconcretetype(hop.args_s[0])
- if PTRTYPE.TO._hints.get('immutable', False): # foldable if all green
- res = self.generic_translate_operation(hop, force=True)
- if res is not None:
- return res
-
v_argbox, c_fieldname = hop.inputargs(self.getredrepr(PTRTYPE),
green_void_repr)
v_argbox = hop.llops.as_ptrredbox(v_argbox)
+ c_deepfrozen = inputconst(lltype.Bool, hop.args_s[0].deepfrozen)
structdesc = rcontainer.StructTypeDesc(self.RGenOp, PTRTYPE.TO)
fielddesc = structdesc.getfielddesc(c_fieldname.value)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
v_jitstate = hop.llops.getjitstate()
return hop.llops.genmixlevelhelpercall(rtimeshift.ll_gengetfield,
- [ts.s_JITState, s_fielddesc, ts.s_PtrRedBox],
- [v_jitstate, c_fielddesc, v_argbox ],
+ [ts.s_JITState, annmodel.s_Bool, s_fielddesc, ts.s_PtrRedBox],
+ [v_jitstate , c_deepfrozen , c_fielddesc, v_argbox ],
ts.s_RedBox)
def translate_op_getarrayitem(self, hop):
PTRTYPE = originalconcretetype(hop.args_s[0])
- if PTRTYPE.TO._hints.get('immutable', False): # foldable if all green
- res = self.generic_translate_operation(hop, force=True)
- if res is not None:
- return res
-
ts = self
v_argbox, v_index = hop.inputargs(self.getredrepr(PTRTYPE),
self.getredrepr(lltype.Signed))
+ c_deepfrozen = inputconst(lltype.Bool, hop.args_s[0].deepfrozen)
fielddesc = rcontainer.ArrayFieldDesc(self.RGenOp, PTRTYPE.TO)
c_fielddesc = inputconst(lltype.Void, fielddesc)
s_fielddesc = ts.rtyper.annotator.bookkeeper.immutablevalue(fielddesc)
v_jitstate = hop.llops.getjitstate()
return hop.llops.genmixlevelhelpercall(
rtimeshift.ll_gengetarrayitem,
- [ts.s_JITState, s_fielddesc, ts.s_RedBox, ts.s_RedBox],
- [v_jitstate, c_fielddesc, v_argbox, v_index ],
+ [ts.s_JITState, annmodel.s_Bool, s_fielddesc,
+ ts.s_RedBox, ts.s_RedBox],
+ [v_jitstate, c_deepfrozen, c_fielddesc,
+ v_argbox, v_index ],
ts.s_RedBox)
def translate_op_getarraysize(self, hop):
- res = self.generic_translate_operation(hop, force=True)
- if res is not None:
- return res
-
PTRTYPE = originalconcretetype(hop.args_s[0])
ts = self
[v_argbox] = hop.inputargs(self.getredrepr(PTRTYPE))
@@ -658,11 +648,6 @@
def translate_op_getarraysubstruct(self, hop):
PTRTYPE = originalconcretetype(hop.args_s[0])
- if PTRTYPE.TO._hints.get('immutable', False): # foldable if all green
- res = self.generic_translate_operation(hop, force=True)
- if res is not None:
- return res
-
ts = self
v_argbox, v_index = hop.inputargs(self.getredrepr(PTRTYPE),
self.getredrepr(lltype.Signed))
@@ -710,20 +695,37 @@
ts = self
PTRTYPE = originalconcretetype(hop.args_s[0])
v_argbox, = hop.inputargs(self.getredrepr(PTRTYPE))
+ v_argbox = hop.llops.as_ptrredbox(v_argbox)
v_jitstate = hop.llops.getjitstate()
c_reverse = hop.inputconst(lltype.Bool, reverse)
return hop.llops.genmixlevelhelpercall(rtimeshift.ll_genptrnonzero,
- [ts.s_JITState, ts.s_RedBox, annmodel.SomeBool()],
- [v_jitstate, v_argbox, c_reverse ],
+ [ts.s_JITState, ts.s_PtrRedBox, annmodel.s_Bool],
+ [v_jitstate , v_argbox , c_reverse ],
ts.s_RedBox)
def translate_op_ptr_iszero(self, hop):
return self.translate_op_ptr_nonzero(hop, reverse=True)
+ def translate_op_ptr_eq(self, hop, reverse=False):
+ ts = self
+ PTRTYPE = originalconcretetype(hop.args_s[0])
+ r_ptr = self.getredrepr(PTRTYPE)
+ v_argbox0, v_argbox1 = hop.inputargs(r_ptr, r_ptr)
+ v_argbox0 = hop.llops.as_ptrredbox(v_argbox0)
+ v_argbox1 = hop.llops.as_ptrredbox(v_argbox1)
+ v_jitstate = hop.llops.getjitstate()
+ c_reverse = hop.inputconst(lltype.Bool, reverse)
+ return hop.llops.genmixlevelhelpercall(rtimeshift.ll_genptreq,
+ [ts.s_JITState, ts.s_PtrRedBox, ts.s_PtrRedBox, annmodel.s_Bool],
+ [v_jitstate , v_argbox0 , v_argbox1 , c_reverse ],
+ ts.s_RedBox)
- # special operations inserted by the HintGraphTransformer
+ def translate_op_ptr_ne(self, hop):
+ return self.translate_op_ptr_eq(hop, reverse=True)
+ # special operations inserted by the HintGraphTransformer
+
def translate_op_ensure_queue(self, hop, prefix=''):
mpfamily = hop.args_v[0].value
subclass = self.get_dispatch_subclass(mpfamily)
Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py Mon Nov 20 21:13:39 2006
@@ -10,6 +10,10 @@
FOLDABLE_OPS = dict.fromkeys(lloperation.enum_foldable_ops())
+FOLDABLE_GREEN_OPS = FOLDABLE_OPS.copy()
+FOLDABLE_GREEN_OPS['getfield'] = None
+FOLDABLE_GREEN_OPS['getarrayitem'] = None
+
debug_view = lloperation.llop.debug_view
debug_print = lloperation.llop.debug_print
@@ -96,8 +100,8 @@
genvar = jitstate.curbuilder.genop_malloc_varsize(alloctoken, gv_size)
return rvalue.PtrRedBox(contdesc.ptrkind, genvar)
-def ll_gengetfield(jitstate, fielddesc, argbox):
- if fielddesc.immutable and argbox.is_constant():
+def ll_gengetfield(jitstate, deepfrozen, fielddesc, argbox):
+ if (fielddesc.immutable or deepfrozen) and argbox.is_constant():
res = getattr(rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE),
fielddesc.fieldname)
return rvalue.ll_fromvalue(jitstate, res)
@@ -113,8 +117,9 @@
return rvalue.ll_fromvalue(jitstate, res)
return argbox.op_getsubstruct(jitstate, fielddesc)
-def ll_gengetarrayitem(jitstate, fielddesc, argbox, indexbox):
- if fielddesc.immutable and argbox.is_constant() and indexbox.is_constant():
+def ll_gengetarrayitem(jitstate, deepfrozen, fielddesc, argbox, indexbox):
+ if ((fielddesc.immutable or deepfrozen) and argbox.is_constant()
+ and indexbox.is_constant()):
array = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
res = array[rvalue.ll_getvalue(indexbox, lltype.Signed)]
return rvalue.ll_fromvalue(jitstate, res)
@@ -126,7 +131,7 @@
return fielddesc.redboxcls(fielddesc.kind, genvar)
def ll_gengetarraysubstruct(jitstate, fielddesc, argbox, indexbox):
- if fielddesc.immutable and argbox.is_constant() and indexbox.is_constant():
+ if argbox.is_constant() and indexbox.is_constant():
array = rvalue.ll_getvalue(argbox, fielddesc.PTRTYPE)
res = array[rvalue.ll_getvalue(indexbox, lltype.Signed)]
return rvalue.ll_fromvalue(jitstate, res)
@@ -162,7 +167,6 @@
if argbox.is_constant():
addr = rvalue.ll_getvalue(argbox, llmemory.Address)
return rvalue.ll_fromvalue(jitstate, bool(addr) ^ reverse)
- assert isinstance(argbox, rvalue.PtrRedBox)
builder = jitstate.curbuilder
if argbox.content is None:
gv_addr = argbox.getgenvar(builder)
@@ -174,6 +178,23 @@
gv_res = builder.rgenop.genconst(True ^ reverse)
return rvalue.IntRedBox(builder.rgenop.kindToken(lltype.Bool), gv_res)
+def ll_genptreq(jitstate, argbox0, argbox1, reverse):
+ builder = jitstate.curbuilder
+ if argbox0.content is not None or argbox1.content is not None:
+ equal = argbox0.content is argbox1.content
+ return rvalue.ll_fromvalue(jitstate, equal ^ reverse)
+ elif argbox0.is_constant() and argbox1.is_constant():
+ addr0 = rvalue.ll_getvalue(argbox0, llmemory.Address)
+ addr1 = rvalue.ll_getvalue(argbox1, llmemory.Address)
+ return rvalue.ll_fromvalue(jitstate, (addr0 == addr1) ^ reverse)
+ gv_addr0 = argbox0.getgenvar(builder)
+ gv_addr1 = argbox1.getgenvar(builder)
+ if reverse:
+ gv_res = builder.genop2("ptr_ne", gv_addr0, gv_addr1)
+ else:
+ gv_res = builder.genop2("ptr_eq", gv_addr0, gv_addr1)
+ return rvalue.IntRedBox(builder.rgenop.kindToken(lltype.Bool), gv_res)
+
# ____________________________________________________________
# other jitstate/graph level operations
Modified: pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py (original)
+++ pypy/dist/pypy/jit/timeshifter/test/test_timeshift.py Mon Nov 20 21:13:39 2006
@@ -1069,13 +1069,12 @@
assert res == 42
self.check_insns({})
- def test_green_tuple(self):
- py.test.skip("WIP")
+ def test_compile_time_const_tuple(self):
d = {(4, 5): 42, (6, 7): 12}
def f(a, b):
d1 = hint(d, deepfreeze=True)
return d1[a, b]
- res = self.timeshift(f, [0, 4, 5], [0, 1, 2], policy=P_NOVIRTUAL)
+ res = self.timeshift(f, [4, 5], [0, 1], policy=P_NOVIRTUAL)
assert res == 42
self.check_insns({})
More information about the Pypy-commit
mailing list