From b899185790aa70bf50c631723d4c3b384aec92cc Mon Sep 17 00:00:00 2001 From: "bmeurer@chromium.org" Date: Mon, 8 Jul 2013 08:33:03 +0000 Subject: [PATCH] Turn infer types into proper HPhase. R=dslomov@chromium.org Review URL: https://codereview.chromium.org/18568007 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15535 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen-infer-types.cc | 77 +++++++++++++++++++++++++++++++++++++++++++++ src/hydrogen-infer-types.h | 59 ++++++++++++++++++++++++++++++++++ src/hydrogen.cc | 63 ++----------------------------------- src/hydrogen.h | 3 -- tools/gyp/v8.gyp | 2 ++ 5 files changed, 140 insertions(+), 64 deletions(-) create mode 100644 src/hydrogen-infer-types.cc create mode 100644 src/hydrogen-infer-types.h diff --git a/src/hydrogen-infer-types.cc b/src/hydrogen-infer-types.cc new file mode 100644 index 0000000..01c6084 --- /dev/null +++ b/src/hydrogen-infer-types.cc @@ -0,0 +1,77 @@ +// Copyright 2013 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#include "hydrogen-infer-types.h" + +namespace v8 { +namespace internal { + +void HInferTypesPhase::InferTypes(int from_inclusive, int to_inclusive) { + for (int i = from_inclusive; i <= to_inclusive; ++i) { + HBasicBlock* block = graph()->blocks()->at(i); + + const ZoneList* phis = block->phis(); + for (int j = 0; j < phis->length(); j++) { + phis->at(j)->UpdateInferredType(); + } + + for (HInstructionIterator it(block); !it.Done(); it.Advance()) { + it.Current()->UpdateInferredType(); + } + + if (block->IsLoopHeader()) { + HBasicBlock* last_back_edge = + block->loop_information()->GetLastBackEdge(); + InferTypes(i + 1, last_back_edge->block_id()); + // Skip all blocks already processed by the recursive call. + i = last_back_edge->block_id(); + // Update phis of the loop header now after the whole loop body is + // guaranteed to be processed. + for (int j = 0; j < block->phis()->length(); ++j) { + HPhi* phi = block->phis()->at(j); + worklist_.Add(phi, zone()); + in_worklist_.Add(phi->id()); + } + while (!worklist_.is_empty()) { + HValue* current = worklist_.RemoveLast(); + in_worklist_.Remove(current->id()); + if (current->UpdateInferredType()) { + for (HUseIterator it(current->uses()); !it.Done(); it.Advance()) { + HValue* use = it.value(); + if (!in_worklist_.Contains(use->id())) { + in_worklist_.Add(use->id()); + worklist_.Add(use, zone()); + } + } + } + } + ASSERT(in_worklist_.IsEmpty()); + } + } +} + +} } // namespace v8::internal diff --git a/src/hydrogen-infer-types.h b/src/hydrogen-infer-types.h new file mode 100644 index 0000000..cfcbf35 --- /dev/null +++ b/src/hydrogen-infer-types.h @@ -0,0 +1,59 @@ +// Copyright 2013 the V8 project authors. All rights reserved. +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following +// disclaimer in the documentation and/or other materials provided +// with the distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived +// from this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +#ifndef V8_HYDROGEN_INFER_TYPES_H_ +#define V8_HYDROGEN_INFER_TYPES_H_ + +#include "hydrogen.h" + +namespace v8 { +namespace internal { + + +class HInferTypesPhase : public HPhase { + public: + explicit HInferTypesPhase(HGraph* graph) + : HPhase("H_Inferring types", graph), worklist_(8, zone()), + in_worklist_(graph->GetMaximumValueID(), zone()) { } + + void Run() { + InferTypes(0, graph()->blocks()->length() - 1); + } + + private: + void InferTypes(int from_inclusive, int to_inclusive); + + ZoneList worklist_; + BitVector in_worklist_; + + DISALLOW_COPY_AND_ASSIGN(HInferTypesPhase); +}; + + +} } // namespace v8::internal + +#endif // V8_HYDROGEN_INFER_TYPES_H_ diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 52de326..3a785ac 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -37,6 +37,7 @@ #include "hydrogen-environment-liveness.h" #include "hydrogen-escape-analysis.h" #include "hydrogen-infer-representation.h" +#include "hydrogen-infer-types.h" #include "hydrogen-gvn.h" #include "hydrogen-osr.h" #include "hydrogen-range-analysis.h" @@ -2564,29 +2565,6 @@ void HGraph::CollectPhis() { } -void HGraph::InferTypes(ZoneList* worklist) { - BitVector in_worklist(GetMaximumValueID(), zone()); - for (int i = 0; i < worklist->length(); ++i) { - ASSERT(!in_worklist.Contains(worklist->at(i)->id())); - in_worklist.Add(worklist->at(i)->id()); - } - - while (!worklist->is_empty()) { - HValue* current = worklist->RemoveLast(); - in_worklist.Remove(current->id()); - if (current->UpdateInferredType()) { - for (HUseIterator it(current->uses()); !it.Done(); it.Advance()) { - HValue* use = it.value(); - if (!in_worklist.Contains(use->id())) { - in_worklist.Add(use->id()); - worklist->Add(use, zone()); - } - } - } - } -} - - void HGraph::MergeRemovableSimulates() { HPhase phase("H_Merge removable simulates", this); ZoneList mergelist(2, zone()); @@ -2650,43 +2628,6 @@ void HGraph::MergeRemovableSimulates() { } -void HGraph::InitializeInferredTypes() { - HPhase phase("H_Inferring types", this); - InitializeInferredTypes(0, this->blocks_.length() - 1); -} - - -void HGraph::InitializeInferredTypes(int from_inclusive, int to_inclusive) { - for (int i = from_inclusive; i <= to_inclusive; ++i) { - HBasicBlock* block = blocks_[i]; - - const ZoneList* phis = block->phis(); - for (int j = 0; j < phis->length(); j++) { - phis->at(j)->UpdateInferredType(); - } - - for (HInstructionIterator it(block); !it.Done(); it.Advance()) { - it.Current()->UpdateInferredType(); - } - - if (block->IsLoopHeader()) { - HBasicBlock* last_back_edge = - block->loop_information()->GetLastBackEdge(); - InitializeInferredTypes(i + 1, last_back_edge->block_id()); - // Skip all blocks already processed by the recursive call. - i = last_back_edge->block_id(); - // Update phis of the loop header now after the whole loop body is - // guaranteed to be processed. - ZoneList worklist(block->phis()->length(), zone()); - for (int j = 0; j < block->phis()->length(); ++j) { - worklist.Add(block->phis()->at(j), zone()); - } - InferTypes(&worklist); - } - } -} - - void HGraph::PropagateMinusZeroChecks(HValue* value, BitVector* visited) { HValue* current = value; while (current != NULL) { @@ -3394,7 +3335,7 @@ bool HGraph::Optimize(SmartArrayPointer* bailout_reason) { MarkDeoptimizeOnUndefined(); InsertRepresentationChanges(); - InitializeInferredTypes(); + Run(); // Must be performed before canonicalization to ensure that Canonicalize // will not remove semantically meaningful ToInt32 operations e.g. BIT_OR with diff --git a/src/hydrogen.h b/src/hydrogen.h index 8a7d758..7e4c691 100644 --- a/src/hydrogen.h +++ b/src/hydrogen.h @@ -291,7 +291,6 @@ class HGraph: public ZoneObject { HEnvironment* start_environment() const { return start_environment_; } void FinalizeUniqueValueIds(); - void InitializeInferredTypes(); void InsertTypeConversions(); void MergeRemovableSimulates(); void InsertRepresentationChanges(); @@ -459,8 +458,6 @@ class HGraph: public ZoneObject { int use_index, Representation to); void InsertRepresentationChangesForValue(HValue* value); - void InferTypes(ZoneList* worklist); - void InitializeInferredTypes(int from_inclusive, int to_inclusive); void CheckForBackEdge(HBasicBlock* block, HBasicBlock* successor); void SetupInformativeDefinitionsInBlock(HBasicBlock* block); void SetupInformativeDefinitionsRecursively(HBasicBlock* block); diff --git a/tools/gyp/v8.gyp b/tools/gyp/v8.gyp index 446b752..e251a73 100644 --- a/tools/gyp/v8.gyp +++ b/tools/gyp/v8.gyp @@ -349,6 +349,8 @@ '../../src/hydrogen-gvn.h', '../../src/hydrogen-infer-representation.cc', '../../src/hydrogen-infer-representation.h', + '../../src/hydrogen-infer-types.cc', + '../../src/hydrogen-infer-types.h', '../../src/hydrogen-range-analysis.cc', '../../src/hydrogen-range-analysis.h', '../../src/hydrogen-redundant-phi.cc', -- 2.7.4