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

Reply via email to