[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