Home | History | Annotate | Download | only in compiler
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/compiler/common-operator.h"
      6 #include "src/compiler/graph.h"
      7 #include "src/compiler/graph-visualizer.h"
      8 #include "src/compiler/js-operator.h"
      9 #include "src/compiler/machine-operator.h"
     10 #include "src/compiler/node.h"
     11 #include "src/compiler/operator.h"
     12 #include "src/compiler/schedule.h"
     13 #include "src/compiler/scheduler.h"
     14 #include "src/compiler/source-position.h"
     15 #include "src/compiler/verifier.h"
     16 #include "test/cctest/cctest.h"
     17 
     18 namespace v8 {
     19 namespace internal {
     20 namespace compiler {
     21 
     22 static Operator dummy_operator1(IrOpcode::kParameter, Operator::kNoWrite,
     23                                 "dummy", 1, 0, 0, 1, 0, 0);
     24 static Operator dummy_operator6(IrOpcode::kParameter, Operator::kNoWrite,
     25                                 "dummy", 6, 0, 0, 1, 0, 0);
     26 
     27 
     28 TEST(NodeWithNullInputReachableFromEnd) {
     29   HandleAndZoneScope scope;
     30   Graph graph(scope.main_zone());
     31   CommonOperatorBuilder common(scope.main_zone());
     32 
     33   Node* start = graph.NewNode(common.Start(0));
     34   graph.SetStart(start);
     35   Node* k = graph.NewNode(common.Int32Constant(0));
     36   Node* phi =
     37       graph.NewNode(common.Phi(MachineRepresentation::kTagged, 1), k, start);
     38   phi->ReplaceInput(0, NULL);
     39   graph.SetEnd(phi);
     40 
     41   OFStream os(stdout);
     42   SourcePositionTable table(&graph);
     43   os << AsJSON(graph, &table);
     44 }
     45 
     46 
     47 TEST(NodeWithNullControlReachableFromEnd) {
     48   HandleAndZoneScope scope;
     49   Graph graph(scope.main_zone());
     50   CommonOperatorBuilder common(scope.main_zone());
     51 
     52   Node* start = graph.NewNode(common.Start(0));
     53   graph.SetStart(start);
     54   Node* k = graph.NewNode(common.Int32Constant(0));
     55   Node* phi =
     56       graph.NewNode(common.Phi(MachineRepresentation::kTagged, 1), k, start);
     57   phi->ReplaceInput(1, NULL);
     58   graph.SetEnd(phi);
     59 
     60   OFStream os(stdout);
     61   SourcePositionTable table(&graph);
     62   os << AsJSON(graph, &table);
     63 }
     64 
     65 
     66 TEST(NodeWithNullInputReachableFromStart) {
     67   HandleAndZoneScope scope;
     68   Graph graph(scope.main_zone());
     69   CommonOperatorBuilder common(scope.main_zone());
     70 
     71   Node* start = graph.NewNode(common.Start(0));
     72   graph.SetStart(start);
     73   Node* k = graph.NewNode(common.Int32Constant(0));
     74   Node* phi =
     75       graph.NewNode(common.Phi(MachineRepresentation::kTagged, 1), k, start);
     76   phi->ReplaceInput(0, NULL);
     77   graph.SetEnd(start);
     78 
     79   OFStream os(stdout);
     80   SourcePositionTable table(&graph);
     81   os << AsJSON(graph, &table);
     82 }
     83 
     84 
     85 TEST(NodeWithNullControlReachableFromStart) {
     86   HandleAndZoneScope scope;
     87   Graph graph(scope.main_zone());
     88   CommonOperatorBuilder common(scope.main_zone());
     89 
     90   Node* start = graph.NewNode(common.Start(0));
     91   graph.SetStart(start);
     92   Node* merge = graph.NewNode(common.Merge(2), start, start);
     93   merge->ReplaceInput(1, NULL);
     94   graph.SetEnd(merge);
     95 
     96   OFStream os(stdout);
     97   SourcePositionTable table(&graph);
     98   os << AsJSON(graph, &table);
     99 }
    100 
    101 
    102 TEST(NodeNetworkOfDummiesReachableFromEnd) {
    103   HandleAndZoneScope scope;
    104   Graph graph(scope.main_zone());
    105   CommonOperatorBuilder common(scope.main_zone());
    106 
    107   Node* start = graph.NewNode(common.Start(0));
    108   graph.SetStart(start);
    109   Node* n2 = graph.NewNode(&dummy_operator1, graph.start());
    110   Node* n3 = graph.NewNode(&dummy_operator1, graph.start());
    111   Node* n4 = graph.NewNode(&dummy_operator1, n2);
    112   Node* n5 = graph.NewNode(&dummy_operator1, n2);
    113   Node* n6 = graph.NewNode(&dummy_operator1, n3);
    114   Node* n7 = graph.NewNode(&dummy_operator1, n3);
    115   Node* n8 = graph.NewNode(&dummy_operator1, n5);
    116   Node* n9 = graph.NewNode(&dummy_operator1, n5);
    117   Node* n10 = graph.NewNode(&dummy_operator1, n9);
    118   Node* n11 = graph.NewNode(&dummy_operator1, n9);
    119   Node* end_dependencies[6] = {n4, n8, n10, n11, n6, n7};
    120   Node* end = graph.NewNode(&dummy_operator6, 6, end_dependencies);
    121   graph.SetEnd(end);
    122 
    123   OFStream os(stdout);
    124   SourcePositionTable table(&graph);
    125   os << AsJSON(graph, &table);
    126 }
    127 
    128 }  // namespace compiler
    129 }  // namespace internal
    130 }  // namespace v8
    131