Author: Remi Meier <remi.me...@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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit