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
TEST(NodeWithNullInputReachableFromEnd)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
TEST(NodeWithNullControlReachableFromEnd)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
TEST(NodeWithNullInputReachableFromStart)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
TEST(NodeWithNullControlReachableFromStart)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
TEST(NodeNetworkOfDummiesReachableFromEnd)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