[pypy-svn] r36365 - in pypy/dist/pypy/jit/timeshifter: . test

pedronis at codespeak.net pedronis at codespeak.net
Tue Jan 9 16:09:53 CET 2007


Author: pedronis
Date: Tue Jan  9 16:09:50 2007
New Revision: 36365

Modified:
   pypy/dist/pypy/jit/timeshifter/hrtyper.py
   pypy/dist/pypy/jit/timeshifter/rcontainer.py
   pypy/dist/pypy/jit/timeshifter/rtimeshift.py
   pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
Log:
(arre, pedronis)

let the effect on the virtualizable struct be stored back such that they can be seen outside the jitted world.



Modified: pypy/dist/pypy/jit/timeshifter/hrtyper.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/hrtyper.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/hrtyper.py	Tue Jan  9 16:09:50 2007
@@ -290,6 +290,7 @@
                 builder, gv_generated, inputargs_gv = rgenop.newgraph(sigtoken,
                                                              "generated")
                 cache[key] = gv_generated
+                top_jitstate = fresh_jitstate(builder)
                 i = 0
                 for color, _, make_arg_redbox in args_specification:
                     if color == "green":
@@ -299,15 +300,14 @@
                     else:
                         llvalue = args[0]
                         args = args[1:]
-                        box = make_arg_redbox(inputargs_gv, i)
+                        box = make_arg_redbox(top_jitstate, inputargs_gv, i)
                         i += make_arg_redbox.consumes                        
                         portal_ts_args += (box,)
 
-                top_jitstate = fresh_jitstate(builder)
                 top_jitstate = portal_fn(top_jitstate, *portal_ts_args)
                 if top_jitstate is not None:
                     finish_jitstate(top_jitstate, sigtoken)
-
+                    
                 builder.end()
                 builder.show_incremental_progress()
             fn = gv_generated.revealconst(lltype.Ptr(FUNC))
@@ -1459,7 +1459,7 @@
         kind = self.hrtyper.RGenOp.kindToken(TYPE)
         boxcls = rvalue.ll_redboxcls(TYPE)
         
-        def make_arg_redbox(inputargs_gv, i):
+        def make_arg_redbox(jitstate, inputargs_gv, i):
             gv_arg = inputargs_gv[i]
             box = boxcls(kind, gv_arg)
             return box
@@ -1515,8 +1515,9 @@
 
         typedesc = self.gettypedesc()
         
-        def make_arg_redbox(inputargs_gv, i):
+        def make_arg_redbox(jitstate, inputargs_gv, i):
             box = typedesc.factory()
+            jitstate.add_virtualizable(box)
             j = 1
             content = box.content
             assert isinstance(content, rcontainer.VirtualStruct)

Modified: pypy/dist/pypy/jit/timeshifter/rcontainer.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rcontainer.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rcontainer.py	Tue Jan  9 16:09:50 2007
@@ -328,6 +328,14 @@
     def force_runtime_container(self, builder):
         assert 0, "not implemented for now"
 
+    def store_back(self, builder):
+        fielddescs = self.typedesc.fielddescs
+        boxes = self.content_boxes
+        gv_outside = boxes[-1].genvar
+        for i in range(1, len(fielddescs)):
+            fielddesc = fielddescs[i]
+            box = boxes[i]
+            fielddesc.generate_set(builder, gv_outside, box)
 
 # ____________________________________________________________
 

Modified: pypy/dist/pypy/jit/timeshifter/rtimeshift.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/rtimeshift.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/rtimeshift.py	Tue Jan  9 16:09:50 2007
@@ -240,6 +240,8 @@
 
 def retrieve_jitstate_for_merge(states_dic, jitstate, key, global_resumer,
                                 force_merge=False):
+    if jitstate.virtualizables:
+        jitstate.enter_block_sweep_virtualizables()
     if key not in states_dic:
         states_dic[key] = []
         start_new_block(states_dic, jitstate, key, global_resumer)
