Chromium Code Reviews| Index: src/compiler/liveness-analyzer.h |
| diff --git a/src/compiler/liveness-analyzer.h b/src/compiler/liveness-analyzer.h |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..ce41610e8f433323641182893c3a9115477cd422 |
| --- /dev/null |
| +++ b/src/compiler/liveness-analyzer.h |
| @@ -0,0 +1,151 @@ |
| +// Copyright 2015 the V8 project authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#ifndef V8_COMPILER_LIVENESS_ANAYZER_H_ |
| +#define V8_COMPILER_LIVENESS_ANAYZER_H_ |
| + |
| +#include "src/bit-vector.h" |
| +#include "src/compiler/node.h" |
| +#include "src/zone-containers.h" |
| + |
| +namespace v8 { |
| +namespace internal { |
| +namespace compiler { |
| + |
| +class LivenessAnalyzerBlock; |
| +class Node; |
| +class StateValuesCache; |
| + |
| + |
| +class NonLiveFrameStateSlotReplacer { |
| + public: |
| + void ClearNonLiveFrameStateSlots(Node* frame_state, BitVector* liveness); |
| + NonLiveFrameStateSlotReplacer(StateValuesCache* state_values_cache, |
| + Node* replacement, size_t local_count, |
| + Zone* local_zone) |
| + : replacement_node_(replacement), |
| + state_values_cache_(state_values_cache), |
| + local_zone_(local_zone), |
| + permanently_live_(local_count == 0 ? 1 : static_cast<int>(local_count), |
| + local_zone), |
| + inputs_buffer_(local_zone) {} |
| + |
| + void MarkPermanentlyLive(int var) { permanently_live_.Add(var); } |
| + |
| + private: |
| + Node* ClearNonLiveStateValues(Node* frame_state, BitVector* liveness); |
| + |
| + StateValuesCache* state_values_cache() { return state_values_cache_; } |
| + Zone* local_zone() { return local_zone_; } |
| + |
| + // Node that replaces dead values. |
| + Node* replacement_node_; |
| + // Reference to state values cache so that we can create state values |
| + // nodes. |
| + StateValuesCache* state_values_cache_; |
| + |
| + Zone* local_zone_; |
| + BitVector permanently_live_; |
| + NodeVector inputs_buffer_; |
| +}; |
| + |
| + |
| +class LivenessAnalyzer : public ZoneObject { |
|
Benedikt Meurer
2015/03/17 05:12:03
Chromium style guide nit (see above): No need to i
Jarin
2015/03/17 09:22:57
Done.
|
| + public: |
| + LivenessAnalyzer(size_t local_count, Zone* zone); |
| + |
| + LivenessAnalyzerBlock* New(); |
|
Benedikt Meurer
2015/03/17 05:12:03
Nit: Rename to NewBlock.
Jarin
2015/03/17 09:22:57
Done.
|
| + LivenessAnalyzerBlock* New(LivenessAnalyzerBlock* predecessor); |
|
Benedikt Meurer
2015/03/17 05:12:03
Nit: Rename to NewBlock.
Jarin
2015/03/17 09:22:57
Done.
|
| + |
| + void Run(NonLiveFrameStateSlotReplacer* relaxer); |
| + |
| + Zone* zone() { return zone_; } |
| + |
| + void Print(std::ostream& os); |
| + |
| + size_t local_count() { return local_count_; } |
| + |
| + private: |
| + void Queue(LivenessAnalyzerBlock* block); |
| + |
| + Zone* zone_; |
| + ZoneDeque<LivenessAnalyzerBlock*> blocks_; |
| + size_t local_count_; |
| + |
| + ZoneQueue<LivenessAnalyzerBlock*> queue_; |
| +}; |
| + |
| + |
| +class LivenessAnalyzerBlock : public ZoneObject { |
| + public: |
| + friend class LivenessAnalyzer; |
| + |
| + void Lookup(int var) { entries_.push_back(Entry(Entry::kLookup, var)); } |
| + void Bind(int var) { entries_.push_back(Entry(Entry::kBind, var)); } |
| + void Checkpoint(Node* node) { entries_.push_back(Entry(node)); } |
| + void AddPredecessor(LivenessAnalyzerBlock* b) { predecessors_.push_back(b); } |
| + |
| + private: |
| + class Entry { |
| + public: |
| + enum Kind { kBind, kLookup, kCheckpoint }; |
| + |
| + Kind kind() const { return kind_; } |
| + Node* node() const { |
| + DCHECK(kind() == kCheckpoint); |
| + return node_; |
| + } |
| + int var() const { |
| + DCHECK(kind() != kCheckpoint); |
| + return var_; |
| + } |
| + |
| + explicit Entry(Node* node) : kind_(kCheckpoint), var_(-1), node_(node) {} |
| + Entry(Kind kind, int var) : kind_(kind), var_(var), node_(nullptr) { |
| + DCHECK(kind != kCheckpoint); |
| + } |
| + |
| + private: |
| + Kind kind_; |
| + int var_; |
| + Node* node_; |
| + }; |
| + |
| + LivenessAnalyzerBlock(size_t id, size_t local_count, Zone* zone) |
|
Benedikt Meurer
2015/03/17 05:12:03
Nit: Move implementation to .cc file.
Jarin
2015/03/17 09:22:57
Done.
|
| + : entries_(zone), |
| + predecessors_(zone), |
| + live_(local_count == 0 ? 1 : static_cast<int>(local_count), zone), |
| + queued_(false), |
| + id_(id) {} |
| + void Process(BitVector* result, NonLiveFrameStateSlotReplacer* relaxer); |
| + bool UpdateLive(BitVector* working_area); |
| + |
| + void SetQueued() { queued_ = true; } |
| + bool IsQueued() { return queued_; } |
| + |
| + ZoneDeque<LivenessAnalyzerBlock*>::const_iterator pred_begin() { |
| + return predecessors_.begin(); |
| + } |
| + ZoneDeque<LivenessAnalyzerBlock*>::const_iterator pred_end() { |
| + return predecessors_.end(); |
| + } |
| + |
| + size_t id() { return id_; } |
| + void Print(std::ostream& os); |
| + |
| + ZoneDeque<Entry> entries_; |
| + ZoneDeque<LivenessAnalyzerBlock*> predecessors_; |
| + |
| + BitVector live_; |
| + bool queued_; |
| + |
| + size_t id_; |
| +}; |
| + |
| + |
| +} // namespace compiler |
| +} // namespace internal |
| +} // namespace v8 |
| + |
| +#endif // V8_COMPILER_AST_GRAPH_BUILDER_H_ |