ソースを参照

Merged conflicts.

Taddeus Kroes 14 年 前
コミット
58ebd58ff1
5 ファイル変更61 行追加14 行削除
  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