| 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..1e2f85b45e5f2fc7e646893baa52e7d7b166c28a
|
| --- /dev/null
|
| +++ b/src/compiler/liveness-analyzer.h
|
| @@ -0,0 +1,146 @@
|
| +// 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:
|
| + LivenessAnalyzer(size_t local_count, Zone* zone);
|
| +
|
| + LivenessAnalyzerBlock* NewBlock();
|
| + LivenessAnalyzerBlock* NewBlock(LivenessAnalyzerBlock* predecessor);
|
| +
|
| + 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:
|
| + 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);
|
| + 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_
|
|
|