Просмотр исходного кода

Added global optimization and dataflow anaysis to optimization loop.

Taddeus Kroes 14 лет назад
Родитель
Сommit
e63246249c
2 измененных файлов с 18 добавлено и 11 удалено
  1. 14 10
      src/optimize/__init__.py
  2. 4 1
      src/program.py

+ 14 - 10
src/optimize/__init__.py

@@ -11,23 +11,27 @@ def optimize(program, verbose=0):
     # Remember original number of statements
     o = program.count_instructions()
 
-    # Optimize on a global level
-    program.optimize_global()
-    g = program.count_instructions()
+    changed = True
 
-    # Perform dataflow analysis
-    program.perform_dataflow_analysis()
+    while changed:
+        changed = False
 
-    # Optimize basic blocks
-    program.optimize_blocks()
+        # Optimize on a global level
+        if program.optimize_global():
+            changed = True
 
-    # Concatenate optimized blocks to obtain
+        # Perform dataflow analysis on new blocks
+        program.perform_dataflow_analysis()
+
+        # Optimize basic blocks
+        if program.optimize_blocks():
+            changed = True
+
+    # Count number of instructions after optimization
     b = program.count_instructions()
 
     # Print results
     if verbose:
         print 'Original statements:            %d' % o
-        print 'After global optimization:      %d (%d removed)' % (g, o - g)
-        print 'After basic block optimization: %d (%d removed)' % (b, g - b)
         print 'Statements removed:             %d (%d%%)' \
                 % (o - b, int((o - b) / float(b) * 100))

+ 4 - 1
src/program.py

@@ -62,7 +62,10 @@ class Program(Block):
 
     def optimize_global(self):
         """Optimize on a global level."""
-        remove_redundant_jumps(self)
+        if not hasattr(self, 'statements'):
+            self.statements = self.get_statements()
+
+        return remove_redundant_jumps(self)
 
     def optimize_blocks(self):
         """Optimize on block level. Keep executing all optimizations until no