[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