blob: 48be46ce5faa35d0bd9b00c1215ffcd0d2eee75c [file] [log] [blame]
Emily Bernierd0a1eb72015-03-24 16:35:39 -04001// 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
Emily Bernierd0a1eb72015-03-24 16:35:39 -04005#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"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000014#include "src/compiler/source-position.h"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040015#include "src/compiler/verifier.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000016#include "test/cctest/cctest.h"
Emily Bernierd0a1eb72015-03-24 16:35:39 -040017
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000018namespace v8 {
19namespace internal {
20namespace compiler {
21
22static Operator dummy_operator1(IrOpcode::kParameter, Operator::kNoWrite,
23 "dummy", 1, 0, 0, 1, 0, 0);
24static Operator dummy_operator6(IrOpcode::kParameter, Operator::kNoWrite,
25 "dummy", 6, 0, 0, 1, 0, 0);
26
Emily Bernierd0a1eb72015-03-24 16:35:39 -040027
28TEST(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));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000036 Node* phi =
37 graph.NewNode(common.Phi(MachineRepresentation::kTagged, 1), k, start);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040038 phi->ReplaceInput(0, NULL);
39 graph.SetEnd(phi);
40
41 OFStream os(stdout);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000042 SourcePositionTable table(&graph);
43 os << AsJSON(graph, &table);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040044}
45
46
47TEST(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));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000055 Node* phi =
56 graph.NewNode(common.Phi(MachineRepresentation::kTagged, 1), k, start);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040057 phi->ReplaceInput(1, NULL);
58 graph.SetEnd(phi);
59
60 OFStream os(stdout);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000061 SourcePositionTable table(&graph);
62 os << AsJSON(graph, &table);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040063}
64
65
66TEST(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));
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000074 Node* phi =
75 graph.NewNode(common.Phi(MachineRepresentation::kTagged, 1), k, start);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040076 phi->ReplaceInput(0, NULL);
77 graph.SetEnd(start);
78
79 OFStream os(stdout);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000080 SourcePositionTable table(&graph);
81 os << AsJSON(graph, &table);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040082}
83
84
85TEST(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);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000097 SourcePositionTable table(&graph);
98 os << AsJSON(graph, &table);
Emily Bernierd0a1eb72015-03-24 16:35:39 -040099}
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000100
101
102TEST(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