Bladeren bron

Merged conflicts.

Taddeus Kroes 14 jaren geleden
bovenliggende
commit
58ebd58ff1
5 gewijzigde bestanden met toevoegingen van 61 en 14 verwijderingen
  1. 2 0
      .gitignore
  2. 3 3
      main.py
  3. 1 1
      src/optimize/__init__.py
  4. 38 9
      src/optimize/advanced.py
  5. 17 1
      tests/test_optimize_advanced.py

+ 2 - 0
.gitignore

@@ -7,6 +7,8 @@
 *.out
 *.out
 *.toc
 *.toc
 .coverage
 .coverage
+parser.out
+parsetab.py
 coverage/
 coverage/
 build/
 build/
 src/Makefile_old
 src/Makefile_old

+ 3 - 3
src/main.py → main.py

@@ -1,7 +1,7 @@
 #!/usr/bin/python
 #!/usr/bin/python
-from parser import parse_file
-from optimize import optimize
-from writer import write_statements
+from src.parser import parse_file
+from src.optimize import optimize
+from src.writer import write_statements
 
 
 if __name__ == '__main__':
 if __name__ == '__main__':
     from sys import argv, exit
     from sys import argv, exit

+ 1 - 1
src/optimize/__init__.py

@@ -1,4 +1,4 @@
-from dataflow import find_basic_blocks
+from src.dataflow import find_basic_blocks
 
 
 from standard import redundant_move_1, redundant_move_2, \
 from standard import redundant_move_1, redundant_move_2, \
         redundant_move_3, redundant_move_4, redundant_load, \
         redundant_move_3, redundant_move_4, redundant_load, \

+ 38 - 9
src/optimize/advanced.py

@@ -1,4 +1,4 @@
-from statement import Statement as S
+from src.statement import Statement as S
 
 
 
 
 def create_variable():
 def create_variable():
@@ -156,15 +156,44 @@ def copy_propagation(block):
     Rename values that were copied to there original, so the copy statement
     Rename values that were copied to there original, so the copy statement
     might be useless, allowing it to be removed by dead code elimination.
     might be useless, allowing it to be removed by dead code elimination.
     """
     """
-    moves = []
-    count = 0
+    moves_from = []
+    moves_to = []
 
 
     while not block.end():
     while not block.end():
         s = block.read()
         s = block.read()
-
-        if s.is_command('move'):
-            moves.append((s[0], s[1]))
-            count += 1
-
-    print "count", count
+        print "len(s)",len(s)
+        if len(s) == 3:
+            print "s[0] = ", s[0]
+            print "s[1] = ", s[1]
+            print "s[2] = ", s[2]
+            
+            if moves_from:
+                print moves_from
+                print moves_to
+
+        if s.is_command('move') and s[0] not in moves_from:
+            moves_from.append(s[0])
+            moves_to.append(s[1])
+            print "Added move to list."
+        elif s.is_command('move'):
+            for i in xrange(len(moves_to)):
+                if moves_to[i] == s[0]:
+                    moves_from[i] = s[1]
+        elif len(s) == 3 and s[0] in moves_to:
+            for i in xrange(len(moves_to)):
+                if moves_to[i] == s[0]:
+                    del moves_to[i]
+                    del moves_from[i]
+                    "Removed move from list."
+        elif len(s) == 3 and (s[1] in moves_to or s[2] in moves_to):
+            print "Have to propagate."
+            for i in xrange(len(moves_to)):
+                if s[1] == moves_to[i]:
+                    s[1] = moves_from[i]
+                    print "Propagated"
+                
+                if s[2] == moves_to[i]:
+                    s[2] = moves_from[i]
+                    print "Propagated"
+                
     return False
     return False

+ 17 - 1
tests/test_optimize_advanced.py

@@ -8,7 +8,23 @@ from src.statement import Statement as S, Block as B
 class TestOptimizeAdvanced(unittest.TestCase):
 class TestOptimizeAdvanced(unittest.TestCase):
 
 
     def setUp(self):
     def setUp(self):
-        pass
+        self.foo = S('command', 'foo')
+        self.bar = S('command', 'bar')
 
 
     def test_eliminate_common_subexpressions(self):
     def test_eliminate_common_subexpressions(self):
         pass
         pass
+
+    def test_copy_propagation_true(self):
+#        block = B([self.foo,
+#                   S('command', 'move', '$1', '$2'),
+#                   self.foo,
+#                   S('command', 'addu', '$3', '$1', '$4'),
+#                   self.bar])
+#
+#        copy_propagation(block)
+#        self.assertEquals(block.statements, [self.foo,
+#                   S('command', 'move', '$1', '$2'),
+#                   self.foo,
+#                   S('command', 'addu', '$3', '$2', '$4'),
+#                   self.bar])
+        pass