1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2013 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/hydrogen-environment-liveness.h" 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHEnvironmentLivenessAnalysisPhase::HEnvironmentLivenessAnalysisPhase( 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HGraph* graph) 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HPhase("H_Environment liveness analysis", graph), 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch block_count_(graph->blocks()->length()), 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch maximum_environment_size_(graph->maximum_environment_size()), 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch live_at_block_start_(block_count_, zone()), 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch first_simulate_(block_count_, zone()), 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch first_simulate_invalid_for_index_(block_count_, zone()), 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch markers_(maximum_environment_size_, zone()), 22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch collect_markers_(true), 23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_simulate_(NULL), 24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch went_live_since_last_simulate_(maximum_environment_size_, zone()) { 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(maximum_environment_size_ > 0); 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < block_count_; ++i) { 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch live_at_block_start_.Add( 28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) BitVector(maximum_environment_size_, zone()), zone()); 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch first_simulate_.Add(NULL, zone()); 30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch first_simulate_invalid_for_index_.Add( 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new(zone()) BitVector(maximum_environment_size_, zone()), zone()); 32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HEnvironmentLivenessAnalysisPhase::ZapEnvironmentSlot( 37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index, HSimulate* simulate) { 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int operand_index = simulate->ToOperandIndex(index); 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (operand_index == -1) { 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch simulate->AddAssignedValue(index, graph()->GetConstantUndefined()); 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch simulate->SetOperandAt(operand_index, graph()->GetConstantUndefined()); 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HEnvironmentLivenessAnalysisPhase::ZapEnvironmentSlotsInSuccessors( 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* block, BitVector* live) { 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // When a value is live in successor A but dead in B, we must 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // explicitly zap it in B. 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (HSuccessorIterator it(block->end()); !it.Done(); it.Advance()) { 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* successor = it.Current(); 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int successor_id = successor->block_id(); 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitVector* live_in_successor = live_at_block_start_[successor_id]; 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (live_in_successor->Equals(*live)) continue; 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < live->length(); ++i) { 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!live->Contains(i)) continue; 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (live_in_successor->Contains(i)) continue; 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (first_simulate_invalid_for_index_.at(successor_id)->Contains(i)) { 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch continue; 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSimulate* simulate = first_simulate_.at(successor_id); 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (simulate == NULL) continue; 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(VerifyClosures(simulate->closure(), 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch block->last_environment()->closure())); 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZapEnvironmentSlot(i, simulate); 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HEnvironmentLivenessAnalysisPhase::ZapEnvironmentSlotsForInstruction( 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnvironmentMarker* marker) { 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!marker->CheckFlag(HValue::kEndsLiveRange)) return; 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSimulate* simulate = marker->next_simulate(); 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (simulate != NULL) { 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(VerifyClosures(simulate->closure(), marker->closure())); 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZapEnvironmentSlot(marker->index(), simulate); 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HEnvironmentLivenessAnalysisPhase::UpdateLivenessAtBlockEnd( 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* block, 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitVector* live) { 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Liveness at the end of each block: union of liveness in successors. 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch live->Clear(); 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (HSuccessorIterator it(block->end()); !it.Done(); it.Advance()) { 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch live->Union(*live_at_block_start_[it.Current()->block_id()]); 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HEnvironmentLivenessAnalysisPhase::UpdateLivenessAtInstruction( 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* instr, 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitVector* live) { 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (instr->opcode()) { 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case HValue::kEnvironmentMarker: { 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnvironmentMarker* marker = HEnvironmentMarker::cast(instr); 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = marker->index(); 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!live->Contains(index)) { 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch marker->SetFlag(HValue::kEndsLiveRange); 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch marker->ClearFlag(HValue::kEndsLiveRange); 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!went_live_since_last_simulate_.Contains(index)) { 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch marker->set_next_simulate(last_simulate_); 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (marker->kind() == HEnvironmentMarker::LOOKUP) { 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch live->Add(index); 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(marker->kind() == HEnvironmentMarker::BIND); 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch live->Remove(index); 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch went_live_since_last_simulate_.Add(index); 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (collect_markers_) { 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Populate |markers_| list during the first pass. 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch markers_.Add(marker, zone()); 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case HValue::kLeaveInlined: 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // No environment values are live at the end of an inlined section. 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch live->Clear(); 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_simulate_ = NULL; 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The following DCHECKs guard the assumption used in case 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kEnterInlined below: 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->next()->IsSimulate()); 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(instr->next()->next()->IsGoto()); 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case HValue::kEnterInlined: { 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Those environment values are live that are live at any return 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // target block. Here we make use of the fact that the end of an 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // inline sequence always looks like this: HLeaveInlined, HSimulate, 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // HGoto (to return_target block), with no environment lookups in 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // between (see DCHECKs above). 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnterInlined* enter = HEnterInlined::cast(instr); 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch live->Clear(); 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < enter->return_targets()->length(); ++i) { 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int return_id = enter->return_targets()->at(i)->block_id(); 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch live->Union(*live_at_block_start_[return_id]); 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_simulate_ = NULL; 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case HValue::kSimulate: 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_simulate_ = HSimulate::cast(instr); 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch went_live_since_last_simulate_.Clear(); 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid HEnvironmentLivenessAnalysisPhase::Run() { 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(maximum_environment_size_ > 0); 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Main iteration. Compute liveness of environment slots, and store it 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // for each block until it doesn't change any more. For efficiency, visit 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // blocks in reverse order and walk backwards through each block. We 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // need several iterations to propagate liveness through nested loops. 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitVector live(maximum_environment_size_, zone()); 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitVector worklist(block_count_, zone()); 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < block_count_; ++i) { 168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch worklist.Add(i); 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (!worklist.IsEmpty()) { 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int block_id = block_count_ - 1; block_id >= 0; --block_id) { 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!worklist.Contains(block_id)) { 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch continue; 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch worklist.Remove(block_id); 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch last_simulate_ = NULL; 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* block = graph()->blocks()->at(block_id); 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UpdateLivenessAtBlockEnd(block, &live); 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (HInstruction* instr = block->end(); instr != NULL; 182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr = instr->previous()) { 183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UpdateLivenessAtInstruction(instr, &live); 184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Reached the start of the block, do necessary bookkeeping: 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // store computed information for this block and add predecessors 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to the work list as necessary. 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch first_simulate_.Set(block_id, last_simulate_); 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch first_simulate_invalid_for_index_[block_id]->CopyFrom( 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch went_live_since_last_simulate_); 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (live_at_block_start_[block_id]->UnionIsChanged(live)) { 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < block->predecessors()->length(); ++i) { 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch worklist.Add(block->predecessors()->at(i)->block_id()); 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (block->IsInlineReturnTarget()) { 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch worklist.Add(block->inlined_entry_block()->block_id()); 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Only collect bind/lookup instructions during the first pass. 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch collect_markers_ = false; 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Analysis finished. Zap dead environment slots. 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < markers_.length(); ++i) { 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZapEnvironmentSlotsForInstruction(markers_[i]); 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int block_id = block_count_ - 1; block_id >= 0; --block_id) { 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* block = graph()->blocks()->at(block_id); 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UpdateLivenessAtBlockEnd(block, &live); 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZapEnvironmentSlotsInSuccessors(block, &live); 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Finally, remove the HEnvironment{Bind,Lookup} markers. 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < markers_.length(); ++i) { 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch markers_[i]->DeleteAndReplaceWith(NULL); 218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochbool HEnvironmentLivenessAnalysisPhase::VerifyClosures( 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> a, Handle<JSFunction> b) { 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Heap::RelocationLock for_heap_access(isolate()->heap()); 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllowHandleDereference for_verification; 227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return a.is_identical_to(b); 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} } // namespace v8::internal 232