[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