1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file.
4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/simplified-operator.h"
6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/compiler/operator-properties-inl.h"
8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/test/test-utils.h"
9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 {
11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal {
12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler {
13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// TODO(bmeurer): Drop once we use std::ostream instead of our OStream.
15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline std::ostream& operator<<(std::ostream& os, const ElementAccess& access) {
16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  OStringStream ost;
17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  ost << access;
18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os << ost.c_str();
19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
22b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
23b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Pure operators.
24b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace {
27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
28b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct PureOperator {
29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* (SimplifiedOperatorBuilder::*constructor)();
30b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  IrOpcode::Value opcode;
31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  Operator::Properties properties;
32b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  int value_input_count;
33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
36b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstd::ostream& operator<<(std::ostream& os, const PureOperator& pop) {
37b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  return os << IrOpcode::Mnemonic(pop.opcode);
38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst PureOperator kPureOperators[] = {
42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define PURE(Name, properties, input_count)              \
43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  {                                                      \
44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    &SimplifiedOperatorBuilder::Name, IrOpcode::k##Name, \
45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch        Operator::kPure | properties, input_count        \
46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  }
47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(BooleanNot, Operator::kNoProperties, 1),
48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(NumberEqual, Operator::kCommutative, 2),
49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(NumberLessThan, Operator::kNoProperties, 2),
50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(NumberLessThanOrEqual, Operator::kNoProperties, 2),
51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(NumberAdd, Operator::kCommutative, 2),
52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(NumberSubtract, Operator::kNoProperties, 2),
53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(NumberMultiply, Operator::kCommutative, 2),
54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(NumberDivide, Operator::kNoProperties, 2),
55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(NumberModulus, Operator::kNoProperties, 2),
56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(NumberToInt32, Operator::kNoProperties, 1),
57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(NumberToUint32, Operator::kNoProperties, 1),
58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(StringEqual, Operator::kCommutative, 2),
59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(StringLessThan, Operator::kNoProperties, 2),
60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(StringLessThanOrEqual, Operator::kNoProperties, 2),
61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(StringAdd, Operator::kNoProperties, 2),
62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeTaggedToInt32, Operator::kNoProperties, 1),
63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeTaggedToUint32, Operator::kNoProperties, 1),
64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeTaggedToFloat64, Operator::kNoProperties, 1),
65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeInt32ToTagged, Operator::kNoProperties, 1),
66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeUint32ToTagged, Operator::kNoProperties, 1),
67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeFloat64ToTagged, Operator::kNoProperties, 1),
68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeBoolToBit, Operator::kNoProperties, 1),
69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    PURE(ChangeBitToBool, Operator::kNoProperties, 1)
70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef PURE
71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch};
72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace
74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SimplifiedPureOperatorTest
77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : public TestWithZone,
78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      public ::testing::WithParamInterface<PureOperator> {};
79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(SimplifiedPureOperatorTest, InstancesAreGloballyShared) {
82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const PureOperator& pop = GetParam();
83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SimplifiedOperatorBuilder simplified1(zone());
84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SimplifiedOperatorBuilder simplified2(zone());
85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ((simplified1.*pop.constructor)(), (simplified2.*pop.constructor)());
86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(SimplifiedPureOperatorTest, NumberOfInputsAndOutputs) {
90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SimplifiedOperatorBuilder simplified(zone());
91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const PureOperator& pop = GetParam();
92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op = (simplified.*pop.constructor)();
93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(pop.value_input_count, OperatorProperties::GetValueInputCount(op));
95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetEffectInputCount(op));
96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetControlInputCount(op));
97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(pop.value_input_count, OperatorProperties::GetTotalInputCount(op));
98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op));
100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetEffectOutputCount(op));
101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op));
102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(SimplifiedPureOperatorTest, OpcodeIsCorrect) {
106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SimplifiedOperatorBuilder simplified(zone());
107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const PureOperator& pop = GetParam();
108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op = (simplified.*pop.constructor)();
109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(pop.opcode, op->opcode());
110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(SimplifiedPureOperatorTest, Properties) {
114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SimplifiedOperatorBuilder simplified(zone());
115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const PureOperator& pop = GetParam();
116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op = (simplified.*pop.constructor)();
117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(pop.properties, op->properties() & pop.properties);
118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest, SimplifiedPureOperatorTest,
121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ::testing::ValuesIn(kPureOperators));
122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// -----------------------------------------------------------------------------
125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Element access operators.
126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace {
128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochconst ElementAccess kElementAccesses[] = {
130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kTaggedBase, FixedArray::kHeaderSize, Type::Any(), kMachAnyTagged},
131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachInt8},
133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachInt16},
135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachInt32},
137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachUint8},
139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachUint16},
141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachUint32},
143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, 0, Type::Signed32(), kMachInt8},
144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, 0, Type::Unsigned32(), kMachUint8},
145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, 0, Type::Signed32(), kMachInt16},
146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, 0, Type::Unsigned32(), kMachUint16},
147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, 0, Type::Signed32(), kMachInt32},
148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, 0, Type::Unsigned32(), kMachUint32},
149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, 0, Type::Number(), kRepFloat32},
150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kUntaggedBase, 0, Type::Number(), kRepFloat64},
151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Signed32(),
152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachInt8},
153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Unsigned32(),
154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachUint8},
155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Signed32(),
156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachInt16},
157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Unsigned32(),
158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachUint16},
159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Signed32(),
160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachInt32},
161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Unsigned32(),
162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kMachUint32},
163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Number(),
164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kRepFloat32},
165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Number(),
166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch     kRepFloat64}};
167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace
169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass SimplifiedElementAccessOperatorTest
172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch    : public TestWithZone,
173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch      public ::testing::WithParamInterface<ElementAccess> {};
174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(SimplifiedElementAccessOperatorTest, LoadElement) {
177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SimplifiedOperatorBuilder simplified(zone());
178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const ElementAccess& access = GetParam();
179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op = simplified.LoadElement(access);
180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(IrOpcode::kLoadElement, op->opcode());
182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(Operator::kNoThrow | Operator::kNoWrite, op->properties());
183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(access, ElementAccessOf(op));
184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(3, OperatorProperties::GetValueInputCount(op));
186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetEffectInputCount(op));
187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetControlInputCount(op));
188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(4, OperatorProperties::GetTotalInputCount(op));
189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op));
191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetEffectOutputCount(op));
192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op));
193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochTEST_P(SimplifiedElementAccessOperatorTest, StoreElement) {
197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  SimplifiedOperatorBuilder simplified(zone());
198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const ElementAccess& access = GetParam();
199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  const Operator* op = simplified.StoreElement(access);
200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(IrOpcode::kStoreElement, op->opcode());
202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(Operator::kNoRead | Operator::kNoThrow, op->properties());
203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(access, ElementAccessOf(op));
204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(4, OperatorProperties::GetValueInputCount(op));
206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetEffectInputCount(op));
207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetControlInputCount(op));
208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(6, OperatorProperties::GetTotalInputCount(op));
209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetValueOutputCount(op));
211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(1, OperatorProperties::GetEffectOutputCount(op));
212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch  EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op));
213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}
214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochINSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest,
217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        SimplifiedElementAccessOperatorTest,
218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch                        ::testing::ValuesIn(kElementAccesses));
219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch
220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace compiler
221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace internal
222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}  // namespace v8
223