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

pedronis at codespeak.net pedronis at codespeak.net
Mon Jul 3 08:02:07 CEST 2006


Author: pedronis
Date: Mon Jul  3 08:02:04 2006
New Revision: 29602

Modified:
   pypy/dist/pypy/jit/timeshifter/rtimeshift.py
   pypy/dist/pypy/jit/timeshifter/timeshift.py
Log:
(arre, pedronis)

fix some of the refactoring breakage

TODO:  we need to be more careful with the return block
there are possibly  multiple less general blocks that need to be closed into a real return block.
See degenerated_before_return for an example of this!



Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py	Mon Jul  3 08:02:04 2006
@@ -252,11 +252,13 @@
         return exitindex
     return -1
 
-def prepare_return(cache, gv_return_type):
+def save_return(jitstate, redboxes):
+    jitstate.returnbox = redboxes[0]
+
+def prepare_return(jitstate, cache, gv_return_type):
     frozens, block = cache[()]
     builder = ResidualGraphBuilder(block)
-    memo = rvalue.unfreeze_memo()
-    builder.valuebox = frozens[0].unfreeze(memo, block, gv_return_type)
+    builder.valuebox = jitstate.returnbox
     return builder
 
 def ll_gvar_from_redbox(jitstate, redbox):

Modified: pypy/dist/pypy/jit/timeshifter/timeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/timeshift.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/timeshift.py	Mon Jul  3 08:02:04 2006
@@ -322,7 +322,8 @@
         cache = enter_block_logic(args_r, newinputargs,
                                   before_block,
                                   llops,
-                                  v_boxes)
+                                  v_boxes,
+                                  is_returnblock)
         if is_returnblock:
             assert self.return_cache is None
             self.return_cache = cache
@@ -335,7 +336,7 @@
         return v_boxes
 
     def bookkeeping_enter_simple(self, args_r, newinputargs, before_block,
-                                 llops, v_boxes):
+                                 llops, v_boxes, is_returnblock=False):
         v_newjitstate = llops.genmixlevelhelpercall(rtimeshift.enter_block,
                              [self.s_JITState, self.s_box_list],
                              [newinputargs[0], v_boxes],
@@ -358,7 +359,7 @@
     # mapping green values combinations to frozen states for red boxes values
     # and generated blocks
     def bookkeeping_enter_for_join(self, args_r, newinputargs, before_block,
-                                   llops, v_boxes):
+                                   llops, v_boxes, is_returnblock):
         getrepr = self.rtyper.getrepr        
         items_s = []
         key_v = []
@@ -401,7 +402,7 @@
         v_boxes2 = flowmodel.Variable(v_boxes)
         v_boxes2.concretetype = self.r_box_list.lowleveltype
 
-
+        
         
         read_boxes_block_vars = [v_newjitstate2, v_boxes2]
         for greenvar in orig_key_v:
@@ -412,6 +413,8 @@
         read_boxes_block = flowmodel.Block(read_boxes_block_vars)
         to_read_boxes_block = flowmodel.Link([v_newjitstate, v_boxes] + orig_key_v, read_boxes_block)
         to_read_boxes_block.exitcase = to_read_boxes_block.llexitcase = True
+
+
         to_dispatch_block = flowmodel.Link([v_oldjitstate], self.dispatchblock)
         to_dispatch_block.exitcase = to_dispatch_block.llexitcase = False
         
@@ -423,16 +426,24 @@
         llops = HintLowLevelOpList(self, None)
 
         newinputargs2 = [v_newjitstate2]
-        i = 0
-        j = 0
-        for r in args_r[1:]:
-            if isinstance(r, RedRepr):
-                newinputargs2.append(self.read_out_box(llops, v_boxes2, i))
-                i += 1
-            else:
-                newinputargs2.append(read_boxes_block_vars[j+2])
-                j += 1
-
+        if not is_returnblock:
+            i = 0
+            j = 0
+            for r in args_r[1:]:
+                if isinstance(r, RedRepr):
+                    newinputargs2.append(self.read_out_box(llops, v_boxes2, i))
+                    i += 1
+                else:
+                    newinputargs2.append(read_boxes_block_vars[j+2])
+                    j += 1
+        else:
+            # xxx reorganize
+            llops.genmixlevelhelpercall(rtimeshift.save_return,
+                                        [self.s_JITState, self.s_box_list],
+                                        [v_newjitstate2, v_boxes2],
+                                        annmodel.s_None)
+            target = self.dispatchblock
+            
         read_boxes_block.operations[:] = llops
 
         to_target = flowmodel.Link(newinputargs2, target)
@@ -499,10 +510,6 @@
 
         llops = HintLowLevelOpList(self, None)
         if len(newblock.exits) == 0: # this is the original returnblock
-            llops.genmixlevelhelpercall(rtimeshift.save_return,
-                                        [...],
-                                        [...],
-                                        ...)
             newblock.recloseblock(flowmodel.Link(newblock.inputargs, self.dispatchblock))
         elif len(newblock.exits) == 1 or isinstance(self.hrtyper.bindingrepr(oldexitswitch), GreenRepr):
             newblock.exitswitch = rename(oldexitswitch)
@@ -571,8 +578,10 @@
         dispatchblock.operations = list(llops)
 
         dispatch_to = self.dispatch_to
-        prepare_return_block = flowmodel.Block([])
-        prepare_return_link = flowmodel.Link([], prepare_return_block)
+        v_jitstate2 = flowmodel.Variable('jitstate')
+        v_jitstate2.concretetype = self.r_JITState.lowleveltype
+        prepare_return_block = flowmodel.Block([v_jitstate2])
+        prepare_return_link = flowmodel.Link([v_jitstate], prepare_return_block)
         dispatch_to.append(('default', prepare_return_link))
 
         if len(dispatch_to) == 1:
@@ -593,12 +602,13 @@
         return_cache = self.return_cache
         assert return_cache is not None
         RETURN_TYPE = self.r_returnvalue.original_concretetype
-        def prepare_return():
-            return rtimeshift.prepare_return(return_cache,
+        def prepare_return(jitstate):
+            return rtimeshift.prepare_return(jitstate, return_cache,
                                              rgenop.constTYPE(RETURN_TYPE))
         llops = HintLowLevelOpList(self, None)
         v_return_builder = llops.genmixlevelhelpercall(prepare_return,
-                          [], [], self.s_ResidualGraphBuilder)
+                          [self.s_JITState], [v_jitstate2],
+                          self.s_ResidualGraphBuilder)
 
         prepare_return_block.operations = list(llops)
         finishedlink = flowmodel.Link([v_return_builder], returnblock)



More information about the Pypy-commit mailing list