[pypy-svn] r4370 - pypy/trunk/src/pypy/translator

arigo at codespeak.net arigo at codespeak.net
Tue May 11 16:50:08 CEST 2004


Author: arigo
Date: Tue May 11 16:50:07 2004
New Revision: 4370

Modified:
   pypy/trunk/src/pypy/translator/annrpython.py
   pypy/trunk/src/pypy/translator/transform.py
Log:
A new transformation (dead operation elimination).


Modified: pypy/trunk/src/pypy/translator/annrpython.py
==============================================================================
--- pypy/trunk/src/pypy/translator/annrpython.py	(original)
+++ pypy/trunk/src/pypy/translator/annrpython.py	Tue May 11 16:50:07 2004
@@ -164,7 +164,7 @@
     def simplify(self):
         # Generic simpliciations
         from pypy.translator import transform
-        transform.transform_simple_call(self)
+        transform.transform_graph(self)
 
 
     #___ flowing annotations in blocks _____________________

Modified: pypy/trunk/src/pypy/translator/transform.py
==============================================================================
--- pypy/trunk/src/pypy/translator/transform.py	(original)
+++ pypy/trunk/src/pypy/translator/transform.py	Tue May 11 16:50:07 2004
@@ -96,8 +96,32 @@
 
         block.operations = operations
 
+def transform_dead_operations(self):
+    """Remove dead operations."""
+    # the set of operations that can safely be removed (no side effects)
+    CanRemove = {'newtuple': True,
+                 'newlist': True,
+                 'newdict': True}
+    for block in self.annotated:
+        # figure out which variables are ever read
+        read_vars = {}
+        for op in block.operations:
+            for arg in op.args:
+                read_vars[arg] = True
+        for link in block.exits:
+            for arg in link.args:
+                read_vars[arg] = True
+        # look for removable operations whose result is never used
+        for i in range(len(block.operations)-1, -1, -1):
+            op = block.operations[i]
+            if op.opname in CanRemove and op.result not in read_vars:
+                del block.operations[i]
+
 def transform_graph(ann):
     """Apply set of transformations available."""
     transform_allocate(ann)
     transform_slice(ann)
     transform_simple_call(ann)
+    # do this last, after the previous transformations had a
+    # chance to remove dependency on certain variables
+    transform_dead_operations(ann)


More information about the Pypy-commit mailing list