Author: Armin Rigo <[email protected]>
Branch: bitstring
Changeset: r83894:bf37c9521f1e
Date: 2016-04-26 09:34 +0200
http://bitbucket.org/pypy/pypy/changeset/bf37c9521f1e/
Log: Revert the changes here. Must be done more lazily in order to figure
out which FieldDescrs are present in exactly the same CallDescrs. On
PyPy there are 4000 FieldDescrs but they be grouped into 373 such
"families".
diff --git a/rpython/jit/codewriter/effectinfo.py
b/rpython/jit/codewriter/effectinfo.py
--- a/rpython/jit/codewriter/effectinfo.py
+++ b/rpython/jit/codewriter/effectinfo.py
@@ -2,31 +2,6 @@
from rpython.rtyper.rclass import OBJECT
from rpython.rtyper.lltypesystem import lltype, llmemory
from rpython.translator.backendopt.graphanalyze import BoolGraphAnalyzer
-from rpython.tool.algo import bitstring
-
-
-
-class DescrCounterCache(object):
- cache = []
-
- def make_descr_set(self, lst):
- if lst is None:
- return None
- integer_list = []
- for descr in lst:
- try:
- x = descr._ei_index
- except AttributeError:
- x = descr._ei_index = len(self.cache)
- self.cache.append(descr)
- integer_list.append(x)
- return bitstring.make_bitstring(integer_list)
-
-def expand_descr_list(cpu, bitstr):
- # for debugging
- return [cpu._descr_counter_cache.cache[i]
- for i in range(bitstring.num_bits(bitstr))
- if bitstring.bitcheck(bitstr, i)]
class EffectInfo(object):
@@ -134,21 +109,13 @@
oopspecindex=OS_NONE,
can_invalidate=False,
call_release_gil_target=_NO_CALL_RELEASE_GIL_TARGET,
- extradescrs=None,
- descr_counter_cache=DescrCounterCache()):
- make = descr_counter_cache.make_descr_set
- readonly_descrs_fields = make(readonly_descrs_fields)
- readonly_descrs_arrays = make(readonly_descrs_arrays)
- readonly_descrs_interiorfields = make(readonly_descrs_interiorfields)
- write_descrs_fields = make(write_descrs_fields)
- write_descrs_arrays = make(write_descrs_arrays)
- write_descrs_interiorfields = make(write_descrs_interiorfields)
- key = (readonly_descrs_fields,
- readonly_descrs_arrays,
- readonly_descrs_interiorfields,
- write_descrs_fields,
- write_descrs_arrays,
- write_descrs_interiorfields,
+ extradescrs=None):
+ key = (frozenset_or_none(readonly_descrs_fields),
+ frozenset_or_none(readonly_descrs_arrays),
+ frozenset_or_none(readonly_descrs_interiorfields),
+ frozenset_or_none(write_descrs_fields),
+ frozenset_or_none(write_descrs_arrays),
+ frozenset_or_none(write_descrs_interiorfields),
extraeffect,
oopspecindex,
can_invalidate)
@@ -175,9 +142,19 @@
result.readonly_descrs_fields = readonly_descrs_fields
result.readonly_descrs_arrays = readonly_descrs_arrays
result.readonly_descrs_interiorfields = readonly_descrs_interiorfields
- result.write_descrs_fields = write_descrs_fields
- result.write_descrs_arrays = write_descrs_arrays
- result.write_descrs_interiorfields = write_descrs_interiorfields
+ if extraeffect == EffectInfo.EF_LOOPINVARIANT or \
+ extraeffect == EffectInfo.EF_ELIDABLE_CANNOT_RAISE or \
+ extraeffect == EffectInfo.EF_ELIDABLE_OR_MEMORYERROR or \
+ extraeffect == EffectInfo.EF_ELIDABLE_CAN_RAISE:
+ # Ignore the writes. Note that this ignores also writes with
+ # no corresponding reads (rarely the case, but possible).
+ result.write_descrs_fields = []
+ result.write_descrs_arrays = []
+ result.write_descrs_interiorfields = []
+ else:
+ result.write_descrs_fields = write_descrs_fields
+ result.write_descrs_arrays = write_descrs_arrays
+ result.write_descrs_interiorfields = write_descrs_interiorfields
result.extraeffect = extraeffect
result.can_invalidate = can_invalidate
result.oopspecindex = oopspecindex
@@ -219,6 +196,11 @@
return '<EffectInfo 0x%x: EF=%r%s>' % (id(self), self.extraeffect,
more)
+def frozenset_or_none(x):
+ if x is None:
+ return None
+ return frozenset(x)
+
EffectInfo.MOST_GENERAL = EffectInfo(None, None, None, None, None, None,
EffectInfo.EF_RANDOM_EFFECTS,
can_invalidate=True)
@@ -305,18 +287,6 @@
else:
assert 0
#
- if extraeffect == EffectInfo.EF_LOOPINVARIANT or \
- extraeffect == EffectInfo.EF_ELIDABLE_CANNOT_RAISE or \
- extraeffect == EffectInfo.EF_ELIDABLE_OR_MEMORYERROR or \
- extraeffect == EffectInfo.EF_ELIDABLE_CAN_RAISE:
- # Ignore the writes. Note that this ignores also writes with
- # no corresponding reads (rarely the case, but possible).
- write_descrs_fields = []
- write_descrs_arrays = []
- write_descrs_interiorfields = []
- #
- if not hasattr(cpu, '_descr_counter_cache'):
- cpu._descr_counter_cache = DescrCounterCache()
return EffectInfo(readonly_descrs_fields,
readonly_descrs_arrays,
readonly_descrs_interiorfields,
@@ -327,8 +297,7 @@
oopspecindex,
can_invalidate,
call_release_gil_target,
- extradescr,
- cpu._descr_counter_cache)
+ extradescr)
def consider_struct(TYPE, fieldname):
if fieldType(TYPE, fieldname) is lltype.Void:
diff --git a/rpython/jit/codewriter/test/test_effectinfo.py
b/rpython/jit/codewriter/test/test_effectinfo.py
--- a/rpython/jit/codewriter/test/test_effectinfo.py
+++ b/rpython/jit/codewriter/test/test_effectinfo.py
@@ -1,23 +1,19 @@
import pytest
from rpython.jit.codewriter.effectinfo import (effectinfo_from_writeanalyze,
- EffectInfo, VirtualizableAnalyzer, expand_descr_list)
+ EffectInfo, VirtualizableAnalyzer)
from rpython.rlib import jit
from rpython.rtyper.lltypesystem import lltype
from rpython.rtyper.rclass import OBJECT
from rpython.translator.translator import TranslationContext, graphof
-class FakeDescr(tuple):
- pass
-
-
class FakeCPU(object):
def fielddescrof(self, T, fieldname):
- return FakeDescr(('fielddescr', T, fieldname))
+ return ('fielddescr', T, fieldname)
def arraydescrof(self, A):
- return FakeDescr(('arraydescr', A))
+ return ('arraydescr', A)
def test_no_oopspec_duplicate():
@@ -32,98 +28,83 @@
def test_include_read_field():
S = lltype.GcStruct("S", ("a", lltype.Signed))
effects = frozenset([("readstruct", lltype.Ptr(S), "a")])
- cpu = FakeCPU()
- effectinfo = effectinfo_from_writeanalyze(effects, cpu)
- assert (expand_descr_list(cpu, effectinfo.readonly_descrs_fields) ==
- [('fielddescr', S, "a")])
- assert expand_descr_list(cpu, effectinfo.write_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_arrays) == []
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert list(effectinfo.readonly_descrs_fields) == [('fielddescr', S, "a")]
+ assert not effectinfo.write_descrs_fields
+ assert not effectinfo.write_descrs_arrays
def test_include_write_field():
S = lltype.GcStruct("S", ("a", lltype.Signed))
effects = frozenset([("struct", lltype.Ptr(S), "a")])
- cpu = FakeCPU()
- effectinfo = effectinfo_from_writeanalyze(effects, cpu)
- assert (expand_descr_list(cpu, effectinfo.write_descrs_fields) ==
- [('fielddescr', S, "a")])
- assert expand_descr_list(cpu, effectinfo.readonly_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_arrays) == []
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert list(effectinfo.write_descrs_fields) == [('fielddescr', S, "a")]
+ assert not effectinfo.readonly_descrs_fields
+ assert not effectinfo.write_descrs_arrays
def test_include_read_array():
A = lltype.GcArray(lltype.Signed)
effects = frozenset([("readarray", lltype.Ptr(A))])
- cpu = FakeCPU()
- effectinfo = effectinfo_from_writeanalyze(effects, cpu)
- assert expand_descr_list(cpu, effectinfo.readonly_descrs_fields) == []
- assert (expand_descr_list(cpu, effectinfo.readonly_descrs_arrays) ==
- [('arraydescr', A)])
- assert expand_descr_list(cpu, effectinfo.write_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_arrays) == []
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert not effectinfo.readonly_descrs_fields
+ assert list(effectinfo.readonly_descrs_arrays) == [('arraydescr', A)]
+ assert not effectinfo.write_descrs_fields
+ assert not effectinfo.write_descrs_arrays
def test_include_write_array():
A = lltype.GcArray(lltype.Signed)
effects = frozenset([("array", lltype.Ptr(A))])
- cpu = FakeCPU()
- effectinfo = effectinfo_from_writeanalyze(effects, cpu)
- assert expand_descr_list(cpu, effectinfo.readonly_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_fields) == []
- assert (expand_descr_list(cpu, effectinfo.write_descrs_arrays) ==
- [('arraydescr', A)])
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert not effectinfo.readonly_descrs_fields
+ assert not effectinfo.write_descrs_fields
+ assert list(effectinfo.write_descrs_arrays) == [('arraydescr', A)]
def test_dont_include_read_and_write_field():
S = lltype.GcStruct("S", ("a", lltype.Signed))
effects = frozenset([("readstruct", lltype.Ptr(S), "a"),
("struct", lltype.Ptr(S), "a")])
- cpu = FakeCPU()
- effectinfo = effectinfo_from_writeanalyze(effects, cpu)
- assert expand_descr_list(cpu, effectinfo.readonly_descrs_fields) == []
- assert (expand_descr_list(cpu, effectinfo.write_descrs_fields) ==
- [('fielddescr', S, "a")])
- assert expand_descr_list(cpu, effectinfo.write_descrs_arrays) == []
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert not effectinfo.readonly_descrs_fields
+ assert list(effectinfo.write_descrs_fields) == [('fielddescr', S, "a")]
+ assert not effectinfo.write_descrs_arrays
def test_dont_include_read_and_write_array():
A = lltype.GcArray(lltype.Signed)
effects = frozenset([("readarray", lltype.Ptr(A)),
("array", lltype.Ptr(A))])
- cpu = FakeCPU()
- effectinfo = effectinfo_from_writeanalyze(effects, cpu)
- assert expand_descr_list(cpu, effectinfo.readonly_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.readonly_descrs_arrays) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_fields) == []
- assert (expand_descr_list(cpu, effectinfo.write_descrs_arrays) ==
- [('arraydescr', A)])
+ effectinfo = effectinfo_from_writeanalyze(effects, FakeCPU())
+ assert not effectinfo.readonly_descrs_fields
+ assert not effectinfo.readonly_descrs_arrays
+ assert not effectinfo.write_descrs_fields
+ assert list(effectinfo.write_descrs_arrays) == [('arraydescr', A)]
def test_filter_out_typeptr():
effects = frozenset([("struct", lltype.Ptr(OBJECT), "typeptr")])
- cpu = FakeCPU()
- effectinfo = effectinfo_from_writeanalyze(effects, cpu)
- assert expand_descr_list(cpu, effectinfo.readonly_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_arrays) == []
+ effectinfo = effectinfo_from_writeanalyze(effects, None)
+ assert not effectinfo.readonly_descrs_fields
+ assert not effectinfo.write_descrs_fields
+ assert not effectinfo.write_descrs_arrays
def test_filter_out_array_of_void():
effects = frozenset([("array", lltype.Ptr(lltype.GcArray(lltype.Void)))])
- cpu = FakeCPU()
- effectinfo = effectinfo_from_writeanalyze(effects, cpu)
- assert expand_descr_list(cpu, effectinfo.readonly_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_arrays) == []
+ effectinfo = effectinfo_from_writeanalyze(effects, None)
+ assert not effectinfo.readonly_descrs_fields
+ assert not effectinfo.write_descrs_fields
+ assert not effectinfo.write_descrs_arrays
def test_filter_out_struct_with_void():
effects = frozenset([("struct", lltype.Ptr(lltype.GcStruct("x", ("a",
lltype.Void))), "a")])
- cpu = FakeCPU()
- effectinfo = effectinfo_from_writeanalyze(effects, cpu)
- assert expand_descr_list(cpu, effectinfo.readonly_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_fields) == []
- assert expand_descr_list(cpu, effectinfo.write_descrs_arrays) == []
+ effectinfo = effectinfo_from_writeanalyze(effects, None)
+ assert not effectinfo.readonly_descrs_fields
+ assert not effectinfo.write_descrs_fields
+ assert not effectinfo.write_descrs_arrays
class TestVirtualizableAnalyzer(object):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit