[pypy-svn] r27400 - in pypy/dist/pypy/translator/llvm: . externs module test
ericvrp at codespeak.net
ericvrp at codespeak.net
Thu May 18 12:35:06 CEST 2006
Author: ericvrp
Date: Thu May 18 12:35:05 2006
New Revision: 27400
Removed:
pypy/dist/pypy/translator/llvm/externs/
Modified:
pypy/dist/pypy/translator/llvm/buildllvm.py
pypy/dist/pypy/translator/llvm/codewriter.py
pypy/dist/pypy/translator/llvm/externs2ll.py
pypy/dist/pypy/translator/llvm/gc.py
pypy/dist/pypy/translator/llvm/module/boehm.h
pypy/dist/pypy/translator/llvm/module/protos.h
pypy/dist/pypy/translator/llvm/test/test_extfunc.py
Log:
* Fixed and enabled genllvm's performance that used a ringbuffer for some
exception mallocs. For this I moved some code back from python to C
because I had to call the regular pypy_malloc (which is in C) when the
size of the (to be allocated) data would not fit into a ringbuffer entry.
* Refactored codewriter a little to allow the code in jit/codegen/llvm to
use it without the internal linkage type
Modified: pypy/dist/pypy/translator/llvm/buildllvm.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/buildllvm.py (original)
+++ pypy/dist/pypy/translator/llvm/buildllvm.py Thu May 18 12:35:05 2006
@@ -35,6 +35,7 @@
opts += "-globalopt -constmerge -ipsccp -deadargelim -inline " \
"-instcombine -scalarrepl -globalsmodref-aa -licm -load-vn " \
"-gcse -instcombine -simplifycfg -globaldce "
+ #opts += "-inline-threshold=200 " #default: 200
return opts
def compile_module(module, source_files, object_files, library_files):
Modified: pypy/dist/pypy/translator/llvm/codewriter.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/codewriter.py (original)
+++ pypy/dist/pypy/translator/llvm/codewriter.py Thu May 18 12:35:05 2006
@@ -4,12 +4,16 @@
DEFAULT_TAIL = '' #/tail
DEFAULT_CCONV = 'fastcc' #ccc/fastcc
-DEFAULT_LINKAGE = '' #/internal (disabled for now because of the JIT)
+DEFAULT_LINKAGE = 'internal ' #/internal (disabled for now because of the JIT)
class CodeWriter(object):
- def __init__(self, file, db):
+ def __init__(self, file, db, tail=DEFAULT_TAIL, cconv=DEFAULT_CCONV,
+ linkage=DEFAULT_LINKAGE):
self.file = file
self.word_repr = db.get_machine_word()
+ self.tail = tail
+ self.cconv = cconv
+ self.linkage = linkage
def close(self):
self.file.close()
@@ -60,7 +64,9 @@
self.newline()
self._append(" %s:" % name)
- def globalinstance(self, name, typeandata, linkage=DEFAULT_LINKAGE):
+ def globalinstance(self, name, typeandata, linkage=None):
+ if linkage is None:
+ linkage = self.linkage
self._append("%s = %sglobal %s" % (name, linkage, typeandata))
def typedef(self, name, type_):
@@ -76,7 +82,9 @@
self.typedef(name, "%s (%s)" % (rettyperepr,
", ".join(argtypereprs)))
- def declare(self, decl, cconv=DEFAULT_CCONV):
+ def declare(self, decl, cconv=None):
+ if cconv is None:
+ cconv = self.cconv
self._append("declare %s %s" %(cconv, decl,))
def startimpl(self):
@@ -100,7 +108,11 @@
self._indent("switch %s %s, label %%%s [%s ]"
% (intty, cond, defaultdest, labels))
- def openfunc(self, decl, cconv=DEFAULT_CCONV, linkage=DEFAULT_LINKAGE):
+ def openfunc(self, decl, cconv=None, linkage=None):
+ if cconv is None:
+ cconv = self.cconv
+ if linkage is None:
+ linkage = self.linkage
self.newline()
self._append("%s%s %s {" % (linkage, cconv, decl,))
@@ -163,8 +175,12 @@
self._indent("unwind")
def call(self, targetvar, returntype, functionref, argtypes, argrefs,
- tail=DEFAULT_TAIL, cconv=DEFAULT_CCONV):
-
+ tail=None, cconv=None):
+ if tail is None:
+ tail = self.tail
+ if cconv is None:
+ cconv = self.cconv
+
tail = self._resolvetail(tail, cconv)
args = ", ".join(["%s %s" % item for item in zip(argtypes, argrefs)])
Modified: pypy/dist/pypy/translator/llvm/externs2ll.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/externs2ll.py (original)
+++ pypy/dist/pypy/translator/llvm/externs2ll.py Thu May 18 12:35:05 2006
@@ -135,12 +135,6 @@
decls.append(("ll_" + func.func_name, graph))
return graph.name
- if hasattr(db.gcpolicy, 'exc_useringbuf') and db.gcpolicy.exc_useringbuf:
- from pypy.translator.llvm.externs import ringbuffer as rb
- g = annotatehelper(rb.ringbuffer_initialise)
- db.gcpolicy.ringbuf_malloc_name = \
- annotatehelper(rb.ringbuffer_malloc, lltype.Signed)
-
return decls
def get_c_cpath():
Modified: pypy/dist/pypy/translator/llvm/gc.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/gc.py (original)
+++ pypy/dist/pypy/translator/llvm/gc.py Thu May 18 12:35:05 2006
@@ -59,7 +59,7 @@
return self.boehm.var_malloc(codewriter, targetvar, type_, node, len, atomic)
def genextern_code(self):
- r = ''
+ r = ''
r += '#define __GC_STARTUP_CODE__\n'
r += '#define __GC_SETUP_CODE__\n'
r += 'char* pypy_malloc(int size) { return calloc(1, size); }\n'
@@ -69,18 +69,15 @@
class BoehmGcPolicy(GcPolicy):
- def __init__(self, db, exc_useringbuf=False):
+ def __init__(self, db, exc_useringbuf=True):
self.db = db
self.n_malloced = 0
self.exc_useringbuf = exc_useringbuf
def genextern_code(self):
- r = '#include "boehm.h"\n'
-
- if self.exc_useringbuf:
- r += '#define __GC_SETUP_CODE__ ll_ringbuffer_initialise();\n'
- else:
- r += '#define __GC_SETUP_CODE__\n'
+ r = ''
+ r += '#include "boehm.h"\n'
+ r += '#define __GC_SETUP_CODE__\n'
return r
def gc_libraries(self):
@@ -112,17 +109,16 @@
word = self.db.get_machine_word()
uword = self.db.get_machine_uword()
+ fnname = '%pypy_malloc' + (atomic and '_atomic' or '')
if self.exc_useringbuf and exc_flag:
- fnname = '%pypy_' + self.ringbuf_malloc_name
- atomic = False
- else:
- fnname = '%pypy_malloc' + (atomic and '_atomic' or '')
+ fnname += '_ringbuffer'
+ atomic = False #XXX performance hack to never clear the ringbuffer data
# malloc_size is unsigned right now
sizei = '%malloc_sizei' + self.get_count()
codewriter.cast(sizei, uword, size, word)
codewriter.call(targetvar, 'sbyte*', fnname, [word], [sizei])
-
+
if atomic:
codewriter.call(None, 'void', '%llvm.memset',
['sbyte*', 'ubyte', uword, uword],
Modified: pypy/dist/pypy/translator/llvm/module/boehm.h
==============================================================================
--- pypy/dist/pypy/translator/llvm/module/boehm.h (original)
+++ pypy/dist/pypy/translator/llvm/module/boehm.h Thu May 18 12:35:05 2006
@@ -4,11 +4,14 @@
#ifdef USING_THREADED_BOEHM
+#define GC_LINUX_THREADS 1
#define GC_REDIRECT_TO_LOCAL 1
+#define GC_I_HIDE_POINTERS 1
#include <gc_local_alloc.h>
#else
+#define GC_I_HIDE_POINTERS 1
#include <gc.h>
#endif
@@ -29,3 +32,35 @@
#define __GC_STARTUP_CODE__ \
GC_all_interior_pointers = 0; \
GC_init();
+
+
+// Some malloced data is expected to be short-lived (exceptions).
+// The follow is a hack to store such data in a ringbuffer.
+// This yields an extremely good speedup in certain cases but
+// fails badly (segfaults) when a reference to the data is kept
+// around and used (much) later.
+
+#define ringbufsize 1024
+#define ringbufentry_maxsize 16
+
+static char ringbufdata[ringbufsize + ringbufentry_maxsize];
+static long ringbufindex = 0;
+
+char *pypy_malloc_ringbuffer(long size) {
+ if (size <= ringbufentry_maxsize) { //test expected to be optimized away during compile time
+ ringbufindex = (ringbufindex + ringbufentry_maxsize) & (ringbufsize - 1);
+ return &ringbufdata[ringbufindex];
+ } else {
+ return GC_MALLOC(size);
+ }
+}
+
+char *pypy_malloc_atomic_ringbuffer(long size) {
+ if (size <= ringbufentry_maxsize) { //test expected to be optimized away during compile time
+ ringbufindex = (ringbufindex + ringbufentry_maxsize) & (ringbufsize - 1);
+ return &ringbufdata[ringbufindex];
+ } else {
+ return GC_MALLOC_ATOMIC(size);
+ }
+}
+
Modified: pypy/dist/pypy/translator/llvm/module/protos.h
==============================================================================
--- pypy/dist/pypy/translator/llvm/module/protos.h (original)
+++ pypy/dist/pypy/translator/llvm/module/protos.h Thu May 18 12:35:05 2006
@@ -17,6 +17,5 @@
RPyListOfString *_RPyListOfString_New(long);
void _RPyListOfString_SetItem(RPyListOfString *, int, RPyString *);
#endif
-void ll_ringbuffer_initialise(void);
// XXX end of proto hacks
Modified: pypy/dist/pypy/translator/llvm/test/test_extfunc.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/test/test_extfunc.py (original)
+++ pypy/dist/pypy/translator/llvm/test/test_extfunc.py Thu May 18 12:35:05 2006
@@ -23,8 +23,7 @@
assert abs(f()-fn()) < 10.0
def test_external_function_ll_time_clock():
- if sys.platform == 'darwin':
- py.test.skip("time.clock behaving strangly on Darwin")
+ py.test.skip("XXX TODO FIXME time.clock behaving strangly")
import time
def fn():
return time.clock()
More information about the Pypy-commit
mailing list