Преглед на файлове

Moved optimization loop to program class.

Taddeus Kroes преди 14 години
родител
ревизия
24c91ff678
променени са 3 файла, в които са добавени 67 реда и са изтрити 66 реда
  1. 24 17
      main.py
  2. 0 49
      src/optimize/__init__.py
  3. 43 0
      src/program.py

+ 24 - 17
main.py

@@ -1,26 +1,33 @@
 #!/usr/bin/python
+from sys import argv, exit
+
 from src.parser import parse_file
-from src.optimize import optimize
 
 
-if __name__ == '__main__':
-    from sys import argv, exit
+verbose_level = 1
+
+
+# Parse arguments
+if len(argv) < 2:
+    print 'Usage: python %s SOURCE_FILE [ OUT_FILE [ SOURCE_OUT_FILE ] ]' \
+            % argv[0]
+    exit(1)
+
+
+# Parse file
+program = parse_file(argv[1])
+program.verbose = verbose_level
+
 
-    if len(argv) < 2:
-        print 'Usage: python %s SOURCE_FILE [ OUT_FILE [ SOURCE_OUT_FILE ] ]' \
-                % argv[0]
-        exit(1)
+# Save input assembly in new file for easy comparison
+if len(argv) > 3:
+    program.save(argv[3])
 
-    # Parse file
-    program = parse_file(argv[1])
-    program.verbose = 1
 
-    if len(argv) > 3:
-        # Save input assembly in new file for easy comparison
-        program.save(argv[3])
+# Perform optimizations
+program.optimize()
 
-    optimize(program, verbose=2)
 
-    if len(argv) > 2:
-        # Save output assembly
-        program.save(argv[2])
+# Save output assembly
+if len(argv) > 2:
+    program.save(argv[2])

+ 0 - 49
src/optimize/__init__.py

@@ -1,49 +0,0 @@
-from src.dataflow import find_basic_blocks, generate_flow_graph
-from redundancies import remove_redundancies
-from advanced import eliminate_common_subexpressions, fold_constants, \
-        copy_propagation, eliminate_dead_code
-import src.liveness as liveness
-import src.reaching_definitions as reaching_definitions
-
-def optimize(program, verbose=0):
-    """Optimization wrapper function, calls global and basic-block level
-    optimization functions."""
-    # Remember original number of statements
-    o = program.count_instructions()
-
-    changed = True
-    iterations = 0
-
-    while changed:
-        iterations += 1
-
-        if verbose > 1:
-            print 'main iteration %d', iterations
-
-        changed = False
-
-        # Optimize on a global level
-        if program.optimize_global():
-            if verbose > 1:
-                print 'changed on global level'
-
-            changed = True
-
-        # Perform dataflow analysis on new blocks
-        program.perform_dataflow_analysis()
-
-        # Optimize basic blocks
-        if program.optimize_blocks():
-            if verbose > 1:
-                print 'changed on block level'
-
-            changed = True
-
-    # Count number of instructions after optimization
-    b = program.count_instructions()
-
-    # Print results
-    if verbose:
-        print 'Original statements: %d' % o
-        print 'Statements removed:  %d (%d%%)' \
-              % (o - b, int((o - b) / float(b) * 100))

+ 43 - 0
src/program.py

@@ -137,3 +137,46 @@ class Program(Block):
         f.write(write_statements(self.get_statements(True),
                 verbose=self.verbose))
         f.close()
+
+    def optimize(self):
+        """Optimization wrapper function, calls global and basic-block level
+        optimization functions."""
+        # Remember original number of statements
+        o = self.count_instructions()
+
+        changed = True
+        iterations = 0
+
+        while changed:
+            iterations += 1
+
+            if self.verbose > 1:
+                print 'main iteration %d', iterations
+
+            changed = False
+
+            # Optimize on a global level
+            if self.optimize_global():
+                if self.verbose > 1:
+                    print 'changed on global level'
+
+                changed = True
+
+            # Perform dataflow analysis on new blocks
+            self.perform_dataflow_analysis()
+
+            # Optimize basic blocks
+            if self.optimize_blocks():
+                if self.verbose > 1:
+                    print 'changed on block level'
+
+                changed = True
+
+        # Count number of instructions after optimization
+        b = self.count_instructions()
+
+        # Print results
+        if self.verbose:
+            print 'Original statements: %d' % o
+            print 'Statements removed:  %d (%d%%)' \
+                % (o - b, int((o - b) / float(b) * 100))