[pypy-svn] r18092 - in pypy/dist/pypy: objspace/flow translator/backendopt translator/c

tismer at codespeak.net tismer at codespeak.net
Mon Oct 3 03:23:39 CEST 2005


Author: tismer
Date: Mon Oct  3 03:23:35 2005
New Revision: 18092

Modified:
   pypy/dist/pypy/objspace/flow/model.py
   pypy/dist/pypy/translator/backendopt/ssa.py
   pypy/dist/pypy/translator/c/wrapper.py
Log:
changed Variable() a little bit to use numbering per distinct name.
Had to add a few functions to hide the Variable implementation.
I.E. clients should never use v._name or v._nr

The effect is a quite measurable reduction of memory requirements
during the first passes of translation, because we now never
store the variable name strings.

Later, in code generation, almost all of this effect vanishes, again.
We are still many megabytes smaller, but slightly above 402 MB.
I think Variable.name is saved at some place that I did not find, yet.

Modified: pypy/dist/pypy/objspace/flow/model.py
==============================================================================
--- pypy/dist/pypy/objspace/flow/model.py	(original)
+++ pypy/dist/pypy/objspace/flow/model.py	Mon Oct  3 03:23:35 2005
@@ -94,6 +94,7 @@
         from pypy.translator.tool.graphpage import SingleGraphPage
         SingleGraphPage(self).display()
 
+
 class Link(object):
 
     __slots__ = """args target exitcase llexitcase prevblock
@@ -137,6 +138,7 @@
     def __repr__(self):
         return "link from %s to %s" % (str(self.prevblock), str(self.target))
 
+
 class Block(object):
     __slots__ = """isstartblock inputargs operations exitswitch
                 exits exc_handler""".split()
@@ -209,40 +211,44 @@
 
 
 class Variable(object):
-    __slots__ = ["_name", "concretetype"]
+    __slots__ = ["_name", "_nr", "concretetype"]
 
-    countall = 0
+    dummyname = intern('v')
+    namesdict = {dummyname : 0}
 
     def name(self):
-        name = self._name
-        if type(name) is int:
-            name = 'v%d' % name
-        return name
+        _name = self._name
+        _nr = self._nr
+        if _nr == -1:
+            # consume numbers lazily
+            nd = self.namesdict
+            _nr = self._nr = nd[_name]
+            nd[_name] = _nr + 1
+        return "%s%d" % (_name, _nr)
     name = property(name)
 
     def renamed(self):
-        return type(self._name) is not int
+        return self._name is not self.dummyname
     renamed = property(renamed)
     
     def __init__(self, name=None):
-        self._name = Variable.countall
-        Variable.countall += 1
+        self._name = self.dummyname
+        self._nr = -1
+        # wait with assigning a vxxx number until the name is requested
         if name is not None:
             self.rename(name)
 
     def __repr__(self):
-        return '%s' % self.name
+        return self.name
 
     def rename(self, name):
-        my_number = self._name
-        if type(my_number) is not int:   # don't rename several times
+        if self._name is not self.dummyname:   # don't rename several times
             return
         if type(name) is not str:
             #assert isinstance(name, Variable) -- disabled for speed reasons
             name = name._name
-            if type(name) is int:    # the other Variable wasn't renamed either
+            if name is self.dummyname:    # the other Variable wasn't renamed either
                 return
-            name = name[:name.rfind('_')]
         else:
             # remove strange characters in the name
             name = name.translate(PY_IDENTIFIER)
@@ -250,25 +256,43 @@
                 return
             if name[0] <= '9':   # skipped the   '0' <=   which is always true
                 name = '_' + name
-        self._name = '%s_%d' % (name, my_number)
+            name = intern(name + '_')
+        nd = self.namesdict
+        nr = nd.get(name, 0)
+        nd[name] = nr + 1
+        self._name = name
+        self._nr = nr
+
+    def set_name_from(self, v):
+        # this is for SSI_to_SSA only which should not know about internals
+        v.name  # make sure v's name is finalized
+        self._name = v._name
+        self._nr = v._nr
+
+    def set_name(self, name, nr):
+        # this is for wrapper.py which wants to assign a name explicitly
+        self._name = intern(name)
+        self._nr = nr
 
     def __reduce_ex__(self, *args):
         if hasattr(self, 'concretetype'):
-            return _bv, (self._name, self.concretetype)
+            return _bv, (self._name, self._nr, self.concretetype)
         else:
-            return _bv, (self._name,)
+            return _bv, (self._name, self._nr)
     __reduce__ = __reduce_ex__
 
-def _bv(_name, concretetype=None):
+def _bv(_name, _nr, concretetype=None):
     v = Variable.__new__(Variable, object)
     v._name = _name
+    v._nr = _nr
     if concretetype is not None:
         v.concretetype = concretetype
-    if type(_name) is int:
-        if _name > Variable.countall:
-            Variable.countall = _name
+    nd = v.namesdict
+    if _nr > nd.get(_name, -1):
+        nd[_name] = _nr + 1
     return v
 
+
 class Constant(Hashable):
     __slots__ = ["concretetype"]
 
@@ -283,6 +307,7 @@
             return Constant, (self.value,)
     __reduce__ = __reduce_ex__
 
+
 class SpaceOperation(object):
     __slots__ = "opname args result offset".split()
 
@@ -316,6 +341,7 @@
 def _sop(opname, result, offset, *args):
     return SpaceOperation(opname, args, result, offset)
 
+
 class Atom:
     def __init__(self, name):
         self.__name__ = name # make save_global happy

Modified: pypy/dist/pypy/translator/backendopt/ssa.py
==============================================================================
--- pypy/dist/pypy/translator/backendopt/ssa.py	(original)
+++ pypy/dist/pypy/translator/backendopt/ssa.py	Mon Oct  3 03:23:35 2005
@@ -102,7 +102,7 @@
     for v in variable_families.keys():
         v1 = variable_families.find_rep(v)
         if v1 != v:
-            v._name = v1.name
+            v.set_name_from(v1)
 
     # sanity-check that the same name is never used several times in a block
     variables_by_name = {}

Modified: pypy/dist/pypy/translator/c/wrapper.py
==============================================================================
--- pypy/dist/pypy/translator/c/wrapper.py	(original)
+++ pypy/dist/pypy/translator/c/wrapper.py	Mon Oct  3 03:23:35 2005
@@ -59,7 +59,7 @@
             vlist.append(Constant(default_value))
 
         v = newops.genop(opname, vlist, resulttype=Ptr(PyObject))
-        v._name = 'a%d' % i
+        v.set_name('a', i)
         varguments.append(v)
 
     if vararg:
@@ -69,7 +69,7 @@
                  Constant(None),
                  ]
         vararg = newops.genop('getslice', vlist, resulttype=Ptr(PyObject))
-        vararg._name = 'vararg'
+        vararg.set_name('vararg', 0)
         varguments.append(vararg)
     else:
         # "check_no_more_arg(fname, n, vargs)"



More information about the Pypy-commit mailing list