| Index: test/unittests/compiler/simplified-operator-unittest.cc | 
| diff --git a/test/unittests/compiler/simplified-operator-unittest.cc b/test/unittests/compiler/simplified-operator-unittest.cc | 
| index 031a8974f86b68f8501822b4df1bf968fe6400d9..b4567d6af73eae55407648f57898a878337b20eb 100644 | 
| --- a/test/unittests/compiler/simplified-operator-unittest.cc | 
| +++ b/test/unittests/compiler/simplified-operator-unittest.cc | 
| @@ -114,49 +114,116 @@ INSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest, SimplifiedPureOperatorTest, | 
|  | 
|  | 
| // ----------------------------------------------------------------------------- | 
| +// Buffer access operators. | 
| + | 
| + | 
| +namespace { | 
| + | 
| +const ExternalArrayType kExternalArrayTypes[] = { | 
| +    kExternalUint8Array,   kExternalInt8Array,   kExternalUint16Array, | 
| +    kExternalInt16Array,   kExternalUint32Array, kExternalInt32Array, | 
| +    kExternalFloat32Array, kExternalFloat64Array}; | 
| + | 
| +}  // namespace | 
| + | 
| + | 
| +class SimplifiedBufferAccessOperatorTest | 
| +    : public TestWithZone, | 
| +      public ::testing::WithParamInterface<ExternalArrayType> {}; | 
| + | 
| + | 
| +TEST_P(SimplifiedBufferAccessOperatorTest, InstancesAreGloballyShared) { | 
| +  BufferAccess const access(GetParam()); | 
| +  SimplifiedOperatorBuilder simplified1(zone()); | 
| +  SimplifiedOperatorBuilder simplified2(zone()); | 
| +  EXPECT_EQ(simplified1.LoadBuffer(access), simplified2.LoadBuffer(access)); | 
| +  EXPECT_EQ(simplified1.StoreBuffer(access), simplified2.StoreBuffer(access)); | 
| +} | 
| + | 
| + | 
| +TEST_P(SimplifiedBufferAccessOperatorTest, LoadBuffer) { | 
| +  SimplifiedOperatorBuilder simplified(zone()); | 
| +  BufferAccess const access(GetParam()); | 
| +  const Operator* op = simplified.LoadBuffer(access); | 
| + | 
| +  EXPECT_EQ(IrOpcode::kLoadBuffer, op->opcode()); | 
| +  EXPECT_EQ(Operator::kNoThrow | Operator::kNoWrite, op->properties()); | 
| +  EXPECT_EQ(access, BufferAccessOf(op)); | 
| + | 
| +  EXPECT_EQ(3, op->ValueInputCount()); | 
| +  EXPECT_EQ(1, op->EffectInputCount()); | 
| +  EXPECT_EQ(1, op->ControlInputCount()); | 
| +  EXPECT_EQ(5, OperatorProperties::GetTotalInputCount(op)); | 
| + | 
| +  EXPECT_EQ(1, op->ValueOutputCount()); | 
| +  EXPECT_EQ(1, op->EffectOutputCount()); | 
| +  EXPECT_EQ(0, op->ControlOutputCount()); | 
| +} | 
| + | 
| + | 
| +TEST_P(SimplifiedBufferAccessOperatorTest, StoreBuffer) { | 
| +  SimplifiedOperatorBuilder simplified(zone()); | 
| +  BufferAccess const access(GetParam()); | 
| +  const Operator* op = simplified.StoreBuffer(access); | 
| + | 
| +  EXPECT_EQ(IrOpcode::kStoreBuffer, op->opcode()); | 
| +  EXPECT_EQ(Operator::kNoRead | Operator::kNoThrow, op->properties()); | 
| +  EXPECT_EQ(access, BufferAccessOf(op)); | 
| + | 
| +  EXPECT_EQ(4, op->ValueInputCount()); | 
| +  EXPECT_EQ(1, op->EffectInputCount()); | 
| +  EXPECT_EQ(1, op->ControlInputCount()); | 
| +  EXPECT_EQ(6, OperatorProperties::GetTotalInputCount(op)); | 
| + | 
| +  EXPECT_EQ(0, op->ValueOutputCount()); | 
| +  EXPECT_EQ(1, op->EffectOutputCount()); | 
| +  EXPECT_EQ(0, op->ControlOutputCount()); | 
| +} | 
| + | 
| + | 
| +INSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest, | 
| +                        SimplifiedBufferAccessOperatorTest, | 
| +                        ::testing::ValuesIn(kExternalArrayTypes)); | 
| + | 
| + | 
| +// ----------------------------------------------------------------------------- | 
| // Element access operators. | 
|  | 
| + | 
| namespace { | 
|  | 
| const ElementAccess kElementAccesses[] = { | 
| -    {kNoBoundsCheck, kTaggedBase, FixedArray::kHeaderSize, Type::Any(), | 
| -     kMachAnyTagged}, | 
| -    {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 
| -     Type::Any(), kMachInt8}, | 
| -    {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 
| -     Type::Any(), kMachInt16}, | 
| -    {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 
| -     Type::Any(), kMachInt32}, | 
| -    {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 
| -     Type::Any(), kMachUint8}, | 
| -    {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 
| -     Type::Any(), kMachUint16}, | 
| -    {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 
| -     Type::Any(), kMachUint32}, | 
| -    {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Signed32(), kMachInt8}, | 
| -    {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Unsigned32(), kMachUint8}, | 
| -    {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Signed32(), kMachInt16}, | 
| -    {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Unsigned32(), kMachUint16}, | 
| -    {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Signed32(), kMachInt32}, | 
| -    {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Unsigned32(), kMachUint32}, | 
| -    {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Number(), kRepFloat32}, | 
| -    {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Number(), kRepFloat64}, | 
| -    {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 
| -     Type::Signed32(), kMachInt8}, | 
| -    {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 
| -     Type::Unsigned32(), kMachUint8}, | 
| -    {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 
| -     Type::Signed32(), kMachInt16}, | 
| -    {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 
| -     Type::Unsigned32(), kMachUint16}, | 
| -    {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 
| -     Type::Signed32(), kMachInt32}, | 
| -    {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 
| -     Type::Unsigned32(), kMachUint32}, | 
| -    {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 
| -     Type::Number(), kRepFloat32}, | 
| -    {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 
| -     Type::Number(), kRepFloat64}}; | 
| +    {kTaggedBase, FixedArray::kHeaderSize, Type::Any(), kMachAnyTagged}, | 
| +    {kUntaggedBase, 0, Type::Any(), kMachInt8}, | 
| +    {kUntaggedBase, 0, Type::Any(), kMachInt16}, | 
| +    {kUntaggedBase, 0, Type::Any(), kMachInt32}, | 
| +    {kUntaggedBase, 0, Type::Any(), kMachUint8}, | 
| +    {kUntaggedBase, 0, Type::Any(), kMachUint16}, | 
| +    {kUntaggedBase, 0, 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 | 
|  | 
| @@ -175,9 +242,9 @@ TEST_P(SimplifiedElementAccessOperatorTest, LoadElement) { | 
| EXPECT_EQ(Operator::kNoThrow | Operator::kNoWrite, op->properties()); | 
| EXPECT_EQ(access, ElementAccessOf(op)); | 
|  | 
| -  EXPECT_EQ(3, op->ValueInputCount()); | 
| +  EXPECT_EQ(2, op->ValueInputCount()); | 
| EXPECT_EQ(1, op->EffectInputCount()); | 
| -  EXPECT_EQ(0, op->ControlInputCount()); | 
| +  EXPECT_EQ(1, op->ControlInputCount()); | 
| EXPECT_EQ(4, OperatorProperties::GetTotalInputCount(op)); | 
|  | 
| EXPECT_EQ(1, op->ValueOutputCount()); | 
| @@ -195,10 +262,10 @@ TEST_P(SimplifiedElementAccessOperatorTest, StoreElement) { | 
| EXPECT_EQ(Operator::kNoRead | Operator::kNoThrow, op->properties()); | 
| EXPECT_EQ(access, ElementAccessOf(op)); | 
|  | 
| -  EXPECT_EQ(4, op->ValueInputCount()); | 
| +  EXPECT_EQ(3, op->ValueInputCount()); | 
| EXPECT_EQ(1, op->EffectInputCount()); | 
| EXPECT_EQ(1, op->ControlInputCount()); | 
| -  EXPECT_EQ(6, OperatorProperties::GetTotalInputCount(op)); | 
| +  EXPECT_EQ(5, OperatorProperties::GetTotalInputCount(op)); | 
|  | 
| EXPECT_EQ(0, op->ValueOutputCount()); | 
| EXPECT_EQ(1, op->EffectOutputCount()); | 
|  |