Browse Source

Added block reset() call whenever 'while block.end():' is used.

Taddeus Kroes 14 years ago
parent
commit
69a2813791
2 changed files with 14 additions and 2 deletions
  1. 10 2
      src/optimize/advanced.py
  2. 4 0
      src/statement.py

+ 10 - 2
src/optimize/advanced.py

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

+ 4 - 0
src/statement.py

@@ -288,4 +288,8 @@ class Block:
     def reverse_statements(self):
     def reverse_statements(self):
         """Reverse the statement list and reset the pointer."""
         """Reverse the statement list and reset the pointer."""
         self.statements = self.statements[::-1]
         self.statements = self.statements[::-1]
+        self.reset()
+
+    def reset(self):
+        """Reset the internal pointer."""
         self.pointer = 0
         self.pointer = 0