[pypy-commit] pypy stmgc-c8: do less work for updating in_states

Raemi noreply at buildbot.pypy.org
Thu Nov 26 10:26:39 EST 2015


Author: Remi Meier <remi.meier at gmail.com>
Branch: stmgc-c8
Changeset: r80976:a82a851ede45
Date: 2015-11-26 15:03 +0100
http://bitbucket.org/pypy/pypy/changeset/a82a851ede45/

Log:	do less work for updating in_states

diff --git a/rpython/translator/backendopt/dataflow.py b/rpython/translator/backendopt/dataflow.py
--- a/rpython/translator/backendopt/dataflow.py
+++ b/rpython/translator/backendopt/dataflow.py
@@ -18,7 +18,7 @@
 
     def initialize_block(self, block):
         """Return the (default) in_state, out_state for 'block'
-        used to initialize all blocks before starting the analysis"""
+        used to initialize all blocks before starting the analysis."""
         raise NotImplementedError("abstract base class")
 
     def join_operation(self, preds_outs, inputargs, pred_out_args):
@@ -47,24 +47,30 @@
             return set()
         out_states[block] = out_state
         #
-        # update all successors
-        to_do = set()
-        for link in block.exits:
-            succ = link.target
-            # collect all out_states of predecessors:
-            preds_outs = []
-            inputargs = succ.inputargs
-            preds_out_args = [[] for _ in inputargs]
-            for link in entrymap[succ]:
-                preds_outs.append(out_states[link.prevblock])
-                for i in range(len(inputargs)):
-                    preds_out_args[i].append(link.args[i])
-            block_in = self.join_operation(preds_outs, inputargs, preds_out_args)
-            if block_in != in_states[succ]:
-                # in_state changed
-                to_do.add(succ)
-                in_states[succ] = block_in
-        return to_do
+        # add all successors
+        return {link.target for link in block.exits}
+
+    def _update_in_state_of(self, block, entrymap, in_states, out_states):
+        # collect all out_states of predecessors:
+        preds_outs = []
+        inputargs = block.inputargs
+        preds_out_args = [[] for _ in inputargs]
+        for link in entrymap[block]:
+            pred = link.prevblock
+            if pred is None:
+                # block == startblock
+                return True
+            preds_outs.append(out_states[pred])
+            for i in range(len(inputargs)):
+                preds_out_args[i].append(link.args[i])
+        # join predecessor out_states for updated in_state:
+        block_in = self.join_operation(preds_outs, inputargs, preds_out_args)
+        if block_in != in_states[block]:
+            # in_state changed
+            in_states[block] = block_in
+            return True
+        return False
+
 
 
     def calculate(self, graph, entrymap=None):
@@ -81,8 +87,10 @@
         pending = {graph.startblock,}
         while pending:
             block = pending.pop()
-            block_out = self.transfer_function(block, in_states[block])
-            pending |= self._update_successor_blocks(
-                block, block_out, entrymap, in_states, out_states)
+            if self._update_in_state_of(block, entrymap, in_states, out_states):
+                block_out = self.transfer_function(block, in_states[block])
+                if block_out != out_states[block]:
+                    out_states[block] = block_out
+                    pending |= {link.target for link in block.exits}
         #
         return in_states, out_states
diff --git a/rpython/translator/backendopt/test/test_dataflow.py b/rpython/translator/backendopt/test/test_dataflow.py
--- a/rpython/translator/backendopt/test/test_dataflow.py
+++ b/rpython/translator/backendopt/test/test_dataflow.py
@@ -59,7 +59,6 @@
     g = t.buildflowgraph(f)
     sfa = SimpleForwardAnalysis()
     ins, outs = sfa.calculate(g)
-    g.show()
     assert len(sfa.seen) == 5
     assert ins[g.startblock] == sfa.entry_state(None)
     assert outs[g.returnblock] == sfa.entry_state(None)


More information about the pypy-commit mailing list