1014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Copyright 2015 the V8 project authors. All rights reserved.
2014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// found in the LICENSE file.
4014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/node.h"
6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/compiler/operator.h"
7014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "test/unittests/test-utils.h"
8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "testing/gmock-support.h"
9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochusing testing::ElementsAre;
11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochusing testing::UnorderedElementsAre;
12014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
13014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace v8 {
14014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace internal {
15014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace compiler {
16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
17014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochtypedef TestWithZone NodeTest;
18014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochnamespace {
21014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
22014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst IrOpcode::Value kOpcode0 = static_cast<IrOpcode::Value>(0);
23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst IrOpcode::Value kOpcode1 = static_cast<IrOpcode::Value>(1);
24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst IrOpcode::Value kOpcode2 = static_cast<IrOpcode::Value>(2);
25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator kOp0(kOpcode0, Operator::kNoProperties, "Op0", 0, 0, 0, 1, 0, 0);
27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator kOp1(kOpcode1, Operator::kNoProperties, "Op1", 1, 0, 0, 1, 0, 0);
28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochconst Operator kOp2(kOpcode2, Operator::kNoProperties, "Op2", 2, 0, 0, 1, 0, 0);
29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace
31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, New) {
34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* const node = Node::New(zone(), 1, &kOp0, 0, nullptr, false);
35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(1U, node->id());
36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(0, node->UseCount());
37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(node->uses().empty());
38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(0, node->InputCount());
39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(node->inputs().empty());
40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(&kOp0, node->op());
41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(kOpcode0, node->opcode());
42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
43014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
44014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
45014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, NewWithInputs) {
46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(0, n0->UseCount());
48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(0, n0->InputCount());
49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 = Node::New(zone(), 1, &kOp1, 1, &n0, false);
50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(1, n0->UseCount());
51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(n0->uses(), UnorderedElementsAre(n1));
52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(0, n1->UseCount());
53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(1, n1->InputCount());
54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(n0, n1->InputAt(0));
55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0_n1[] = {n0, n1};
56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n2 = Node::New(zone(), 2, &kOp2, 2, n0_n1, false);
57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(2, n0->UseCount());
58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(n0->uses(), UnorderedElementsAre(n1, n2));
59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(n1->uses(), UnorderedElementsAre(n2));
60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(2, n2->InputCount());
61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(n0, n2->InputAt(0));
62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(n1, n2->InputAt(1));
63014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
64014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
65014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
66014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, InputIteratorEmpty) {
67014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* node = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
68014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(node->inputs().begin(), node->inputs().end());
69014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
70014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, InputIteratorOne) {
73014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
74014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 = Node::New(zone(), 1, &kOp1, 1, &n0, false);
75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(n1->inputs(), ElementsAre(n0));
76014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
77014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
79014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, InputIteratorTwo) {
80014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
81014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 = Node::New(zone(), 1, &kOp1, 1, &n0, false);
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0_n1[] = {n0, n1};
83014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n2 = Node::New(zone(), 2, &kOp2, 2, n0_n1, false);
84014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(n2->inputs(), ElementsAre(n0, n1));
85014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
86014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
87014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
88014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, UseIteratorEmpty) {
89014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* node = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
90014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_EQ(node->uses().begin(), node->uses().end());
91014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, UseIteratorOne) {
95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 = Node::New(zone(), 1, &kOp1, 1, &n0, false);
97014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(n0->uses(), ElementsAre(n1));
98014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, UseIteratorTwo) {
102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 = Node::New(zone(), 1, &kOp1, 1, &n0, false);
104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0_n1[] = {n0, n1};
105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n2 = Node::New(zone(), 2, &kOp2, 2, n0_n1, false);
106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(n0->uses(), UnorderedElementsAre(n1, n2));
107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, OwnedBy) {
111014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
112014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(n0->OwnedBy(n0));
113014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 = Node::New(zone(), 1, &kOp1, 1, &n0, false);
114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(n0->OwnedBy(n0));
115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(n1->OwnedBy(n1));
116014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(n0->OwnedBy(n1));
117014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0_n1[] = {n0, n1};
118014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n2 = Node::New(zone(), 2, &kOp2, 2, n0_n1, false);
119014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(n0->OwnedBy(n0));
120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(n1->OwnedBy(n1));
121014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(n2->OwnedBy(n2));
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(n0->OwnedBy(n1));
123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(n0->OwnedBy(n2));
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(n1->OwnedBy(n2));
125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(n0->OwnedBy(n1, n2));
126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  n2->ReplaceInput(0, n2);
127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(n0->OwnedBy(n1));
128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(n1->OwnedBy(n2));
129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  n2->ReplaceInput(1, n0);
130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(n0->OwnedBy(n1));
131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(n1->OwnedBy(n2));
132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, ReplaceUsesNone) {
136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 = Node::New(zone(), 1, &kOp1, 1, &n0, false);
138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0_n1[] = {n0, n1};
139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n2 = Node::New(zone(), 2, &kOp2, 2, n0_n1, false);
140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* node = Node::New(zone(), 42, &kOp0, 0, nullptr, false);
141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(node->uses().empty());
142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->ReplaceUses(n0);
143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(node->uses().empty());
144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->ReplaceUses(n1);
145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(node->uses().empty());
146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->ReplaceUses(n2);
147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(node->uses().empty());
148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, AppendInput) {
152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 = Node::New(zone(), 1, &kOp1, 1, &n0, false);
154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* node = Node::New(zone(), 12345, &kOp0, 0, nullptr, true);
155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(node->inputs().empty());
156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n0);
157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n0));
159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n1);
160014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n0, n1));
161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n0);
162014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n0, n1, n0));
163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n0);
164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n0, n1, n0, n0));
165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n1);
166014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n0, n1, n0, n0, n1));
167014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
168014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
169014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
170014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, TrimThenAppend) {
171014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
172014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 = Node::New(zone(), 1, &kOp0, 0, nullptr, false);
173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n2 = Node::New(zone(), 2, &kOp0, 0, nullptr, false);
174014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n3 = Node::New(zone(), 3, &kOp0, 0, nullptr, false);
175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n4 = Node::New(zone(), 4, &kOp0, 0, nullptr, false);
176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n5 = Node::New(zone(), 5, &kOp0, 0, nullptr, false);
177014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n6 = Node::New(zone(), 6, &kOp0, 0, nullptr, false);
178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n7 = Node::New(zone(), 7, &kOp0, 0, nullptr, false);
179014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n8 = Node::New(zone(), 8, &kOp0, 0, nullptr, false);
180014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n9 = Node::New(zone(), 9, &kOp0, 0, nullptr, false);
181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* node = Node::New(zone(), 12345, &kOp0, 0, nullptr, true);
182014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(node->inputs().empty());
184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
185014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n0);
186014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
187014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n0));
188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
189014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->TrimInputCount(0);
190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_TRUE(node->inputs().empty());
191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n1);
193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
194014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1));
195014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
196014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n2);
197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1, n2));
199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->TrimInputCount(1);
201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1));
203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n3);
205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1, n3));
207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n4);
209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1, n3, n4));
211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n5);
213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1, n3, n4, n5));
215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n6);
217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1, n3, n4, n5, n6));
219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n7);
221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1, n3, n4, n5, n6, n7));
223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->TrimInputCount(4);
225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1, n3, n4, n5));
226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n8);
228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1, n3, n4, n5, n8));
230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  node->AppendInput(zone(), n9);
232014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_FALSE(node->inputs().empty());
233014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  EXPECT_THAT(node->inputs(), ElementsAre(n1, n3, n4, n5, n8, n9));
234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochTEST_F(NodeTest, BigNodes) {
238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  static const int kMaxSize = 512;
239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* inputs[kMaxSize];
240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n0 = Node::New(zone(), 0, &kOp0, 0, nullptr, false);
242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  Node* n1 = Node::New(zone(), 1, &kOp1, 1, &n0, false);
243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int i = 0; i < kMaxSize; i++) {
245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    inputs[i] = i & 1 ? n0 : n1;
246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
247014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  for (int size = 13; size <= kMaxSize; size += 9) {
249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Node* node = Node::New(zone(), 12345, &kOp0, size, inputs, false);
250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    EXPECT_EQ(size, node->InputCount());
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    for (int i = 0; i < size; i++) {
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      EXPECT_EQ(inputs[i], node->InputAt(i));
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace compiler
260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
262