[pypy-svn] r18004 - in pypy/dist/pypy/translator/llvm: . backendopt
ericvrp at codespeak.net
ericvrp at codespeak.net
Fri Sep 30 13:46:20 CEST 2005
Author: ericvrp
Date: Fri Sep 30 13:46:18 2005
New Revision: 18004
Modified:
pypy/dist/pypy/translator/llvm/backendopt/mergemallocs.py
pypy/dist/pypy/translator/llvm/backendopt/removeexcmallocs.py
pypy/dist/pypy/translator/llvm/funcnode.py
Log:
Working on mergemallocs, switch machine.
Modified: pypy/dist/pypy/translator/llvm/backendopt/mergemallocs.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/backendopt/mergemallocs.py (original)
+++ pypy/dist/pypy/translator/llvm/backendopt/mergemallocs.py Fri Sep 30 13:46:18 2005
@@ -1,4 +1,5 @@
-from pypy.objspace.flow.model import Block, flatten, SpaceOperation
+from pypy.objspace.flow.model import Block, flatten, SpaceOperation, Constant
+from pypy.rpython.lltype import GcStruct, Void
def merge_mallocs(translator, graph):
@@ -14,12 +15,29 @@
n_times_merged = 0
blocks = [x for x in flatten(graph) if isinstance(x, Block)]
for block in blocks:
- n_mallocs_in_block = 0
- for op in block.operations:
- if op.opname != 'malloc':
+ mallocs = [[], []]
+ for i, op in enumerate(block.operations):
+ if op.opname == 'malloc' and op.args[0].value._arrayfld:
+ print 'merge_mallocs: skip varsize', op.args[0]
+ if op.opname != 'malloc' or op.args[0].value._arrayfld:
continue
- n_mallocs_in_block += 1
- if n_mallocs_in_block >= 2:
- print 'merge_mallocs: n_mallocs_in_block=%d' % n_mallocs_in_block
- n_times_merged += 1
+ is_atomic = op.args[0].value._is_atomic()
+ mallocs[is_atomic].append( (i,op.args[0].value) )
+ print 'merge_malloc: OLD %d, %s, %s, %s' % (i, type(op.args[0]), op.args[0], op.args[0].concretetype)
+ for a in range(2):
+ if len(mallocs[a]) >= 2:
+ indices = [m[0] for m in mallocs[a]]
+ structs = [m[1] for m in mallocs[a]]
+ merged_name = 'merged'
+ for m in mallocs[a]:
+ merged_name += '_' + m[1]._name
+ merged = GcStruct(merged_name,
+ ('field1', super(GcStruct, structs[0])),
+ ('field2', super(GcStruct, structs[1]))
+ )
+ print 'merge_mallocs: %s {%s} [%s]' % (indices, structs, merged)
+ c = Constant(merged, Void)
+ print 'merge_malloc: NEW %s, %s' % (c, c.concretetype)
+ block.operations[indices[0]].args[0] = c
+ n_times_merged += 1
return n_times_merged
Modified: pypy/dist/pypy/translator/llvm/backendopt/removeexcmallocs.py
==============================================================================
--- pypy/dist/pypy/translator/llvm/backendopt/removeexcmallocs.py (original)
+++ pypy/dist/pypy/translator/llvm/backendopt/removeexcmallocs.py Fri Sep 30 13:46:18 2005
@@ -2,7 +2,7 @@
from pypy.translator.backendopt.inline import _find_exception_type
-def remove_exception_mallocs(translator, graph, ringbuffer_entry_maxsize=16, ringbuffer_n_entries=1024):
+def remove_exception_mallocs(translator, graph):
"""Remove mallocs that occur because an exception is raised.
Typically this data is shortlived and occuring often in highlevel
languages like Python. So it would be preferable if we would not need
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 30 13:46:18 2005
@@ -1,4 +1,5 @@
import py
+import sys
from pypy.objspace.flow.model import Block, Constant, Variable, Link
from pypy.objspace.flow.model import flatten, mkentrymap, traverse, last_exception
from pypy.rpython import lltype
@@ -42,11 +43,14 @@
self.db.genllvm.exceptionpolicy.transform(self.db.translator, self.graph)
if remove_exception_mallocs(self.db.translator, self.graph):
print ' from function', self.ref
- import sys
sys.stdout.flush()
#if self.ref not in ('%pypy_ll_raise_OSError__Signed', '%pypy_getitem'):
# self.db.translator.view()
- #merge_mallocs(self.db.translator, self.graph)
+ #if merge_mallocs(self.db.translator, self.graph):
+ # print ' in function', self.ref
+ # sys.stdout.flush()
+ # #self.db.translator.view()
+
remove_double_links(self.db.translator, self.graph)
def __str__(self):
More information about the Pypy-commit
mailing list