// 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_LIVE_RANGE_SEPARATOR_H_
#define V8_LIVE_RANGE_SEPARATOR_H_


#include <src/zone.h>
namespace v8 {
namespace internal {

class Zone;

namespace compiler {

class RegisterAllocationData;


// A register allocation pair of transformations: splinter and merge live ranges
class LiveRangeSeparator final : public ZoneObject {
 public:
  LiveRangeSeparator(RegisterAllocationData* data, Zone* zone)
      : data_(data), zone_(zone) {}

  void Splinter();

 private:
  RegisterAllocationData* data() const { return data_; }
  Zone* zone() const { return zone_; }

  RegisterAllocationData* const data_;
  Zone* const zone_;

  DISALLOW_COPY_AND_ASSIGN(LiveRangeSeparator);
};


class LiveRangeMerger final : public ZoneObject {
 public:
  LiveRangeMerger(RegisterAllocationData* data, Zone* zone)
      : data_(data), zone_(zone) {}

  void Merge();

 private:
  RegisterAllocationData* data() const { return data_; }
  Zone* zone() const { return zone_; }

  // Mark ranges spilled in deferred blocks, that also cover non-deferred code.
  // We do nothing special for ranges fully contained in deferred blocks,
  // because they would "spill in deferred blocks" anyway.
  void MarkRangesSpilledInDeferredBlocks();

  RegisterAllocationData* const data_;
  Zone* const zone_;

  DISALLOW_COPY_AND_ASSIGN(LiveRangeMerger);
};


}  // namespace compiler
}  // namespace internal
}  // namespace v8
#endif  // V8_LIVE_RANGE_SEPARATOR_H_
