| Index: src/compiler/simplified-operator-unittest.cc
 | 
| diff --git a/src/compiler/simplified-operator-unittest.cc b/src/compiler/simplified-operator-unittest.cc
 | 
| index ef13dac6cbd35810f370b8328ece3f47133e822f..4014f24e900c03dd47da63031581c3fd9de1150c 100644
 | 
| --- a/src/compiler/simplified-operator-unittest.cc
 | 
| +++ b/src/compiler/simplified-operator-unittest.cc
 | 
| @@ -11,6 +11,14 @@ namespace v8 {
 | 
|  namespace internal {
 | 
|  namespace compiler {
 | 
|  
 | 
| +// TODO(bmeurer): Drop once we use std::ostream instead of our OStream.
 | 
| +inline std::ostream& operator<<(std::ostream& os, const ElementAccess& access) {
 | 
| +  OStringStream ost;
 | 
| +  ost << access;
 | 
| +  return os << ost.c_str();
 | 
| +}
 | 
| +
 | 
| +
 | 
|  // -----------------------------------------------------------------------------
 | 
|  // Pure operators.
 | 
|  
 | 
| @@ -112,6 +120,103 @@ TEST_P(SimplifiedPureOperatorTest, Properties) {
 | 
|  INSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest, SimplifiedPureOperatorTest,
 | 
|                          ::testing::ValuesIn(kPureOperators));
 | 
|  
 | 
| +
 | 
| +// -----------------------------------------------------------------------------
 | 
| +// Element access operators.
 | 
| +
 | 
| +namespace {
 | 
| +
 | 
| +const ElementAccess kElementAccesses[] = {
 | 
| +    {kTaggedBase, FixedArray::kHeaderSize, Type::Any(), kMachAnyTagged},
 | 
| +    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
 | 
| +     kMachInt8},
 | 
| +    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
 | 
| +     kMachInt16},
 | 
| +    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
 | 
| +     kMachInt32},
 | 
| +    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
 | 
| +     kMachUint8},
 | 
| +    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
 | 
| +     kMachUint16},
 | 
| +    {kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, Type::Any(),
 | 
| +     kMachUint32},
 | 
| +    {kUntaggedBase, 0, Type::Signed32(), kMachInt8},
 | 
| +    {kUntaggedBase, 0, Type::Unsigned32(), kMachUint8},
 | 
| +    {kUntaggedBase, 0, Type::Signed32(), kMachInt16},
 | 
| +    {kUntaggedBase, 0, Type::Unsigned32(), kMachUint16},
 | 
| +    {kUntaggedBase, 0, Type::Signed32(), kMachInt32},
 | 
| +    {kUntaggedBase, 0, Type::Unsigned32(), kMachUint32},
 | 
| +    {kUntaggedBase, 0, Type::Number(), kRepFloat32},
 | 
| +    {kUntaggedBase, 0, Type::Number(), kRepFloat64},
 | 
| +    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Signed32(),
 | 
| +     kMachInt8},
 | 
| +    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Unsigned32(),
 | 
| +     kMachUint8},
 | 
| +    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Signed32(),
 | 
| +     kMachInt16},
 | 
| +    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Unsigned32(),
 | 
| +     kMachUint16},
 | 
| +    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Signed32(),
 | 
| +     kMachInt32},
 | 
| +    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Unsigned32(),
 | 
| +     kMachUint32},
 | 
| +    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Number(),
 | 
| +     kRepFloat32},
 | 
| +    {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Number(),
 | 
| +     kRepFloat64}};
 | 
| +
 | 
| +}  // namespace
 | 
| +
 | 
| +
 | 
| +class SimplifiedElementAccessOperatorTest
 | 
| +    : public TestWithZone,
 | 
| +      public ::testing::WithParamInterface<ElementAccess> {};
 | 
| +
 | 
| +
 | 
| +TEST_P(SimplifiedElementAccessOperatorTest, LoadElement) {
 | 
| +  SimplifiedOperatorBuilder simplified(zone());
 | 
| +  const ElementAccess& access = GetParam();
 | 
| +  const Operator* op = simplified.LoadElement(access);
 | 
| +
 | 
| +  EXPECT_EQ(IrOpcode::kLoadElement, op->opcode());
 | 
| +  EXPECT_EQ(Operator::kNoThrow | Operator::kNoWrite, op->properties());
 | 
| +  EXPECT_EQ(access, ElementAccessOf(op));
 | 
| +
 | 
| +  EXPECT_EQ(3, OperatorProperties::GetValueInputCount(op));
 | 
| +  EXPECT_EQ(1, OperatorProperties::GetEffectInputCount(op));
 | 
| +  EXPECT_EQ(0, OperatorProperties::GetControlInputCount(op));
 | 
| +  EXPECT_EQ(4, OperatorProperties::GetTotalInputCount(op));
 | 
| +
 | 
| +  EXPECT_EQ(1, OperatorProperties::GetValueOutputCount(op));
 | 
| +  EXPECT_EQ(1, OperatorProperties::GetEffectOutputCount(op));
 | 
| +  EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +TEST_P(SimplifiedElementAccessOperatorTest, StoreElement) {
 | 
| +  SimplifiedOperatorBuilder simplified(zone());
 | 
| +  const ElementAccess& access = GetParam();
 | 
| +  const Operator* op = simplified.StoreElement(access);
 | 
| +
 | 
| +  EXPECT_EQ(IrOpcode::kStoreElement, op->opcode());
 | 
| +  EXPECT_EQ(Operator::kNoRead | Operator::kNoThrow, op->properties());
 | 
| +  EXPECT_EQ(access, ElementAccessOf(op));
 | 
| +
 | 
| +  EXPECT_EQ(4, OperatorProperties::GetValueInputCount(op));
 | 
| +  EXPECT_EQ(1, OperatorProperties::GetEffectInputCount(op));
 | 
| +  EXPECT_EQ(1, OperatorProperties::GetControlInputCount(op));
 | 
| +  EXPECT_EQ(6, OperatorProperties::GetTotalInputCount(op));
 | 
| +
 | 
| +  EXPECT_EQ(0, OperatorProperties::GetValueOutputCount(op));
 | 
| +  EXPECT_EQ(1, OperatorProperties::GetEffectOutputCount(op));
 | 
| +  EXPECT_EQ(0, OperatorProperties::GetControlOutputCount(op));
 | 
| +}
 | 
| +
 | 
| +
 | 
| +INSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest,
 | 
| +                        SimplifiedElementAccessOperatorTest,
 | 
| +                        ::testing::ValuesIn(kElementAccesses));
 | 
| +
 | 
|  }  // namespace compiler
 | 
|  }  // namespace internal
 | 
|  }  // namespace v8
 | 
| 
 |