[pypy-svn] r17167 - in pypy/dist/pypy/translator/llvm: . demo module

ericvrp at codespeak.net ericvrp at codespeak.net
Fri Sep 2 16:11:52 CEST 2005


Author: ericvrp
Date: Fri Sep  2 16:11:49 2005
New Revision: 17167

Modified:
   pypy/dist/pypy/translator/llvm/codewriter.py
   pypy/dist/pypy/translator/llvm/demo/richards.py
   pypy/dist/pypy/translator/llvm/extfuncnode.py
   pypy/dist/pypy/translator/llvm/funcnode.py
   pypy/dist/pypy/translator/llvm/genllvm.py
   pypy/dist/pypy/translator/llvm/module/support.py
   pypy/dist/pypy/translator/llvm/opwriter.py
   pypy/dist/pypy/translator/llvm/structnode.py
   pypy/dist/pypy/translator/llvm/varsize.py
Log:
optimization to generate the .ll file quicker


Modified: pypy/dist/pypy/translator/llvm/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/codewriter.py	(original)
+++ pypy/dist/pypy/translator/llvm/codewriter.py	Fri Sep  2 16:11:49 2005
@@ -4,9 +4,8 @@
 
 log = log.codewriter 
 
-DEFAULT_TAIL     = 'tail'       #/tail
+DEFAULT_TAIL     = ''       #/tail
 DEFAULT_CCONV    = 'fastcc'    #ccc/fastcc
-DEFAULT_INTERNAL = 'internal'       #/internal
 
 class CodeWriter(object): 
     def __init__(self, f, word, uword, show_line_number=False): 

Modified: pypy/dist/pypy/translator/llvm/demo/richards.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/demo/richards.py	(original)
+++ pypy/dist/pypy/translator/llvm/demo/richards.py	Fri Sep  2 16:11:49 2005
@@ -360,7 +360,7 @@
 
 class Richards:
 
-    iterations = 2
+    iterations = 25
 
     def run(self):
         for i in xrange(self.iterations):

Modified: pypy/dist/pypy/translator/llvm/extfuncnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/extfuncnode.py	(original)
+++ pypy/dist/pypy/translator/llvm/extfuncnode.py	Fri Sep  2 16:11:49 2005
@@ -26,8 +26,5 @@
     def writedecl(self, codewriter): 
         codewriter.declare(self.getdecl())
 
-    #def writeimpl(self, codewriter): 
-    #    self.used_external_functions[self.ref] = True
-
     def writeglobalconstants(self, codewriter):
         pass

Modified: pypy/dist/pypy/translator/llvm/funcnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/funcnode.py	(original)
+++ pypy/dist/pypy/translator/llvm/funcnode.py	Fri Sep  2 16:11:49 2005
@@ -179,7 +179,7 @@
         else:
             last_op_index = None
         for op_index, op in enumerate(block.operations):
-            if True:   # print out debug string
+            if False:   # print out debug string
                 codewriter.newline()
                 codewriter.comment("** %s **" % str(op))
                 info = self.db.get_op2comment(op)

Modified: pypy/dist/pypy/translator/llvm/genllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/genllvm.py	(original)
+++ pypy/dist/pypy/translator/llvm/genllvm.py	Fri Sep  2 16:11:49 2005
@@ -1,5 +1,6 @@
 from os.path import exists
 use_boehm_gc = exists('/usr/lib/libgc.so') or exists('/usr/lib/libgc.a')
+use_boehm_gc = False
 
 import os
 import time
@@ -16,11 +17,12 @@
 from pypy.rpython import lltype
 from pypy.tool.udir import udir
 from pypy.translator.llvm.codewriter import CodeWriter, \
-     DEFAULT_INTERNAL, DEFAULT_TAIL, DEFAULT_CCONV
+     DEFAULT_TAIL, DEFAULT_CCONV
 from pypy.translator.llvm import extfuncnode
 from pypy.translator.llvm.module.extfunction import extdeclarations, \
      extfunctions, gc_boehm, gc_disabled, dependencies
 from pypy.translator.llvm.node import LLVMNode
+from pypy.translator.llvm.structnode import StructNode
 
 from pypy.translator.translator import Translator
 
@@ -61,13 +63,13 @@
             line = line[:comment]
         line = line.rstrip()
 
-        # find function names, declare them internal with fastcc calling convertion
+        # find function names, declare them with the default calling convertion
         if line[-1:] == '{':
            returntype, s = line.split(' ', 1)
            funcname  , s = s.split('(', 1)
            funcnames[funcname] = True
            if line.find("internal") == -1:
-                line = '%s %s %s' % ("", DEFAULT_CCONV, line,)
+                line = '%s %s' % (DEFAULT_CCONV, line,)
         ll_lines.append(line)
 
     # patch calls to function that we just declared fastcc
@@ -96,7 +98,7 @@
     
 class GenLLVM(object):
 
-    def __init__(self, translator, debug=False):
+    def __init__(self, translator, debug=True):
     
         # reset counters
         LLVMNode.nodename_count = {}    
@@ -118,14 +120,14 @@
         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'>")          
+        STATS (819, "<class 'pypy.translator.llvm.opaquenode.OpaqueNode'>")
+        STATS (1250, "<class 'pypy.translator.llvm.funcnode.FuncTypeNode'>")
+        STATS (1753, "<class 'pypy.translator.llvm.structnode.StructTypeNode'>")
+        STATS (5896, "<class 'pypy.translator.llvm.funcnode.FuncNode'>")
+        STATS (24013, "<class 'pypy.translator.llvm.arraynode.ArrayNode'>")
+        STATS (25411, "<class 'pypy.translator.llvm.structnode.StructVarsizeNode'>")
+        STATS (26210, "<class 'pypy.translator.llvm.arraynode.StrArrayNode'>")
+        STATS (268884, "<class 'pypy.translator.llvm.structnode.StructNode'>")
         """
         nodecount = {}
         for node in self.db.getnodes():
@@ -375,10 +377,7 @@
                 if dep not in depdone:
                     try:
                         llvm_code = extfunctions[dep][1]
-                    except KeyError:
-                        msg = 'primitive function %s has no implementation' % dep
-                        codewriter.comment('XXX: Error: ' + msg)
-                        #raise Exception('primitive function %s has no implementation' %(dep,))
+                    except KeyError: #external function that is shared with genc
                         continue
                     for extfunc in llvm_code.split('\n'):
                         codewriter.append(extfunc)

Modified: pypy/dist/pypy/translator/llvm/module/support.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/module/support.py	(original)
+++ pypy/dist/pypy/translator/llvm/module/support.py	Fri Sep  2 16:11:49 2005
@@ -1,9 +1,8 @@
 
 extdeclarations = """
-declare ccc int %puts(sbyte*)
 declare ccc uint %strlen(sbyte*)
-declare ccc sbyte* %memset(sbyte*, int, uint)
-declare ccc sbyte* %strncpy(sbyte *, sbyte *, int)
+declare ccc void %llvm.memset(sbyte*, ubyte, uint, uint)
+declare ccc void %llvm.memcpy(sbyte*, sbyte*, uint, uint)
 """
 
 
@@ -35,7 +34,7 @@
     %rpystrptr = getelementptr %RPyString* %rpy, int 0, uint 1, uint 1
     %rpystr    = cast [0 x sbyte]* %rpystrptr to sbyte*
 
-    call ccc sbyte* %strncpy(sbyte* %rpystr, sbyte* %s, int %len)
+    call ccc void %llvm.memcpy(sbyte* %rpystr, sbyte* %s, uint %lenu, uint 0)
 
     ret %RPyString* %rpy
 }
@@ -89,11 +88,10 @@
 """ % locals())
 
 