@@ -324,8 +326,8 @@
             node = resuming.path.pop()
             assert isinstance(node, PromotionPathSplit)
             return node.answer
-        locals_gv = jitstate.get_locals_gv()
-        later_builder = jitstate.curbuilder.jump_if_false(exitgvar, locals_gv)
+        false_gv = jitstate.get_locals_gv() # alive gvs on the false path
+        later_builder = jitstate.curbuilder.jump_if_false(exitgvar, false_gv)
         jitstate2 = jitstate.split(later_builder, resumepoint, list(greens_gv))
         if resuming is None:
             node = jitstate.promotion_path
@@ -623,9 +625,7 @@
     if gv_switchvar.is_const:
         return False
     else:
-        incoming = []
-        memo = rvalue.enter_block_memo()
-        jitstate.enter_block(incoming, memo)
+        incoming = jitstate.enter_block_sweep_virtualizables()
         switchblock = enter_next_block(jitstate, incoming)
         gv_switchvar = promotebox.genvar
         incoming_gv = [box.genvar for box in incoming]
@@ -748,6 +748,7 @@
     #fz_frame = ...           set by freeze()
     #fz_exc_type_box = ...    set by freeze()
     #fz_exc_value_box = ...   set by freeze()
+    #fz_virtualizables = ...  set by freeze()
 
     def exactmatch(self, jitstate, outgoingvarboxes, memo):
         fullmatch = True
@@ -769,7 +770,13 @@
         frame         = self.fz_frame        .unfreeze(incomingvarboxes, memo)
         exc_type_box  = self.fz_exc_type_box .unfreeze(incomingvarboxes, memo)
         exc_value_box = self.fz_exc_value_box.unfreeze(incomingvarboxes, memo)
-        return JITState(None, frame, exc_type_box, exc_value_box)
+        virtualizables = {}
+        for fz_virtualizable_box in self.fz_virtualizables:
+            virtualizable_box = fz_virtualizable_box.unfreeze(incomingvarboxes,
+                                                              memo)
+            virtualizables[virtualizable_box] = None
+        return JITState(None, frame, exc_type_box, exc_value_box,
+                        virtualizables=virtualizables)
 
 
 class VirtualFrame(object):
@@ -816,7 +823,8 @@
     promotion_path = None
 
     def __init__(self, builder, frame, exc_type_box, exc_value_box,
-                 resumepoint=-1, newgreens=[], resuming=None):
+                 resumepoint=-1, newgreens=[], resuming=None,
+                 virtualizables=None):
         self.curbuilder = builder
         self.frame = frame
         self.exc_type_box = exc_type_box
@@ -824,45 +832,80 @@
         self.resumepoint = resumepoint
         self.greens = newgreens
         self.resuming = resuming   # None or a ResumingInfo
+        if virtualizables is None:
+            virtualizables = {}
+        self.virtualizables = virtualizables
+
+    def add_virtualizable(self, virtualizable_box):
+        self.virtualizables[virtualizable_box] = None
 
     def split(self, newbuilder, newresumepoint, newgreens):
         memo = rvalue.copy_memo()
+        virtualizables = {}
+        for virtualizable_box in self.virtualizables:
+            virtualizables[virtualizable_box.copy(memo)] = None
         later_jitstate = JITState(newbuilder,
                                   self.frame.copy(memo),
                                   self.exc_type_box .copy(memo),
                                   self.exc_value_box.copy(memo),
                                   newresumepoint,
                                   newgreens,
-                                  self.resuming)
+                                  self.resuming,
+                                  virtualizables)
         # add the later_jitstate to the chain of pending-for-dispatch_next()
         dispatchqueue = self.frame.dispatchqueue
         later_jitstate.next = dispatchqueue.split_chain
         dispatchqueue.split_chain = later_jitstate
         return later_jitstate
 
-    def enter_block(self, incoming, memo):
+    def _enter_block(self, incoming, memo):
         self.frame.enter_block(incoming, memo)
         self.exc_type_box .enter_block(incoming, memo)
         self.exc_value_box.enter_block(incoming, memo)
 
