// Copyright 2013 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_HYDROGEN_OSR_H_
#define V8_HYDROGEN_OSR_H_

#include "src/hydrogen.h"
#include "src/ast.h"
#include "src/zone.h"

namespace v8 {
namespace internal {

// Responsible for building graph parts related to OSR and otherwise
// setting up the graph to do an OSR compile.
class HOsrBuilder : public ZoneObject {
 public:
  explicit HOsrBuilder(HOptimizedGraphBuilder* builder)
    : unoptimized_frame_slots_(0),
      builder_(builder),
      osr_entry_(NULL),
      osr_loop_entry_(NULL),
      osr_values_(NULL) { }

  // Creates the loop entry block for the given statement, setting up OSR
  // entries as necessary, and sets the current block to the new block.
  HBasicBlock* BuildOsrLoopEntry(IterationStatement* statement);

  // Process the hydrogen graph after it has been completed, performing
  // any OSR-specific cleanups or changes.
  void FinishGraph();

  // Process the OSR values and phis after initial graph optimization.
  void FinishOsrValues();

  // Return the number of slots in the unoptimized frame at the entry to OSR.
  int UnoptimizedFrameSlots() const {
    return unoptimized_frame_slots_;
  }

  bool HasOsrEntryAt(IterationStatement* statement);

 private:
  int unoptimized_frame_slots_;
  HOptimizedGraphBuilder* builder_;
  HBasicBlock* osr_entry_;
  HBasicBlock* osr_loop_entry_;
  ZoneList<HUnknownOSRValue*>* osr_values_;
};

} }  // namespace v8::internal

#endif  // V8_HYDROGEN_OSR_H_
