//===- subzero/src/IceRegAlloc.h - Linear-scan reg. allocation --*- C++ -*-===//
//
//                        The Subzero Code Generator
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file declares the LinearScan data structure used during
// linear-scan register allocation, which holds the various work
// queues for the linear-scan algorithm.
//
//===----------------------------------------------------------------------===//

#ifndef SUBZERO_SRC_ICEREGALLOC_H
#define SUBZERO_SRC_ICEREGALLOC_H

#include "IceDefs.h"
#include "IceTypes.h"

namespace Ice {

class LinearScan {
  LinearScan(const LinearScan &) = delete;
  LinearScan &operator=(const LinearScan &) = delete;

public:
  LinearScan(Cfg *Func)
      : Func(Func), FindPreference(false), FindOverlap(false) {}
  void init(RegAllocKind Kind);
  void scan(const llvm::SmallBitVector &RegMask, bool Randomized);
  void dump(Cfg *Func) const;

private:
  typedef std::vector<Variable *> OrderedRanges;
  typedef std::vector<Variable *> UnorderedRanges;

  void initForGlobal();
  void initForInfOnly();
  // Move an item from the From set to the To set.  From[Index] is
  // pushed onto the end of To[], then the item is efficiently removed
  // from From[] by effectively swapping it with the last item in
  // From[] and then popping it from the back.  As such, the caller is
  // best off iterating over From[] in reverse order to avoid the need
  // for special handling of the iterator.
  void moveItem(UnorderedRanges &From, SizeT Index, UnorderedRanges &To) {
    To.push_back(From[Index]);
    From[Index] = From.back();
    From.pop_back();
  }

  Cfg *const Func;
  OrderedRanges Unhandled;
  // UnhandledPrecolored is a subset of Unhandled, specially collected
  // for faster processing.
  OrderedRanges UnhandledPrecolored;
  UnorderedRanges Active, Inactive, Handled;
  std::vector<InstNumberT> Kills;
  bool FindPreference;
  bool FindOverlap;
  // TODO(stichnot): We're not really using FindOverlap yet, but we
  // may want a flavor of register allocation where FindPreference is
  // useful but we didn't want to initialize VMetadata with VMK_All
  // and therefore we can't safely allow overlap.
};

} // end of namespace Ice

#endif // SUBZERO_SRC_ICEREGALLOC_H
