diff options
author | Trevor Norris <trev.norris@gmail.com> | 2013-07-22 15:26:27 -0700 |
---|---|---|
committer | Trevor Norris <trev.norris@gmail.com> | 2013-07-22 15:53:10 -0700 |
commit | 5777d7ab3038983d368046ab40eb34075f635348 (patch) | |
tree | da7c01759b83e7afa463cbaac095a051f158eb44 /deps/v8/src/hydrogen-gvn.cc | |
parent | 254b711155996e379a41a569a38dd98dbd7a6e47 (diff) | |
download | node-new-5777d7ab3038983d368046ab40eb34075f635348.tar.gz |
v8: upgrade to v8 3.20.7
Diffstat (limited to 'deps/v8/src/hydrogen-gvn.cc')
-rw-r--r-- | deps/v8/src/hydrogen-gvn.cc | 65 |
1 files changed, 33 insertions, 32 deletions
diff --git a/deps/v8/src/hydrogen-gvn.cc b/deps/v8/src/hydrogen-gvn.cc index 7ea2f162bf..09bea5bb18 100644 --- a/deps/v8/src/hydrogen-gvn.cc +++ b/deps/v8/src/hydrogen-gvn.cc @@ -123,6 +123,7 @@ void TraceGVN(const char* msg, ...) { va_end(arguments); } + // Wrap TraceGVN in macros to avoid the expense of evaluating its arguments when // --trace-gvn is off. #define TRACE_GVN_1(msg, a1) \ @@ -339,6 +340,7 @@ HSideEffectMap& HSideEffectMap::operator= (const HSideEffectMap& other) { return *this; } + void HSideEffectMap::Kill(GVNFlagSet flags) { for (int i = 0; i < kNumberOfTrackedSideEffects; i++) { GVNFlag changes_flag = HValue::ChangesFlagFromInt(i); @@ -366,7 +368,7 @@ HGlobalValueNumberingPhase::HGlobalValueNumberingPhase(HGraph* graph) removed_side_effects_(false), block_side_effects_(graph->blocks()->length(), zone()), loop_side_effects_(graph->blocks()->length(), zone()), - visited_on_paths_(zone(), graph->blocks()->length()) { + visited_on_paths_(graph->blocks()->length(), zone()) { ASSERT(!AllowHandleAllocation::IsAllowed()); block_side_effects_.AddBlock(GVNFlagSet(), graph->blocks()->length(), zone()); @@ -619,7 +621,8 @@ HGlobalValueNumberingPhase::CollectSideEffectsOnPathsToDominatedBlock( HBasicBlock* block = dominated->predecessors()->at(i); if (dominator->block_id() < block->block_id() && block->block_id() < dominated->block_id() && - visited_on_paths_.Add(block->block_id())) { + !visited_on_paths_.Contains(block->block_id())) { + visited_on_paths_.Add(block->block_id()); side_effects.Add(block_side_effects_[block->block_id()]); if (block->IsLoopHeader()) { side_effects.Add(loop_side_effects_[block->block_id()]); @@ -709,22 +712,18 @@ class GvnBasicBlockState: public ZoneObject { zone); return this; } else if (dominated_index_ < length_) { - return push(zone, - block_->dominated_blocks()->at(dominated_index_), - dominators()); + return push(zone, block_->dominated_blocks()->at(dominated_index_)); } else { return NULL; } } - GvnBasicBlockState* push(Zone* zone, - HBasicBlock* block, - HSideEffectMap* dominators) { + GvnBasicBlockState* push(Zone* zone, HBasicBlock* block) { if (next_ == NULL) { next_ = - new(zone) GvnBasicBlockState(this, block, map(), dominators, zone); + new(zone) GvnBasicBlockState(this, block, map(), dominators(), zone); } else { - next_->Initialize(block, map(), dominators, true, zone); + next_->Initialize(block, map(), dominators(), true, zone); } return next_; } @@ -748,6 +747,7 @@ class GvnBasicBlockState: public ZoneObject { int length_; }; + // This is a recursive traversal of the dominator tree but it has been turned // into a loop to avoid stack overflows. // The logical "stack frames" of the recursion are kept in a list of @@ -770,12 +770,32 @@ void HGlobalValueNumberingPhase::AnalyzeGraph() { // If this is a loop header kill everything killed by the loop. if (block->IsLoopHeader()) { map->Kill(loop_side_effects_[block->block_id()]); + dominators->Kill(loop_side_effects_[block->block_id()]); } // Go through all instructions of the current block. - HInstruction* instr = block->first(); - while (instr != NULL) { - HInstruction* next = instr->next(); + for (HInstructionIterator it(block); !it.Done(); it.Advance()) { + HInstruction* instr = it.Current(); + if (instr->CheckFlag(HValue::kTrackSideEffectDominators)) { + for (int i = 0; i < kNumberOfTrackedSideEffects; i++) { + HValue* other = dominators->at(i); + GVNFlag changes_flag = HValue::ChangesFlagFromInt(i); + GVNFlag depends_on_flag = HValue::DependsOnFlagFromInt(i); + if (instr->DependsOnFlags().Contains(depends_on_flag) && + (other != NULL)) { + TRACE_GVN_5("Side-effect #%d in %d (%s) is dominated by %d (%s)\n", + i, + instr->id(), + instr->Mnemonic(), + other->id(), + other->Mnemonic()); + instr->HandleSideEffectDominator(changes_flag, other); + } + } + } + // Instruction was unlinked during graph traversal. + if (!instr->IsLinked()) continue; + GVNFlagSet flags = instr->ChangesFlags(); if (!flags.IsEmpty()) { // Clear all instructions in the map that are affected by side effects. @@ -801,25 +821,6 @@ void HGlobalValueNumberingPhase::AnalyzeGraph() { map->Add(instr, zone()); } } - if (instr->IsLinked() && - instr->CheckFlag(HValue::kTrackSideEffectDominators)) { - for (int i = 0; i < kNumberOfTrackedSideEffects; i++) { - HValue* other = dominators->at(i); - GVNFlag changes_flag = HValue::ChangesFlagFromInt(i); - GVNFlag depends_on_flag = HValue::DependsOnFlagFromInt(i); - if (instr->DependsOnFlags().Contains(depends_on_flag) && - (other != NULL)) { - TRACE_GVN_5("Side-effect #%d in %d (%s) is dominated by %d (%s)\n", - i, - instr->id(), - instr->Mnemonic(), - other->id(), - other->Mnemonic()); - instr->SetSideEffectDominator(changes_flag, other); - } - } - } - instr = next; } HBasicBlock* dominator_block; |