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