[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