[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