[pypy-svn] r23418 - pypy/dist/pypy/jit
ac at codespeak.net
ac at codespeak.net
Thu Feb 16 17:04:33 CET 2006
Author: ac
Date: Thu Feb 16 17:04:32 2006
New Revision: 23418
Modified:
pypy/dist/pypy/jit/hinttimeshift.py
pypy/dist/pypy/jit/rtimeshift.py
Log:
(arre, pedronis) Slight advancement on merging.
Modified: pypy/dist/pypy/jit/hinttimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/hinttimeshift.py (original)
+++ pypy/dist/pypy/jit/hinttimeshift.py Thu Feb 16 17:04:32 2006
@@ -4,7 +4,7 @@
from pypy.annotation import listdef, dictdef
from pypy.jit.rtimeshift import STATE_PTR, REDBOX_PTR, VARLIST
from pypy.jit.rtimeshift import make_types_const
-from pypy.rpython import rmodel, rtuple, rlist, rdict
+from pypy.rpython import rmodel, rtuple, rlist, rdict, rgenop
from pypy.jit import rtimeshift
from pypy.jit.hintrtyper import HintRTyper, s_JITState, originalconcretetype
from pypy.jit.hintrtyper import GreenRepr, RedRepr, HintLowLevelOpList
@@ -196,10 +196,11 @@
s_key_tuple = annmodel.SomeTuple(items_s)
-
+ s_dict_value = annmodel.SomeTuple([s_box_list,
+ annmodel.SomePtr(rgenop.BLOCK)])
s_state_dic = annmodel.SomeDict(dictdef.DictDef(None,
s_key_tuple,
- s_box_list # XXX
+ s_dict_value
))
r_key = getrepr(s_key_tuple)
Modified: pypy/dist/pypy/jit/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/rtimeshift.py (original)
+++ pypy/dist/pypy/jit/rtimeshift.py Thu Feb 16 17:04:32 2006
@@ -162,7 +162,51 @@
# XXX dummy for now, no appropriate caching, just call enter_block
def retrieve_jitstate_for_merge(states_dic, jitstate, key, redboxes, TYPES):
- return enter_block(jitstate, redboxes, TYPES)
+ if key not in states_dic:
+ jitstate = enter_block(jitstate, redboxes, TYPES)
+ states_dic[key] = redboxes[:], jitstate.curblock
+ return jitstate
+
+ oldboxes, oldblock = states_dic[key]
+ incoming = []
+ for i in range(len(redboxes)):
+ oldbox = oldboxes[i]
+ newbox = redboxes[i]
+ if oldbox.isvar: # Allways a match
+ # incoming.append(ll_gvar_from_redbox(jitstate, newbox, TYPES[i]))
+ # XXX: Cheat with Signed for now
+ incoming.append(ll_gvar_from_redbox(jitstate, newbox, lltype.Signed))
+ continue
+ if (not newbox.isvar and ll_getvalue(oldbox, lltype.Signed) ==
+ ll_getvalue(newbox, lltype.Signed)):
+ continue
+ # Missmatch. Generalize to a var
+ else:
+ rgenop.closelink(jitstate.curoutgoinglink, incoming, oldblock)
+ return lltype.nullptr(STATE)
+
+ # Make a more general block
+ newblock = rgenop.newblock()
+ incoming = []
+ for i in range(len(redboxes)):
+ oldbox = oldboxes[i]
+ newbox = redboxes[i]
+ if (newbox.isvar or oldbox.isvar or
+ ll_getvalue(oldbox, lltype.Signed) !=
+ ll_getvalue(newbox, lltype.Signed)):
+ # incoming.append(ll_gvar_from_redbox(jitstate, newbox, TYPES[i]))
+ # XXX: Cheat with Signed for now
+ incoming.append(ll_gvar_from_redbox(jitstate, newbox, lltype.Signed))
+ newgenvar = rgenop.geninputarg(newblock, TYPES[i])
+ redboxes[i] = REDBOX.ll_make_for_gvar(newgenvar)
+
+ rgenop.closelink(jitstate.curoutgoinglink, incoming, newblock)
+ jitstate.curblock = newblock
+ jitstate.curoutgoinglink = lltype.nullptr(rgenop.LINK.TO)
+ states_dic[key] = redboxes[:], newblock
+ return jitstate
+
+
retrieve_jitstate_for_merge._annspecialcase_ = "specialize:arglltype(2)"
def enter_block(jitstate, redboxes, TYPES):
More information about the Pypy-commit
mailing list