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

pedronis at codespeak.net pedronis at codespeak.net
Thu Dec 28 14:59:19 CET 2006


Author: pedronis
Date: Thu Dec 28 14:59:16 2006
New Revision: 36021

Modified:
   pypy/dist/pypy/jit/timeshifter/transform.py
Log:
use a subclass of GraphAnalyzer (which does caching) to distinguish green/yellow calls.
special case 'debug_assert' to be ignored.




Modified: pypy/dist/pypy/jit/timeshifter/transform.py
==============================================================================
--- pypy/dist/pypy/jit/timeshifter/transform.py	(original)
+++ pypy/dist/pypy/jit/timeshifter/transform.py	Thu Dec 28 14:59:16 2006
@@ -3,15 +3,30 @@
 from pypy.annotation        import model as annmodel
 from pypy.jit.hintannotator import model as hintmodel
 from pypy.jit.hintannotator.model import originalconcretetype
-from pypy.rpython.lltypesystem import lltype, llmemory
+from pypy.rpython.lltypesystem import lltype, llmemory, lloperation
 from pypy.rpython.rmodel import inputconst
 from pypy.translator.unsimplify import varoftype, copyvar
 from pypy.translator.unsimplify import split_block, split_block_at_start
-from pypy.translator.simplify import rec_op_has_side_effects
+#from pypy.translator.simplify import rec_op_has_side_effects
+from pypy.translator.backendopt import graphanalyze
 from pypy.translator.backendopt.ssa import SSA_to_SSI
 from pypy.translator.unsimplify import split_block
 
 
+class HasSideeffects(graphanalyze.GraphAnalyzer):
+
+    EXCEPTIONS = ('debug_assert',)
+
+    def analyze_exceptblock(self, block, seen=None):
+        # graphs explicitly raising have side-effects
+        return True
+
+    def operation_is_true(self, op):
+        opname = op.opname
+        return (lloperation.LL_OPERATIONS[opname].sideeffects and
+                opname not in self.EXCEPTIONS)
+
+
 class MergePointFamily(object):
     def __init__(self, tsgraph):
         self.tsgraph = tsgraph
@@ -48,6 +63,12 @@
         self.c_mpfamily = inputconst(lltype.Void, self.mergepointfamily)
         self.tsgraphs_seen = []
 
+        t = self.hannotator.base_translator
+        self.sideeffects_analyzer = HasSideeffects(t)
+
+    def has_sideeffects(self, op):
+        return self.sideeffects_analyzer.analyze(op)
+
     def transform(self):
         self.compute_merge_points()
         self.insert_save_return()
@@ -475,8 +496,7 @@
             if hs_res.is_green():
                 # all-green arguments and result.
                 # Does the function have side-effects?
-                t = self.hannotator.base_translator
-                if not rec_op_has_side_effects(t, spaceop):
+                if not self.has_sideeffects(spaceop):
                     return 'green'
         colors = {}
         for graph, tsgraph in self.graphs_from(spaceop):



More information about the Pypy-commit mailing list