From: bmeurer@chromium.org Date: Tue, 11 Mar 2014 08:14:38 +0000 (+0000) Subject: Really skip dead blocks in GVN X-Git-Tag: upstream/4.7.83~10401 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a7ead1671906200011583069035dab62f4d423a0;p=platform%2Fupstream%2Fv8.git Really skip dead blocks in GVN R=svenpanne@chromium.org Review URL: https://codereview.chromium.org/194413002 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@19779 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/hydrogen-gvn.cc b/src/hydrogen-gvn.cc index 4c98015..827ad27 100644 --- a/src/hydrogen-gvn.cc +++ b/src/hydrogen-gvn.cc @@ -592,7 +592,9 @@ void HGlobalValueNumberingPhase::LoopInvariantCodeMotion() { graph()->use_optimistic_licm() ? "yes" : "no"); for (int i = graph()->blocks()->length() - 1; i >= 0; --i) { HBasicBlock* block = graph()->blocks()->at(i); - if (block->IsLoopHeader()) { + if (block->IsLoopHeader() && + block->IsReachable() && + !block->IsDeoptimizing()) { SideEffects side_effects = loop_side_effects_[block->block_id()]; if (FLAG_trace_gvn) { HeapStringAllocator allocator; @@ -616,6 +618,7 @@ void HGlobalValueNumberingPhase::ProcessLoopBlock( HBasicBlock* block, HBasicBlock* loop_header, SideEffects loop_kills) { + if (!block->IsReachable() || block->IsDeoptimizing()) return; HBasicBlock* pre_header = loop_header->predecessors()->at(0); if (FLAG_trace_gvn) { HeapStringAllocator allocator; @@ -680,10 +683,8 @@ bool HGlobalValueNumberingPhase::AllowCodeMotion() { bool HGlobalValueNumberingPhase::ShouldMove(HInstruction* instr, HBasicBlock* loop_header) { - // If we've disabled code motion or we're in a block that unconditionally - // deoptimizes, don't move any instructions. - return AllowCodeMotion() && !instr->block()->IsDeoptimizing() && - instr->block()->IsReachable(); + // If we've disabled code motion, don't move any instructions. + return AllowCodeMotion(); } @@ -776,20 +777,18 @@ class GvnBasicBlockState: public ZoneObject { } GvnBasicBlockState* next_dominated(Zone* zone) { - dominated_index_++; - if (dominated_index_ == length_ - 1) { - // No need to copy the map for the last child in the dominator tree. - Initialize(block_->dominated_blocks()->at(dominated_index_), - map(), - dominators(), - false, - zone); - return this; - } else if (dominated_index_ < length_) { - return push(zone, block_->dominated_blocks()->at(dominated_index_)); - } else { - return NULL; + while (++dominated_index_ < length_) { + HBasicBlock* block = block_->dominated_blocks()->at(dominated_index_); + if (block->IsReachable()) { + if (dominated_index_ == length_ - 1) { + // No need to copy the map for the last child in the dominator tree. + Initialize(block, map(), dominators(), false, zone); + return this; + } + return push(zone, block); + } } + return NULL; } GvnBasicBlockState* push(Zone* zone, HBasicBlock* block) {