Reviewers: mvstanton,
Message:
In the situation where one block leads directly into another block with a
goto,
and the successor block has no other predecessors, we can inherit the
flow-sensitive state, avoiding a copy.
Experiments on Octane show that 40% of copies can be avoided.
Description:
Avoid copying flow-sensitive state when only a goto separates blocks.
BUG=
Please review this at https://codereview.chromium.org/48353007/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+9, -2 lines):
M src/hydrogen-flow-engine.h
Index: src/hydrogen-flow-engine.h
diff --git a/src/hydrogen-flow-engine.h b/src/hydrogen-flow-engine.h
index
dfe43ec6c3ba94b3c38ee2aa2fb4c561ea390919..4e1275546f611e2401e467484976f73d59b3e784
100644
--- a/src/hydrogen-flow-engine.h
+++ b/src/hydrogen-flow-engine.h
@@ -138,12 +138,19 @@ class HFlowEngine {
}
// Propagate the block state forward to all successor blocks.
- for (int i = 0; i < block->end()->SuccessorCount(); i++) {
+ int max = block->end()->SuccessorCount();
+ for (int i = 0; i < max; i++) {
HBasicBlock* succ = block->end()->SuccessorAt(i);
IncrementPredecessorCount(succ);
if (StateAt(succ) == NULL) {
// This is the first state to reach the successor.
- SetStateAt(succ, state->Copy(succ, zone_));
+ if (max == 1 && succ->predecessors()->length() == 1) {
+ // Optimization: successor can inherit this state.
+ SetStateAt(succ, state);
+ } else {
+ // Successor needs a copy of the state.
+ SetStateAt(succ, state->Copy(succ, zone_));
+ }
} else {
// Merge the current state with the state already at the
successor.
SetStateAt(succ, state->Merge(succ, StateAt(succ), zone_));
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.