-#prepare and raise exceptions
+#prepare and raise exceptions (%msg not used right now!)
 for exc in "IOError ZeroDivisionError OverflowError ValueError".split():    #_ZER _OVF _VAL
     extfunctions["%%raisePyExc_%(exc)s" % locals()] = ((), """
 internal fastcc void %%raisePyExc_%(exc)s(sbyte* %%msg) {
-    ;XXX %%msg not used right now!
     %%exception_value = call fastcc %%RPYTHON_EXCEPTION* %%pypy_instantiate_%(exc)s()
     %%tmp             = getelementptr %%RPYTHON_EXCEPTION* %%exception_value, int 0, uint 0
     %%exception_type  = load %%RPYTHON_EXCEPTION_VTABLE** %%tmp

Modified: pypy/dist/pypy/translator/llvm/opwriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/opwriter.py	(original)
+++ pypy/dist/pypy/translator/llvm/opwriter.py	Fri Sep  2 16:11:49 2005
@@ -351,7 +351,7 @@
             assert issubclass(link.exitcase, Exception)
 
             etype = self.db.obj2node[link.llexitcase._obj]
-            current_exception_type = etype.get_ref()            
+            current_exception_type = etype.get_ref()
             target          = self.node.block_to_name[link.target]
             exc_found_label = block_label + '_exception_found_branchto_' + target
             last_exc_type_var, last_exc_value_var = None, None

Modified: pypy/dist/pypy/translator/llvm/structnode.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/structnode.py	(original)
+++ pypy/dist/pypy/translator/llvm/structnode.py	Fri Sep  2 16:11:49 2005
@@ -78,37 +78,39 @@
                                   self.constructor_decl,
                                   current, 
                                   indices_to_array)
-        
+
 class StructNode(ConstantLLVMNode):
     """ A struct constant.  Can simply contain
     a primitive,
     a struct,
     pointer to struct/array
     """
-    __slots__ = "db value structtype ref".split()
+    __slots__ = "db value structtype ref _get_ref_cache _get_types".split()
 
     def __init__(self, db, value):
         self.db = db
         self.value = value
         self.structtype = self.value._TYPE
         self.ref = self.make_ref('%structinstance', '')
-        
+        self._get_ref_cache = None
+        self._get_types = self._compute_types()
+
     def __str__(self):
         return "<StructNode %r>" % (self.ref,)
 
-    def _gettypes(self):
+    def _compute_types(self):
         return [(name, self.structtype._flds[name])
                 for name in self.structtype._names_without_voids()]
 
     def _getvalues(self):
         values = []
-        for name, T in self._gettypes():
+        for name, T in self._get_types:
             value = getattr(self.value, name)
             values.append(self.db.repr_constant(value)[1])
         return values
     
     def setup(self):
-        for name, T in self._gettypes():
+        for name, T in self._get_types:
             assert T is not lltype.Void
             value = getattr(self.value, name)
             self.db.prepare_constant(T, value)
@@ -137,11 +139,14 @@
 
     def get_ref(self):
         """ Returns a reference as used for operations in blocks. """        
+        if self._get_ref_cache:
+            return self._get_ref_cache
         p, c = lltype.parentlink(self.value)
         if p is None:
             ref = self.ref
         else:
             ref = self.db.get_childref(p, c)
+        self._get_ref_cache = ref
         return ref
 
     def get_pbcref(self, toptr):
@@ -172,14 +177,14 @@
 
     def _getvalues(self):
         values = []
-        for name, T in self._gettypes()[:-1]:
+        for name, T in self._get_types[:-1]:
             value = getattr(self.value, name)
             values.append(self.db.repr_constant(value)[1])
         values.append(self._get_lastnoderepr())
         return values
 
     def _get_lastnode_helper(self):
-        lastname, LASTT = self._gettypes()[-1]
+        lastname, LASTT = self._get_types[-1]
         assert isinstance(LASTT, lltype.Array) or (
             isinstance(LASTT, lltype.Struct) and LASTT._arrayfld)
         value = getattr(self.value, lastname)
@@ -195,19 +200,26 @@
         super(StructVarsizeNode, self).setup()
     
     def get_typerepr(self):
-        # last type is a special case and need to be worked out recursively
-        types = self._gettypes()[:-1]
-        types_repr = [self.db.repr_type(T) for name, T in types]
-        types_repr.append(self._get_lastnode().get_typerepr())
-        
-        return "{%s}" % ", ".join(types_repr)
+            try:
+                return self._get_typerepr_cache
+            except:
+                # last type is a special case and need to be worked out recursively
+                types = self._get_types[:-1]
+                types_repr = [self.db.repr_type(T) for name, T in types]
+                types_repr.append(self._get_lastnode().get_typerepr())
+                result = "{%s}" % ", ".join(types_repr)
+                self._get_typerepr_cache = result
+                return result
          
     def get_ref(self):
+        if self._get_ref_cache:
+            return self._get_ref_cache
         ref = super(StructVarsizeNode, self).get_ref()
         typeval = self.db.repr_type(lltype.typeOf(self.value))
         ref = "cast (%s* %s to %s*)" % (self.get_typerepr(),
                                         ref,
                                         typeval)
+        self._get_ref_cache = ref
         return ref
     
     def get_pbcref(self, toptr):

Modified: pypy/dist/pypy/translator/llvm/varsize.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/varsize.py	(original)
+++ pypy/dist/pypy/translator/llvm/varsize.py	Fri Sep  2 16:11:49 2005
@@ -26,11 +26,12 @@
     codewriter.malloc("%ptr", "sbyte", "%usize", atomic=ARRAY._is_atomic())
     codewriter.cast("%result", "sbyte*", "%ptr", ref + "*")
 
-    #if ARRAY is STR.chars:
-    #    #XXX instead of memset we could probably just zero the hash and string terminator
-    #    codewriter.call('%memset_result', 'sbyte*', '%memset', ['%ptr', '0', '%usize',], ['sbyte*', word, uword], cconv='ccc')
-    codewriter.call('%memset_result', 'sbyte*', '%memset', ['%ptr', '0', '%usize',], ['sbyte*', word, uword], cconv='ccc')
- 
+    if ARRAY is STR.chars:
+        #XXX instead of memset we could probably just zero the hash and string terminator
+        codewriter.call_void('%llvm.memset', ['%ptr', '0', '%usize', '0'], ['sbyte*', 'ubyte', 'uint', 'uint'], cconv='ccc')
+    else:
+        codewriter.call_void('%llvm.memset', ['%ptr', '0', '%usize', '0'], ['sbyte*', 'ubyte', 'uint', 'uint'], cconv='ccc')
+
     indices_to_arraylength = tuple(indices_to_array) + (("uint", 0),)
     # the following accesses the length field of the array 
     codewriter.getelementptr("%arraylength", ref + "*", 



More information about the Pypy-commit mailing list