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