[pypy-svn] r69709 - in pypy/branch/virtual-forcing/pypy/jit/metainterp: . test
arigo at codespeak.net
arigo at codespeak.net
Fri Nov 27 17:40:33 CET 2009
Author: arigo
Date: Fri Nov 27 17:40:33 2009
New Revision: 69709
Modified:
pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py
pypy/branch/virtual-forcing/pypy/jit/metainterp/effectinfo.py
pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_codewriter.py
Log:
(pedronis, arigo)
Store in the EffectInfo attached to calldescrs a flag that tells us if
the residual call can possibly access a virtualizable's virtualized
fields.
Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/codewriter.py Fri Nov 27 17:40:33 2009
@@ -14,6 +14,7 @@
from pypy.translator.backendopt.writeanalyze import WriteAnalyzer
from pypy.jit.metainterp.typesystem import deref, arrayItem, fieldType
from pypy.jit.metainterp.effectinfo import effectinfo_from_writeanalyze
+from pypy.jit.metainterp.effectinfo import VirtualizableAnalyzer
import py, sys
from pypy.tool.ansi_print import ansi_log
@@ -182,8 +183,10 @@
self.metainterp_sd = metainterp_sd
self.cpu = metainterp_sd.cpu
self.portal_runner_ptr = portal_runner_ptr
- self.raise_analyzer = RaiseAnalyzer(self.rtyper.annotator.translator)
- self.write_analyzer = WriteAnalyzer(self.rtyper.annotator.translator)
+ translator = self.rtyper.annotator.translator
+ self.raise_analyzer = RaiseAnalyzer(translator)
+ self.write_analyzer = WriteAnalyzer(translator)
+ self.virtualizable_analyzer = VirtualizableAnalyzer(translator)
def make_portal_bytecode(self, graph):
log.info("making JitCodes...")
@@ -323,7 +326,9 @@
# ok
if consider_effects_of is not None:
effectinfo = effectinfo_from_writeanalyze(
- self.write_analyzer.analyze(consider_effects_of), self.cpu)
+ self.write_analyzer.analyze(consider_effects_of),
+ self.cpu,
+ self.virtualizable_analyzer.analyze(consider_effects_of))
calldescr = self.cpu.calldescrof(FUNC, tuple(NON_VOID_ARGS), RESULT, effectinfo)
else:
calldescr = self.cpu.calldescrof(FUNC, tuple(NON_VOID_ARGS), RESULT)
Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/effectinfo.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/effectinfo.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/effectinfo.py Fri Nov 27 17:40:33 2009
@@ -2,21 +2,25 @@
from pypy.rpython.lltypesystem.rclass import OBJECT
from pypy.rpython.lltypesystem import lltype
from pypy.rpython.ootypesystem import ootype
+from pypy.translator.backendopt.graphanalyze import BoolGraphAnalyzer
class EffectInfo(object):
_cache = {}
- def __new__(cls, write_descrs_fields, write_descrs_arrays):
- key = frozenset(write_descrs_fields), frozenset(write_descrs_arrays)
+ def __new__(cls, write_descrs_fields, write_descrs_arrays,
+ promotes_virtualizables):
+ key = (frozenset(write_descrs_fields), frozenset(write_descrs_arrays),
+ promotes_virtualizables)
if key in cls._cache:
return cls._cache[key]
result = object.__new__(cls)
result.write_descrs_fields = write_descrs_fields
result.write_descrs_arrays = write_descrs_arrays
+ result.promotes_virtualizables = promotes_virtualizables
cls._cache[key] = result
return result
-def effectinfo_from_writeanalyze(effects, cpu):
+def effectinfo_from_writeanalyze(effects, cpu, promotes_virtualizables=False):
from pypy.translator.backendopt.writeanalyze import top_set
if effects is top_set:
return None
@@ -39,7 +43,8 @@
write_descrs_arrays.append(descr)
else:
assert 0
- return EffectInfo(write_descrs_fields, write_descrs_arrays)
+ return EffectInfo(write_descrs_fields, write_descrs_arrays,
+ promotes_virtualizables)
def consider_struct(TYPE, fieldname):
if fieldType(TYPE, fieldname) is lltype.Void:
@@ -55,7 +60,6 @@
return False
return True
-
def consider_array(ARRAY):
if arrayItem(ARRAY) is lltype.Void:
return False
@@ -64,3 +68,9 @@
if not isinstance(ARRAY, lltype.GcArray): # can be a non-GC-array
return False
return True
+
+# ____________________________________________________________
+
+class VirtualizableAnalyzer(BoolGraphAnalyzer):
+ def analyze_simple_operation(self, op):
+ return op.opname == 'promote_virtualizable'
Modified: pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_codewriter.py
==============================================================================
--- pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_codewriter.py (original)
+++ pypy/branch/virtual-forcing/pypy/jit/metainterp/test/test_codewriter.py Fri Nov 27 17:40:33 2009
@@ -121,8 +121,8 @@
supports_floats = False
def fielddescrof(self, STRUCT, fieldname):
return ('fielddescr', STRUCT, fieldname)
- def calldescrof(self, FUNC, NON_VOID_ARGS, RESULT, stuff=None):
- return ('calldescr', FUNC, NON_VOID_ARGS, RESULT)
+ def calldescrof(self, FUNC, NON_VOID_ARGS, RESULT, effectinfo=None):
+ return ('calldescr', FUNC, NON_VOID_ARGS, RESULT, effectinfo)
def typedescrof(self, CLASS):
return ('typedescr', CLASS)
def methdescrof(self, CLASS, methname):
@@ -386,6 +386,47 @@
assert cw.list_of_addr2name[0][1].endswith('.A1')
assert cw.list_of_addr2name[1][1] == 'A1.g'
+ def test_promote_virtualizable_effectinfo(self):
+ class Frame(object):
+ _virtualizable2_ = ['x']
+
+ def __init__(self, x, y):
+ self.x = x
+ self.y = y
+
+ def g1(f):
+ f.x += 1
+
+ def g2(f):
+ return f.x
+
+ def h(f):
+ f.y -= 1
+
+ def f(n):
+ f_inst = Frame(n+1, n+2)
+ g1(f_inst)
+ r = g2(f_inst)
+ h(f_inst)
+ return r
+
+ graphs = self.make_graphs(f, [5])
+ cw = CodeWriter(self.rtyper)
+ cw.candidate_graphs = [graphs[0]]
+ cw._start(self.metainterp_sd, None)
+ jitcode = cw.make_one_bytecode((graphs[0], None), False)
+ calldescrs = [calldescr for calldescr in jitcode.constants
+ if isinstance(calldescr, tuple) and
+ calldescr[0] == 'calldescr']
+ assert len(calldescrs) == 4 # for __init__, g1, g2, h.
+ effectinfo_g1 = calldescrs[1][4]
+ effectinfo_g2 = calldescrs[2][4]
+ effectinfo_h = calldescrs[3][4]
+ assert effectinfo_g1.promotes_virtualizables
+ assert effectinfo_g2.promotes_virtualizables
+ assert not effectinfo_h.promotes_virtualizables
+
+
class ImmutableFieldsTests:
def test_fields(self):
More information about the Pypy-commit
mailing list