// Copyright 2014 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.

#include "src/v8.h"
#include "test/cctest/cctest.h"

#include "src/compiler/common-operator.h"
#include "src/compiler/graph.h"
#include "src/compiler/graph-visualizer.h"
#include "src/compiler/js-operator.h"
#include "src/compiler/machine-operator.h"
#include "src/compiler/node.h"
#include "src/compiler/operator.h"
#include "src/compiler/schedule.h"
#include "src/compiler/scheduler.h"
#include "src/compiler/verifier.h"

using namespace v8::internal;
using namespace v8::internal::compiler;

TEST(NodeWithNullInputReachableFromEnd) {
  HandleAndZoneScope scope;
  Graph graph(scope.main_zone());
  CommonOperatorBuilder common(scope.main_zone());

  Node* start = graph.NewNode(common.Start(0));
  graph.SetStart(start);
  Node* k = graph.NewNode(common.Int32Constant(0));
  Node* phi = graph.NewNode(common.Phi(kMachAnyTagged, 1), k, start);
  phi->ReplaceInput(0, NULL);
  graph.SetEnd(phi);

  OFStream os(stdout);
  os << AsDOT(graph);
  os << AsJSON(graph);
}


TEST(NodeWithNullControlReachableFromEnd) {
  HandleAndZoneScope scope;
  Graph graph(scope.main_zone());
  CommonOperatorBuilder common(scope.main_zone());

  Node* start = graph.NewNode(common.Start(0));
  graph.SetStart(start);
  Node* k = graph.NewNode(common.Int32Constant(0));
  Node* phi = graph.NewNode(common.Phi(kMachAnyTagged, 1), k, start);
  phi->ReplaceInput(1, NULL);
  graph.SetEnd(phi);

  OFStream os(stdout);
  os << AsDOT(graph);
  os << AsJSON(graph);
}


TEST(NodeWithNullInputReachableFromStart) {
  HandleAndZoneScope scope;
  Graph graph(scope.main_zone());
  CommonOperatorBuilder common(scope.main_zone());

  Node* start = graph.NewNode(common.Start(0));
  graph.SetStart(start);
  Node* k = graph.NewNode(common.Int32Constant(0));
  Node* phi = graph.NewNode(common.Phi(kMachAnyTagged, 1), k, start);
  phi->ReplaceInput(0, NULL);
  graph.SetEnd(start);

  OFStream os(stdout);
  os << AsDOT(graph);
  os << AsJSON(graph);
}


TEST(NodeWithNullControlReachableFromStart) {
  HandleAndZoneScope scope;
  Graph graph(scope.main_zone());
  CommonOperatorBuilder common(scope.main_zone());

  Node* start = graph.NewNode(common.Start(0));
  graph.SetStart(start);
  Node* merge = graph.NewNode(common.Merge(2), start, start);
  merge->ReplaceInput(1, NULL);
  graph.SetEnd(merge);

  OFStream os(stdout);
  os << AsDOT(graph);
  os << AsJSON(graph);
}
