[pypy-svn] r17079 - pypy/dist/pypy/translator/llvm

ericvrp at codespeak.net ericvrp at codespeak.net
Mon Aug 29 23:12:40 CEST 2005


Author: ericvrp
Date: Mon Aug 29 23:12:38 2005
New Revision: 17079

Modified:
   pypy/dist/pypy/translator/llvm/arraynode.py
   pypy/dist/pypy/translator/llvm/database.py
   pypy/dist/pypy/translator/llvm/funcnode.py
   pypy/dist/pypy/translator/llvm/genllvm.py
   pypy/dist/pypy/translator/llvm/node.py
   pypy/dist/pypy/translator/llvm/structnode.py
Log:
Slotified nodes. 
Memory usage went down from max ~350Mb to ~300Mb. 
It now takes 35 minutes on my machine to generate the .ll file.
Running the llvm toolchain and gcc on that takes another 15 minutes or so.


Modified: pypy/dist/pypy/translator/llvm/arraynode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/arraynode.py	(original)
+++ pypy/dist/pypy/translator/llvm/arraynode.py	Mon Aug 29 23:12:38 2005
@@ -6,11 +6,13 @@
 log = log.structnode
 
 class ArrayTypeNode(LLVMNode):
+    __slots__ = "db array arraytype ref constructor_ref constructor_decl".split()
+
     def __init__(self, db, array):
         assert isinstance(array, lltype.Array)
         self.db = db
         self.array = array
-        arraytype = self.arraytype = array.OF
+        self.arraytype = arraytype = array.OF
         # ref is used to reference the arraytype in llvm source 
         # constructor_ref is used to reference the constructor 
         # for the array type in llvm source code 
@@ -58,6 +60,7 @@
 
 
 class VoidArrayTypeNode(LLVMNode):
+    __slots__ = "db array ref".split()
 
     def __init__(self, db, array):
         assert isinstance(array, lltype.Array)
