[pypy-svn] r33984 - in pypy/dist/pypy/jit/timeshifter: . test
arigo at codespeak.net
arigo at codespeak.net
Tue Oct 31 19:46:08 CET 2006
Author: arigo
Date: Tue Oct 31 19:46:04 2006
New Revision: 33984
Modified:
pypy/dist/pypy/jit/timeshifter/test/test_portal.py
pypy/dist/pypy/jit/timeshifter/transform.py
Log:
(pedronis, arigo)
Fix insert_merge() a bit more, probably. The dfa test passes! Cool to look at, even.
Modified: pypy/dist/pypy/jit/timeshifter/test/test_portal.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/test/test_portal.py (original)
+++ pypy/dist/pypy/jit/timeshifter/test/test_portal.py Tue Oct 31 19:46:04 2006
@@ -56,16 +56,19 @@
self._cache[key] = maingraph, readportalgraph, rtyper
self._cache_order.append(key)
+ self.readportalgraph = readportalgraph
+ self.main_args = main_args
+ self.rtyper = rtyper
llinterp = LLInterpreter(rtyper)
res = llinterp.eval_graph(maingraph, main_args)
-
- self._residual_graph = llinterp.eval_graph(readportalgraph,
- main_args)._obj.graph
-
return res
def check_insns(self, expected=None, **counts):
- self.insns = summary(self._residual_graph)
+ # XXX only works if the portal is the same as the main
+ llinterp = LLInterpreter(self.rtyper)
+ residual_graph = llinterp.eval_graph(self.readportalgraph,
+ self.main_args)._obj.graph
+ self.insns = summary(residual_graph)
if expected is not None:
assert self.insns == expected
for opname, count in counts.items():
@@ -118,7 +121,6 @@
self.check_insns(int_floordiv=1, int_mul=0)
def test_dfa_compile(self):
- py.test.skip("fails with debug_fatalerror() for some unknown reason")
from pypy.lang.automata.dfa import getautomaton, convertdfa, recognizetable
def main(gets):
a = getautomaton()
Modified: pypy/dist/pypy/jit/timeshifter/transform.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/transform.py (original)
+++ pypy/dist/pypy/jit/timeshifter/transform.py Tue Oct 31 19:46:04 2006
@@ -322,45 +322,47 @@
self.insert_merge(block, kind)
def insert_merge(self, block, kind):
- reds, greens = self.sort_by_color(block.inputargs)
+ allvars = block.inputargs[:]
+ block.inputargs[:] = [copyvar(self.hannotator, v) for v in allvars]
+ reds1, greens1 = self.sort_by_color(block.inputargs)
+ reds3, greens3 = self.sort_by_color(allvars)
nextblock = self.naive_split_block(block, 0)
+ self.genop(block, 'save_locals', reds1)
- d = {block: True, # reachable from outside
- nextblock: False}
- self.genop(block, 'save_locals', reds)
mp = self.mergepointfamily.add(kind)
c_mp = inputconst(lltype.Void, mp)
if kind == 'global':
- self.genop(block, 'save_greens', greens)
prefix = 'global_'
+
+ greens2 = [copyvar(self.hannotator, v) for v in greens1]
mergeblock = self.naive_split_block(block, len(block.operations))
- d[mergeblock] = False
+ mergeblock.inputargs[:] = greens2
+
+ self.genop(block, 'save_greens', greens1)
+ block.recloseblock(Link([self.c_dummy], self.graph.returnblock))
+
+ N = self.get_resume_point(mergeblock)
+ c_resumeindex = inputconst(lltype.Signed, N)
+ self.genop(block, 'guard_global_merge', [c_resumeindex])
else:
mergeblock = block
+ greens2 = greens1
prefix = ''
+ mergeblock.exits[0].args[:] = greens2
+ nextblock.inputargs[:] = greens3
+
v_finished_flag = self.genop(mergeblock, '%smerge_point' % (prefix,),
- [self.c_mpfamily, c_mp] + greens,
+ [self.c_mpfamily, c_mp] + greens2,
resulttype = lltype.Bool)
self.go_to_dispatcher_if(mergeblock, v_finished_flag)
restoreops = []
- mapping = {}
- for i, v in enumerate(reds):
+ for i, v in enumerate(reds3):
c = inputconst(lltype.Signed, i)
- v1 = self.genop(restoreops, 'restore_local', [c],
- result_like = v)
- mapping[v] = v1
- nextblock.renamevariables(mapping)
+ restoreops.append(SpaceOperation('restore_local', [c], v))
nextblock.operations[:0] = restoreops
- SSA_to_SSI(d, self.hannotator)
-
if kind == 'global':
- N = self.get_resume_point(mergeblock)
- c_resumeindex = inputconst(lltype.Signed, N)
- self.genop(block, 'guard_global_merge', [c_resumeindex])
- block.recloseblock(Link([self.c_dummy], self.graph.returnblock))
-
N = self.get_resume_point(nextblock)
self.mergepointfamily.resumepoint_after_mergepoint[mp] = N
More information about the Pypy-commit
mailing list