+    def enter_block_sweep_virtualizables(self):
+        incoming = []
+        memo = rvalue.enter_block_memo()
+        self._enter_block(incoming, memo)
+        virtualizables = self.virtualizables
+        builder = self.curbuilder
+        for virtualizable_box in virtualizables.keys():
+            if virtualizable_box.content not in memo.containers:
+                del virtualizables[virtualizable_box]
+                assert isinstance(virtualizable_box, rvalue.PtrRedBox)
+                content = virtualizable_box.content
+                assert isinstance(content, rcontainer.VirtualizableStruct)
+                content.store_back(builder)
+        return incoming
+
     def freeze(self, memo):
         result = FrozenJITState()
         result.fz_frame = self.frame.freeze(memo)
         result.fz_exc_type_box  = self.exc_type_box .freeze(memo)
         result.fz_exc_value_box = self.exc_value_box.freeze(memo)
+        fz_virtualizables = result.fz_virtualizables = {}
+        for virtualizable_box in self.virtualizables:
+            assert virtualizable_box in memo.boxes
+            fz_virtualizables[virtualizable_box.freeze(memo)] = None
         return result
 
     def replace(self, memo):
         self.frame.replace(memo)
         self.exc_type_box  = self.exc_type_box .replace(memo)
         self.exc_value_box = self.exc_value_box.replace(memo)
-
-    def get_locals_gv(self):
+        virtualizables = {}
+        for virtualizable_box in self.virtualizables:
+            virtualizables[virtualizable_box.replace(memo)] = None
+        self.virtualizables = virtualizables
+            
+    def get_locals_gv(self): # xxx
         # get all the genvars that are "alive", i.e. stored in the JITState
         # or the VirtualFrames
         incoming = []
         memo = rvalue.enter_block_memo()
-        self.enter_block(incoming, memo)
+        self._enter_block(incoming, memo)
+        for virtualizable_box in self.virtualizables:
+            virtualizable_box.enter_block(incoming, memo)
         locals_gv = [redbox.genvar for redbox in incoming]
         return locals_gv
 

Modified: pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/test/test_virtualizable.py	Tue Jan  9 16:09:50 2007
@@ -83,7 +83,43 @@
 
         res = self.timeshift_from_portal(main, f, [20, 22], policy=P_NOVIRTUAL)
         assert res == 21
-        self.check_insns(getfield=0, setfield=0)
+        self.check_insns(getfield=0)
+        residual_graph = self.get_residual_graph()
+        assert len(residual_graph.startblock.inputargs) == 3
+        assert ([v.concretetype for v in residual_graph.startblock.inputargs] ==
+                [lltype.Ptr(XY), lltype.Signed, lltype.Signed])
+
+    def test_explicit_set_effect(self):
+   
+        def f(xy):
+            xy_access = xy.access
+            if xy_access:
+                x = xy_access.get_x(xy)
+            else:
+                x = xy.x
+            xy_access = xy.access
+            if xy_access:
+                xy_access.set_y(xy, 1)
+            else:
+                xy.y = 3
+            xy_access = xy.access
+            if xy_access:
+                y = xy_access.get_y(xy)
+            else:
+                y = xy.y
+            return x+y
+
+        def main(x, y):
+            xy = lltype.malloc(XY)
+            xy.access = lltype.nullptr(XY_ACCESS)
+            xy.x = x
+            xy.y = y
+            v = f(xy)
+            return v + xy.y
+
+        res = self.timeshift_from_portal(main, f, [20, 22], policy=P_NOVIRTUAL)
+        assert res == 26
+        self.check_insns(getfield=0)
         residual_graph = self.get_residual_graph()
         assert len(residual_graph.startblock.inputargs) == 3
         assert ([v.concretetype for v in residual_graph.startblock.inputargs] ==



More information about the Pypy-commit mailing list