@@ -75,6 +78,8 @@
     a struct,
     pointer to struct/array
     """
+    __slots__ = "db value arraytype ref".split()
+    
     def __init__(self, db, value):
         assert isinstance(lltype.typeOf(value), lltype.Array)
         self.db = db
@@ -151,6 +156,8 @@
         return s
     
 class StrArrayNode(ArrayNode):
+    __slots__ = "".split()
+
     printables = dict([(ord(i), None) for i in
       ("0123456789abcdefghijklmnopqrstuvwxyz" +
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
@@ -173,15 +180,15 @@
         return item_length, r
 
 class VoidArrayNode(ConstantLLVMNode):
+    __slots__ = "db value ref".split()
 
     def __init__(self, db, value):
         assert isinstance(lltype.typeOf(value), lltype.Array)
         self.db = db
-        self.ref = self.make_ref('%arrayinstance', '')
         self.value = value
+        self.ref = self.make_ref('%arrayinstance', '')
 
     def constantvalue(self):
         return "{ %s } {%s %s}" % (self.db.get_machine_word(),
                                    self.db.get_machine_word(),
                                    len(self.value.items))
-

Modified: pypy/dist/pypy/translator/llvm/database.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/database.py	(original)
+++ pypy/dist/pypy/translator/llvm/database.py	Mon Aug 29 23:12:38 2005
@@ -68,7 +68,7 @@
 
     def dump_pbcs(self):
         r = ""
-        for k, v in self.obj2node.items():
+        for k, v in self.obj2node.iteritems():
             
             if isinstance(k, lltype.LowLevelType):
                 continue
@@ -226,7 +226,7 @@
         return self.entrynode
 
     def getnodes(self):
-        return self.obj2node.values()
+        return self.obj2node.itervalues()
         
     # __________________________________________________________
     # Representing variables and constants in LLVM source code 

Modified: pypy/dist/pypy/translator/llvm/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/funcnode.py	(original)
+++ pypy/dist/pypy/translator/llvm/funcnode.py	Mon Aug 29 23:12:38 2005
@@ -10,6 +10,8 @@
 log = log.funcnode
 
 class FuncTypeNode(LLVMNode):
+    __slots__ = "db type_ ref".split()
+    
     def __init__(self, db, type_):
         self.db = db
         assert isinstance(type_, lltype.FuncType)
@@ -29,6 +31,8 @@
         codewriter.funcdef(self.ref, returntype, inputargtypes)
 
 class FuncNode(ConstantLLVMNode):
+    __slots__ = "db value ref graph block_to_name".split()
+
     def __init__(self, db, value):
         self.db = db
         self.value = value

Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py	Mon Aug 29 23:12:38 2005
@@ -76,7 +76,7 @@
         i = line.find(calltag)
         if i >= 0:
             cconv = 'ccc'
-            for funcname in funcnames.keys():
+            for funcname in funcnames.iterkeys():
                 if line.find(funcname) >= 0:
                     cconv = DEFAULT_CCONV
                     break
@@ -108,11 +108,36 @@
         # for debug we create comments of every operation that may be executed
         self.debug = debug
 
-    def _add_to_database(self, name, funcptr):
-        ptr = getfunctionptr(self.translator, func)
-        c = inputconst(lltype.typeOf(funcptr), funcptr)
-        c.value._obj.graph.name = name
-        self.db.prepare_arg_value(c)
+    def _print_node_stats(self):
+        """run_pypy-llvm.sh [aug 29th 2005]
+        before slotifying: 350Mb
+        after  slotifying: 300Mb, 35 minutes until the .ll file is fully written.
+        STATS (1, "<class 'pypy.translator.llvm.arraynode.VoidArrayTypeNode'>")
+        STATS (1, "<class 'pypy.translator.llvm.opaquenode.OpaqueTypeNode'>")
+        STATS (9, "<class 'pypy.translator.llvm.structnode.StructVarsizeTypeNode'>")
+        STATS (46, "<class 'pypy.translator.llvm.extfuncnode.ExternalFuncNode'>")
+        STATS (52, "<class 'pypy.translator.llvm.arraynode.ArrayTypeNode'>")
+        STATS (189, "<class 'pypy.translator.llvm.arraynode.VoidArrayNode'>")
+        STATS (816, "<class 'pypy.translator.llvm.opaquenode.OpaqueNode'>")
+        STATS (1247, "<class 'pypy.translator.llvm.funcnode.FuncTypeNode'>")
+        STATS (1747, "<class 'pypy.translator.llvm.structnode.StructTypeNode'>")
+        STATS (5886, "<class 'pypy.translator.llvm.funcnode.FuncNode'>")
+        STATS (24003, "<class 'pypy.translator.llvm.arraynode.ArrayNode'>")
+        STATS (25410, "<class 'pypy.translator.llvm.structnode.StructVarsizeNode'>")
+        STATS (26206, "<class 'pypy.translator.llvm.arraynode.StrArrayNode'>")
+        STATS (268435, "<class 'pypy.translator.llvm.structnode.StructNode'>")          
+        """
+        nodecount = {}
+        for node in self.db.getnodes():
+            typ = type(node)
+            try:
+                nodecount[typ] += 1
+            except:
+                nodecount[typ] = 1
+        stats = [(count, str(typ)) for typ, count in nodecount.iteritems()]
+        stats.sort()
+        for s in stats:
+            print 'STATS', s
 
     def post_setup_externs(self):
 
@@ -205,6 +230,9 @@
         self.translator.rtyper.specialize_more_blocks()
         self.db.setup_all()
 
+        if self.debug:
+            self._print_node_stats()
+
         if llcode_header is None:
             self.generate_llfile(extern_decls)
         lldeclarations, llimplementation = llcode_header, ll_functions

Modified: pypy/dist/pypy/translator/llvm/node.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/node.py	(original)
+++ pypy/dist/pypy/translator/llvm/node.py	Mon Aug 29 23:12:38 2005
@@ -1,6 +1,8 @@
 from pypy.rpython import lltype
 
 class LLVMNode(object):
+    __slots__ = "".split()
+
     nodename_count = {}
 
     def make_name(self, name):
@@ -42,6 +44,7 @@
         """ write function implementations. """ 
 
 class ConstantLLVMNode(LLVMNode):
+    __slots__ = "".split()
 
     def get_ref(self):
         """ Returns a reference as used for operations in blocks. """        

Modified: pypy/dist/pypy/translator/llvm/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/structnode.py	(original)
+++ pypy/dist/pypy/translator/llvm/structnode.py	Mon Aug 29 23:12:38 2005
@@ -7,6 +7,8 @@
 log = log.structnode 
 
 class StructTypeNode(LLVMNode):
+    __slots__ = "db struct ref name".split()
+
     def __init__(self, db, struct): 
         assert isinstance(struct, lltype.Struct)
         self.db = db
@@ -36,6 +38,7 @@
         codewriter.structdef(self.ref, fields_types)
 
 class StructVarsizeTypeNode(StructTypeNode):
+    __slots__ = "constructor_ref constructor_decl".split()
 
     def __init__(self, db, struct): 
         super(StructVarsizeTypeNode, self).__init__(db, struct)
@@ -82,6 +85,8 @@
     a struct,
     pointer to struct/array
     """
+    __slots__ = "db value structtype ref".split()
+
     def __init__(self, db, value):
         self.db = db
         self.value = value



More information about the Pypy-commit mailing list