[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