[pypy-svn] r79746 - in pypy/branch/out-of-line-guards/pypy/jit/metainterp: . test

fijal at codespeak.net fijal at codespeak.net
Thu Dec 2 14:12:55 CET 2010


Author: fijal
Date: Thu Dec  2 14:12:52 2010
New Revision: 79746

Modified:
   pypy/branch/out-of-line-guards/pypy/jit/metainterp/test/test_warmspot.py
   pypy/branch/out-of-line-guards/pypy/jit/metainterp/warmspot.py
Log:
Rewrite jit_invariant_setfield. Right now it simply vanishes


Modified: pypy/branch/out-of-line-guards/pypy/jit/metainterp/test/test_warmspot.py
==============================================================================
--- pypy/branch/out-of-line-guards/pypy/jit/metainterp/test/test_warmspot.py	(original)
+++ pypy/branch/out-of-line-guards/pypy/jit/metainterp/test/test_warmspot.py	Thu Dec  2 14:12:52 2010
@@ -2,9 +2,11 @@
 from pypy.jit.metainterp.warmspot import ll_meta_interp
 from pypy.jit.metainterp.warmspot import get_stats
 from pypy.rlib.jit import JitDriver, OPTIMIZER_FULL, OPTIMIZER_SIMPLE
-from pypy.rlib.jit import unroll_safe
+from pypy.rlib.jit import unroll_safe, dont_look_inside
 from pypy.jit.backend.llgraph import runner
 from pypy.jit.metainterp.history import BoxInt
+from pypy.jit.codewriter.support import annotate
+from pypy.jit.metainterp.warmspot import WarmRunnerDesc
 
 from pypy.jit.metainterp.test.test_basic import LLJitMixin, OOJitMixin
 
@@ -359,7 +361,6 @@
         self.check_loops({'int_sub': 1, 'int_gt': 1, 'guard_true': 1,
                           'jump': 1})
 
-
 class TestLLWarmspot(WarmspotTests, LLJitMixin):
     CPUClass = runner.LLtypeCPU
     type_system = 'lltype'
@@ -371,8 +372,6 @@
 class TestWarmspotDirect(object):
     def setup_class(cls):
         from pypy.jit.metainterp.typesystem import llhelper
-        from pypy.jit.codewriter.support import annotate
-        from pypy.jit.metainterp.warmspot import WarmRunnerDesc
         from pypy.rpython.lltypesystem.rclass import OBJECT, OBJECT_VTABLE
         from pypy.rpython.lltypesystem import lltype, llmemory
         exc_vtable = lltype.malloc(OBJECT_VTABLE, immortal=True)
@@ -437,6 +436,7 @@
 
         rtyper = annotate(f, [0])
         FakeCPU.rtyper = rtyper
+        cls.FakeCPU = FakeCPU
         translator = rtyper.annotator.translator
         translator.config.translation.gc = 'hybrid'
         cls.desc = WarmRunnerDesc(translator, CPUClass=FakeCPU)
@@ -454,3 +454,37 @@
             assert lle[0] == self.exc_vtable
         else:
             py.test.fail("DID NOT RAISE")
+
+    def test_rewrite_invariant_setfield(self):
+        from pypy.jit.metainterp.warmspot import find_jit_invariant_setfield
+        
+        class A(object):
+            _jit_invariant_fields_ = ['x']
+
+        @dont_look_inside
+        def g(a):
+            a.x = 3
+
+        a = A()
+
+        driver = JitDriver(reds = ['i', 'a'], greens = [])
+        
+        def f():
+            i = 0
+            a = A()
+            g(a)
+            while i < 10:
+                driver.can_enter_jit(i=i, a=a)
+                driver.jit_merge_point(i=i, a=a)
+                i += 1
+            return i
+                
+            g(a)
+            return a.x
+
+        rtyper = annotate(f, [])
+        self.FakeCPU.rtyper = rtyper
+        translator = rtyper.annotator.translator
+        translator.config.translation.gc = 'hybrid'
+        desc = WarmRunnerDesc(translator, CPUClass=self.FakeCPU)
+        assert not find_jit_invariant_setfield(translator.graphs)

Modified: pypy/branch/out-of-line-guards/pypy/jit/metainterp/warmspot.py
==============================================================================
--- pypy/branch/out-of-line-guards/pypy/jit/metainterp/warmspot.py	(original)
+++ pypy/branch/out-of-line-guards/pypy/jit/metainterp/warmspot.py	Thu Dec  2 14:12:52 2010
@@ -114,6 +114,16 @@
                     results.append((graph, block, i))
     return results
 
+def find_jit_invariant_setfield(graphs):
+    results = []
+    for graph in graphs:
+        for block in graph.iterblocks():
+            for i in range(len(block.operations)):
+                op = block.operations[i]
+                if op.opname == 'jit_invariant_setfield':
+                    results.append((graph, block, i))
+    return results
+
 def find_can_enter_jit(graphs):
     return _find_jit_marker(graphs, 'can_enter_jit')
 
@@ -181,6 +191,7 @@
         self.rewrite_can_enter_jits()
         self.rewrite_set_param()
         self.rewrite_force_virtual(vrefinfo)
+        self.rewrite_jit_invariant_setfield()
         self.add_finish()
         self.metainterp_sd.finish_setup(self.codewriter, optimizer=optimizer)
 
@@ -802,6 +813,11 @@
             op.opname = 'direct_call'
             op.args[:3] = [closures[key]]
 
+    def rewrite_jit_invariant_setfield(self):
+        graphs = self.translator.graphs
+        for graph, block, i in find_jit_invariant_setfield(graphs):
+            del block.operations[i] # for now
+
     def rewrite_force_virtual(self, vrefinfo):
         if self.cpu.ts.name != 'lltype':
             py.test.skip("rewrite_force_virtual: port it to ootype")



More information about the Pypy-commit mailing list