From ddb4ad853bbfe297c8ccfddaf479e211ac4e96e8 Mon Sep 17 00:00:00 2001 From: "titzer@chromium.org" Date: Wed, 27 Nov 2013 07:13:00 +0000 Subject: [PATCH] Avoid copying flow-sensitive state when only a goto separates blocks. BUG= R=mvstanton@chromium.org Review URL: https://codereview.chromium.org/48353007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18090 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen-flow-engine.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/hydrogen-flow-engine.h b/src/hydrogen-flow-engine.h index dfe43ec6c3..4e1275546f 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_));