[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