Jelajahi Sumber

Merge branch 'master' of github.com:taddeus/peephole

Jayke Meijer 14 tahun lalu
induk
melakukan
df7b96c8c9
4 mengubah file dengan 39 tambahan dan 17 penghapusan
  1. 22 12
      src/optimize/__init__.py
  2. 10 2
      src/optimize/advanced.py
  3. 6 2
      src/statement.py
  4. 1 1
      src/writer.py

+ 22 - 12
src/optimize/__init__.py

@@ -17,6 +17,8 @@ def remove_redundancies(block):
     while old_len != len(block):
         old_len = len(block)
 
+        block.reset()
+
         while not block.end():
             s = block.read()
 
@@ -30,20 +32,34 @@ def remove_redundancies(block):
 
 def optimize_block(block):
     """Optimize a basic block."""
+    #changed = True
+
+    #while changed:
+    #    changed = False
+
+    #    if remove_redundancies(block): changed = True
+    #    if eliminate_common_subexpressions(block): changed = True
+    #    if fold_constants(block): changed = True
+    #    if copy_propagation(block): changed = True
+    #    if eliminate_dead_code(block): changed = True
+    #    print 'iteration'
+
     while remove_redundancies(block) \
             | eliminate_common_subexpressions(block) \
             | fold_constants(block) \
             | copy_propagation(block) \
             | eliminate_dead_code(block):
             #| algebraic_transformations(block) \
+        #print 'iteration'
         pass
 
-
+from copy import deepcopy
 def optimize(statements, verbose=0):
     """Optimization wrapper function, calls global and basic-block level
     optimization functions."""
     # Optimize on a global level
     # TODO: only count instructions (no directives)
+    statements = deepcopy(statements)
     o = len(statements)
     remove_redundant_jumps(statements)
     g = len(statements)
@@ -64,18 +80,12 @@ def optimize(statements, verbose=0):
     opt_blocks = reduce(lambda a, b: a + b, block_statements)
     b = len(opt_blocks)
 
-    # - Common subexpression elimination
-    # - Constant folding
-    # - Copy propagation
-    # - Dead-code elimination
-    # - Temporary variable renaming
-    # - Interchange of independent statements
-
+    # Print results
     if verbose:
-        print 'Original statements:             %d' % o
-        print 'After global optimization:       %d' % g
-        print 'After basic blocks optimization: %d' % b
-        print 'Optimization:                    %d (%d%%)' \
+        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))
 
     return opt_blocks

+ 10 - 2
src/optimize/advanced.py

@@ -50,6 +50,8 @@ def eliminate_common_subexpressions(block):
     """
     changed = False
 
+    block.reset()
+
     while not block.end():
         s = block.read()
 
@@ -123,6 +125,8 @@ def fold_constants(block):
     # Current known values in register
     register = {}
 
+    block.reset()
+
     while not block.end():
         s = block.read()
 
@@ -147,10 +151,10 @@ def fold_constants(block):
         elif s.name == 'lw' and s[1] in constants:
             # Usage of variable with constant value
             register[s[0]] = constants[s[1]]
-        elif s.name == 'mflo':
+        elif s.name == 'mflo' and '$lo' in register:
             # Move of `Lo' register to another register
             register[s[0]] = register['$lo']
-        elif s.name == 'mfhi':
+        elif s.name == 'mfhi' and '$hi' in register:
             # Move of `Hi' register to another register
             register[s[0]] = register['$hi']
         elif s.name in ['mult', 'div'] \
@@ -252,6 +256,8 @@ def copy_propagation(block):
     moves_to = []
     changed = False
 
+    block.reset()
+
     while not block.end():
         s = block.read()
 
@@ -305,6 +311,8 @@ def algebraic_transformations(block):
     """
     changed = False
 
+    block.reset()
+
     while not block.end():
         s = block.read()
 

+ 6 - 2
src/statement.py

@@ -175,7 +175,7 @@ class Statement:
         if self.is_branch() or self.is_store() or self.is_compare() \
                 or self.is_command(*['mult', 'div', 'dsz', 'mtc1']):
             if self.name == 'dsz':
-                m = re.match('^\d+\(([^)]+)\)$', self[0])
+                m = re.match('^[^(]+\(([^)]+)\)$', self[0])
 
                 if m:
                     use.append(m.group(1))
@@ -190,7 +190,7 @@ class Statement:
             use.append(self[1])
         # Case arg1 relative adressing
         if self.is_load_non_immediate() or self.is_store():
-            m = re.match('^\d+\(([^)]+)\)$', self[1])
+            m = re.match('^[^(]+\(([^)]+)\)$', self[1])
 
             if m:
                 use.append(m.group(1))
@@ -290,4 +290,8 @@ class Block:
     def reverse_statements(self):
         """Reverse the statement list and reset the pointer."""
         self.statements = self.statements[::-1]
+        self.reset()
+
+    def reset(self):
+        """Reset the internal pointer."""
         self.pointer = 0

+ 1 - 1
src/writer.py

@@ -33,7 +33,7 @@ def write_statements(statements):
                 else:
                     line += ' '
 
-                line += ','.join(s.args)
+                line += ','.join(map(str, s))
         else:
             raise Exception('Unsupported statement type "%s"' % s.stype)