[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