| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/simplified-operator.h" | 5 #include "src/compiler/simplified-operator.h" |
| 6 | 6 |
| 7 #include "src/compiler/operator-properties-inl.h" | 7 #include "src/compiler/operator-properties-inl.h" |
| 8 #include "test/unittests/test-utils.h" | 8 #include "test/unittests/test-utils.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 107 const PureOperator& pop = GetParam(); | 107 const PureOperator& pop = GetParam(); |
| 108 const Operator* op = (simplified.*pop.constructor)(); | 108 const Operator* op = (simplified.*pop.constructor)(); |
| 109 EXPECT_EQ(pop.properties, op->properties() & pop.properties); | 109 EXPECT_EQ(pop.properties, op->properties() & pop.properties); |
| 110 } | 110 } |
| 111 | 111 |
| 112 INSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest, SimplifiedPureOperatorTest, | 112 INSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest, SimplifiedPureOperatorTest, |
| 113 ::testing::ValuesIn(kPureOperators)); | 113 ::testing::ValuesIn(kPureOperators)); |
| 114 | 114 |
| 115 | 115 |
| 116 // ----------------------------------------------------------------------------- | 116 // ----------------------------------------------------------------------------- |
| 117 // Buffer access operators. |
| 118 |
| 119 |
| 120 namespace { |
| 121 |
| 122 const ExternalArrayType kExternalArrayTypes[] = { |
| 123 kExternalUint8Array, kExternalInt8Array, kExternalUint16Array, |
| 124 kExternalInt16Array, kExternalUint32Array, kExternalInt32Array, |
| 125 kExternalFloat32Array, kExternalFloat64Array}; |
| 126 |
| 127 } // namespace |
| 128 |
| 129 |
| 130 class SimplifiedBufferAccessOperatorTest |
| 131 : public TestWithZone, |
| 132 public ::testing::WithParamInterface<ExternalArrayType> {}; |
| 133 |
| 134 |
| 135 TEST_P(SimplifiedBufferAccessOperatorTest, InstancesAreGloballyShared) { |
| 136 BufferAccess const access(GetParam()); |
| 137 SimplifiedOperatorBuilder simplified1(zone()); |
| 138 SimplifiedOperatorBuilder simplified2(zone()); |
| 139 EXPECT_EQ(simplified1.LoadBuffer(access), simplified2.LoadBuffer(access)); |
| 140 EXPECT_EQ(simplified1.StoreBuffer(access), simplified2.StoreBuffer(access)); |
| 141 } |
| 142 |
| 143 |
| 144 TEST_P(SimplifiedBufferAccessOperatorTest, LoadBuffer) { |
| 145 SimplifiedOperatorBuilder simplified(zone()); |
| 146 BufferAccess const access(GetParam()); |
| 147 const Operator* op = simplified.LoadBuffer(access); |
| 148 |
| 149 EXPECT_EQ(IrOpcode::kLoadBuffer, op->opcode()); |
| 150 EXPECT_EQ(Operator::kNoThrow | Operator::kNoWrite, op->properties()); |
| 151 EXPECT_EQ(access, BufferAccessOf(op)); |
| 152 |
| 153 EXPECT_EQ(3, op->ValueInputCount()); |
| 154 EXPECT_EQ(1, op->EffectInputCount()); |
| 155 EXPECT_EQ(1, op->ControlInputCount()); |
| 156 EXPECT_EQ(5, OperatorProperties::GetTotalInputCount(op)); |
| 157 |
| 158 EXPECT_EQ(1, op->ValueOutputCount()); |
| 159 EXPECT_EQ(1, op->EffectOutputCount()); |
| 160 EXPECT_EQ(0, op->ControlOutputCount()); |
| 161 } |
| 162 |
| 163 |
| 164 TEST_P(SimplifiedBufferAccessOperatorTest, StoreBuffer) { |
| 165 SimplifiedOperatorBuilder simplified(zone()); |
| 166 BufferAccess const access(GetParam()); |
| 167 const Operator* op = simplified.StoreBuffer(access); |
| 168 |
| 169 EXPECT_EQ(IrOpcode::kStoreBuffer, op->opcode()); |
| 170 EXPECT_EQ(Operator::kNoRead | Operator::kNoThrow, op->properties()); |
| 171 EXPECT_EQ(access, BufferAccessOf(op)); |
| 172 |
| 173 EXPECT_EQ(4, op->ValueInputCount()); |
| 174 EXPECT_EQ(1, op->EffectInputCount()); |
| 175 EXPECT_EQ(1, op->ControlInputCount()); |
| 176 EXPECT_EQ(6, OperatorProperties::GetTotalInputCount(op)); |
| 177 |
| 178 EXPECT_EQ(0, op->ValueOutputCount()); |
| 179 EXPECT_EQ(1, op->EffectOutputCount()); |
| 180 EXPECT_EQ(0, op->ControlOutputCount()); |
| 181 } |
| 182 |
| 183 |
| 184 INSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest, |
| 185 SimplifiedBufferAccessOperatorTest, |
| 186 ::testing::ValuesIn(kExternalArrayTypes)); |
| 187 |
| 188 |
| 189 // ----------------------------------------------------------------------------- |
| 117 // Element access operators. | 190 // Element access operators. |
| 118 | 191 |
| 192 |
| 119 namespace { | 193 namespace { |
| 120 | 194 |
| 121 const ElementAccess kElementAccesses[] = { | 195 const ElementAccess kElementAccesses[] = { |
| 122 {kNoBoundsCheck, kTaggedBase, FixedArray::kHeaderSize, Type::Any(), | 196 {kTaggedBase, FixedArray::kHeaderSize, Type::Any(), kMachAnyTagged}, |
| 123 kMachAnyTagged}, | 197 {kUntaggedBase, 0, Type::Any(), kMachInt8}, |
| 124 {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 198 {kUntaggedBase, 0, Type::Any(), kMachInt16}, |
| 125 Type::Any(), kMachInt8}, | 199 {kUntaggedBase, 0, Type::Any(), kMachInt32}, |
| 126 {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 200 {kUntaggedBase, 0, Type::Any(), kMachUint8}, |
| 127 Type::Any(), kMachInt16}, | 201 {kUntaggedBase, 0, Type::Any(), kMachUint16}, |
| 128 {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 202 {kUntaggedBase, 0, Type::Any(), kMachUint32}, |
| 129 Type::Any(), kMachInt32}, | 203 {kUntaggedBase, 0, Type::Signed32(), kMachInt8}, |
| 130 {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 204 {kUntaggedBase, 0, Type::Unsigned32(), kMachUint8}, |
| 131 Type::Any(), kMachUint8}, | 205 {kUntaggedBase, 0, Type::Signed32(), kMachInt16}, |
| 132 {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 206 {kUntaggedBase, 0, Type::Unsigned32(), kMachUint16}, |
| 133 Type::Any(), kMachUint16}, | 207 {kUntaggedBase, 0, Type::Signed32(), kMachInt32}, |
| 134 {kNoBoundsCheck, kUntaggedBase, kNonHeapObjectHeaderSize - kHeapObjectTag, | 208 {kUntaggedBase, 0, Type::Unsigned32(), kMachUint32}, |
| 135 Type::Any(), kMachUint32}, | 209 {kUntaggedBase, 0, Type::Number(), kRepFloat32}, |
| 136 {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Signed32(), kMachInt8}, | 210 {kUntaggedBase, 0, Type::Number(), kRepFloat64}, |
| 137 {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Unsigned32(), kMachUint8}, | 211 {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Signed32(), |
| 138 {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Signed32(), kMachInt16}, | 212 kMachInt8}, |
| 139 {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Unsigned32(), kMachUint16}, | 213 {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Unsigned32(), |
| 140 {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Signed32(), kMachInt32}, | 214 kMachUint8}, |
| 141 {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Unsigned32(), kMachUint32}, | 215 {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Signed32(), |
| 142 {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Number(), kRepFloat32}, | 216 kMachInt16}, |
| 143 {kTypedArrayBoundsCheck, kUntaggedBase, 0, Type::Number(), kRepFloat64}, | 217 {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Unsigned32(), |
| 144 {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 218 kMachUint16}, |
| 145 Type::Signed32(), kMachInt8}, | 219 {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Signed32(), |
| 146 {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 220 kMachInt32}, |
| 147 Type::Unsigned32(), kMachUint8}, | 221 {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Unsigned32(), |
| 148 {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 222 kMachUint32}, |
| 149 Type::Signed32(), kMachInt16}, | 223 {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Number(), |
| 150 {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 224 kRepFloat32}, |
| 151 Type::Unsigned32(), kMachUint16}, | 225 {kTaggedBase, FixedTypedArrayBase::kDataOffset, Type::Number(), |
| 152 {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | 226 kRepFloat64}}; |
| 153 Type::Signed32(), kMachInt32}, | |
| 154 {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | |
| 155 Type::Unsigned32(), kMachUint32}, | |
| 156 {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | |
| 157 Type::Number(), kRepFloat32}, | |
| 158 {kTypedArrayBoundsCheck, kTaggedBase, FixedTypedArrayBase::kDataOffset, | |
| 159 Type::Number(), kRepFloat64}}; | |
| 160 | 227 |
| 161 } // namespace | 228 } // namespace |
| 162 | 229 |
| 163 | 230 |
| 164 class SimplifiedElementAccessOperatorTest | 231 class SimplifiedElementAccessOperatorTest |
| 165 : public TestWithZone, | 232 : public TestWithZone, |
| 166 public ::testing::WithParamInterface<ElementAccess> {}; | 233 public ::testing::WithParamInterface<ElementAccess> {}; |
| 167 | 234 |
| 168 | 235 |
| 169 TEST_P(SimplifiedElementAccessOperatorTest, LoadElement) { | 236 TEST_P(SimplifiedElementAccessOperatorTest, LoadElement) { |
| 170 SimplifiedOperatorBuilder simplified(zone()); | 237 SimplifiedOperatorBuilder simplified(zone()); |
| 171 const ElementAccess& access = GetParam(); | 238 const ElementAccess& access = GetParam(); |
| 172 const Operator* op = simplified.LoadElement(access); | 239 const Operator* op = simplified.LoadElement(access); |
| 173 | 240 |
| 174 EXPECT_EQ(IrOpcode::kLoadElement, op->opcode()); | 241 EXPECT_EQ(IrOpcode::kLoadElement, op->opcode()); |
| 175 EXPECT_EQ(Operator::kNoThrow | Operator::kNoWrite, op->properties()); | 242 EXPECT_EQ(Operator::kNoThrow | Operator::kNoWrite, op->properties()); |
| 176 EXPECT_EQ(access, ElementAccessOf(op)); | 243 EXPECT_EQ(access, ElementAccessOf(op)); |
| 177 | 244 |
| 178 EXPECT_EQ(3, op->ValueInputCount()); | 245 EXPECT_EQ(2, op->ValueInputCount()); |
| 179 EXPECT_EQ(1, op->EffectInputCount()); | 246 EXPECT_EQ(1, op->EffectInputCount()); |
| 180 EXPECT_EQ(0, op->ControlInputCount()); | 247 EXPECT_EQ(1, op->ControlInputCount()); |
| 181 EXPECT_EQ(4, OperatorProperties::GetTotalInputCount(op)); | 248 EXPECT_EQ(4, OperatorProperties::GetTotalInputCount(op)); |
| 182 | 249 |
| 183 EXPECT_EQ(1, op->ValueOutputCount()); | 250 EXPECT_EQ(1, op->ValueOutputCount()); |
| 184 EXPECT_EQ(1, op->EffectOutputCount()); | 251 EXPECT_EQ(1, op->EffectOutputCount()); |
| 185 EXPECT_EQ(0, op->ControlOutputCount()); | 252 EXPECT_EQ(0, op->ControlOutputCount()); |
| 186 } | 253 } |
| 187 | 254 |
| 188 | 255 |
| 189 TEST_P(SimplifiedElementAccessOperatorTest, StoreElement) { | 256 TEST_P(SimplifiedElementAccessOperatorTest, StoreElement) { |
| 190 SimplifiedOperatorBuilder simplified(zone()); | 257 SimplifiedOperatorBuilder simplified(zone()); |
| 191 const ElementAccess& access = GetParam(); | 258 const ElementAccess& access = GetParam(); |
| 192 const Operator* op = simplified.StoreElement(access); | 259 const Operator* op = simplified.StoreElement(access); |
| 193 | 260 |
| 194 EXPECT_EQ(IrOpcode::kStoreElement, op->opcode()); | 261 EXPECT_EQ(IrOpcode::kStoreElement, op->opcode()); |
| 195 EXPECT_EQ(Operator::kNoRead | Operator::kNoThrow, op->properties()); | 262 EXPECT_EQ(Operator::kNoRead | Operator::kNoThrow, op->properties()); |
| 196 EXPECT_EQ(access, ElementAccessOf(op)); | 263 EXPECT_EQ(access, ElementAccessOf(op)); |
| 197 | 264 |
| 198 EXPECT_EQ(4, op->ValueInputCount()); | 265 EXPECT_EQ(3, op->ValueInputCount()); |
| 199 EXPECT_EQ(1, op->EffectInputCount()); | 266 EXPECT_EQ(1, op->EffectInputCount()); |
| 200 EXPECT_EQ(1, op->ControlInputCount()); | 267 EXPECT_EQ(1, op->ControlInputCount()); |
| 201 EXPECT_EQ(6, OperatorProperties::GetTotalInputCount(op)); | 268 EXPECT_EQ(5, OperatorProperties::GetTotalInputCount(op)); |
| 202 | 269 |
| 203 EXPECT_EQ(0, op->ValueOutputCount()); | 270 EXPECT_EQ(0, op->ValueOutputCount()); |
| 204 EXPECT_EQ(1, op->EffectOutputCount()); | 271 EXPECT_EQ(1, op->EffectOutputCount()); |
| 205 EXPECT_EQ(0, op->ControlOutputCount()); | 272 EXPECT_EQ(0, op->ControlOutputCount()); |
| 206 } | 273 } |
| 207 | 274 |
| 208 | 275 |
| 209 INSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest, | 276 INSTANTIATE_TEST_CASE_P(SimplifiedOperatorTest, |
| 210 SimplifiedElementAccessOperatorTest, | 277 SimplifiedElementAccessOperatorTest, |
| 211 ::testing::ValuesIn(kElementAccesses)); | 278 ::testing::ValuesIn(kElementAccesses)); |
| 212 | 279 |
| 213 } // namespace compiler | 280 } // namespace compiler |
| 214 } // namespace internal | 281 } // namespace internal |
| 215 } // namespace v8 | 282 } // namespace v8 |
| OLD | NEW |