Răsfoiți Sursa

tried to implement gen and kill set, commented implementation

Richard Torenvliet 14 ani în urmă
părinte
comite
82759127a4
3 a modificat fișierele cu 44 adăugiri și 37 ștergeri
  1. 30 30
      src/dataflow.py
  2. 1 1
      src/optimize/advanced.py
  3. 13 6
      tests/test_dataflow.py

+ 30 - 30
src/dataflow.py

@@ -25,38 +25,38 @@ class BasicBlock(Block):
         if block not in self.dominates:
             self.dominates.append(block)
             block.dominated_by.append(self)
-
-    def get_gen(self):
-        for s in self.statements:       
-            if s.is_arith():
-                self.gen_set.add(s[0])
-                print 'added: ', s[0]
-        
-        return self.gen_set
-        
-    def get_kill(self):
-#        if self.edges_from != []:
-        for backw in self.edges_from:
-            self.kill_set = self.kill_set | backw.get_kill()
             
-        self.kill_set = self.kill_set - self.get_gen()
-        print 'get_kill_set', self.kill_set
-        return self.kill_set
-
-    def get_in(self):
-        for backw in self.edges_from:
-            self.in_set = self.in_set | backw.get_out()
-        print 'in_set', self.in_set
-        return self.in_set
-
-    def get_out(self):
-        print 'gen_set', self.gen_set
-        print 'get_in', self.get_in()
-        print 'get_kill', self.get_kill()
-        self.out_set = self.gen_set | (self.get_in() - self.get_kill())
+    
+#    def get_gen(self):
+#        for s in self.statements:       
+#            if s.is_arith():
+#                self.gen_set.add(s[0])
+#                print 'added: ', s[0]
+#        
+#        return self.gen_set
+#        
+#    def get_kill(self):
+##        if self.edges_from != []:
+#    
+#        for backw in self.edges_from:
+#            self.kill_set = self.gen_set & backw.kill_set
+#            
+#        self.kill_set = self.kill_set - self.get_gen()
+#        print 'get_kill_set', self.kill_set
+#        return self.kill_set
+
+#    def get_in(self):
+#        for backw in self.edges_from:
+#            self.in_set = self.in_set | backw.out_set
+#        print 'in_set', self.in_set
+#        return self.in_set
+
+#    def get_out(self):
+#        print 'gen_set', self.gen_set
+#        print 'get_in', self.get_in()
+#        print 'get_kill', self.get_kill()
+#        self.out_set = self.gen_set | (self.get_in() - self.get_kill())
         
-def reaching_definition(blocks):
-    generate_flow_graph(blocks)
 
     
 

+ 1 - 1
src/optimize/advanced.py

@@ -55,7 +55,7 @@ def eliminate_common_subexpressions(block):
     block.reverse_statements()
 
     return found
-
+    
 
 def to_hex(value):
     """Create the hexadecimal string of an integer."""

+ 13 - 6
tests/test_dataflow.py

@@ -43,14 +43,21 @@ class TestDataflow(unittest.TestCase):
 #                
 #        blocks = [b1, b2]
 #        
+#        # initialize  out[B] = gen[B] for every block        
 #        for block in blocks:
 #            block.out_set = block.get_gen()
-#            print 'block.out_set', block.out_set       
-
-#        generate_flow_graph(blocks)     
-#        print b1.get_gen()
-#        print b2.get_gen()
-#        print b2.get_out()
+#            print 'block.out_set', block.out_set
+#            
+#        generate_flow_graph(blocks)
+
+#        change = True
+#        while change:
+#            for i, block in enumerate(blocks):
+#                block.get_in()
+#                oldout = block.out_set
+#                newout = block.get_out()
+#                if (block.out_set == block.get_out()):
+#                    change = False
 
 
     def test_generate_flow_graph_simple(self):