diff options
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/Android.bp | 1 | ||||
-rw-r--r-- | compiler/optimizing/nodes_vector.h | 50 | ||||
-rw-r--r-- | compiler/optimizing/nodes_vector_test.cc | 309 |
3 files changed, 4 insertions, 356 deletions
diff --git a/compiler/Android.bp b/compiler/Android.bp index 65132c3a67..a1269dcaf9 100644 --- a/compiler/Android.bp +++ b/compiler/Android.bp @@ -356,7 +356,6 @@ art_cc_test { "optimizing/live_interval_test.cc", "optimizing/loop_optimization_test.cc", "optimizing/nodes_test.cc", - "optimizing/nodes_vector_test.cc", "optimizing/parallel_move_test.cc", "optimizing/pretty_printer_test.cc", "optimizing/reference_type_propagation_test.cc", diff --git a/compiler/optimizing/nodes_vector.h b/compiler/optimizing/nodes_vector.h index dc522a463e..5dbe29b4fa 100644 --- a/compiler/optimizing/nodes_vector.h +++ b/compiler/optimizing/nodes_vector.h @@ -46,10 +46,6 @@ class Alignment { return "ALIGN(" + std::to_string(base_) + "," + std::to_string(offset_) + ")"; } - bool operator==(const Alignment& other) const { - return base_ == other.base_ && offset_ == other.offset_; - } - private: size_t base_; size_t offset_; @@ -100,13 +96,6 @@ class HVecOperation : public HVariableInputSizeInstruction { return GetPackedField<TypeField>(); } - bool CanBeMoved() const OVERRIDE { return true; } - - bool InstructionDataEquals(const HInstruction* other) const OVERRIDE { - const HVecOperation* o = other->AsVecOperation(); - return GetVectorLength() == o->GetVectorLength() && GetPackedType() == o->GetPackedType(); - } - DECLARE_ABSTRACT_INSTRUCTION(VecOperation); protected: @@ -200,11 +189,6 @@ class HVecMemoryOperation : public HVecOperation { HInstruction* GetArray() const { return InputAt(0); } HInstruction* GetIndex() const { return InputAt(1); } - bool InstructionDataEquals(const HInstruction* other) const OVERRIDE { - const HVecMemoryOperation* o = other->AsVecMemoryOperation(); - return HVecOperation::InstructionDataEquals(o) && GetAlignment() == o->GetAlignment(); - } - DECLARE_ABSTRACT_INSTRUCTION(VecMemoryOperation); private: @@ -394,13 +378,6 @@ class HVecHalvingAdd FINAL : public HVecBinaryOperation { bool IsUnsigned() const { return GetPackedFlag<kFieldHAddIsUnsigned>(); } bool IsRounded() const { return GetPackedFlag<kFieldHAddIsRounded>(); } - bool InstructionDataEquals(const HInstruction* other) const OVERRIDE { - const HVecHalvingAdd* o = other->AsVecHalvingAdd(); - return HVecOperation::InstructionDataEquals(o) && - IsUnsigned() == o->IsUnsigned() && - IsRounded() == o->IsRounded(); - } - DECLARE_INSTRUCTION(VecHalvingAdd); private: @@ -489,11 +466,6 @@ class HVecMin FINAL : public HVecBinaryOperation { bool IsUnsigned() const { return GetPackedFlag<kFieldMinOpIsUnsigned>(); } - bool InstructionDataEquals(const HInstruction* other) const OVERRIDE { - const HVecMin* o = other->AsVecMin(); - return HVecOperation::InstructionDataEquals(o) && IsUnsigned() == o->IsUnsigned(); - } - DECLARE_INSTRUCTION(VecMin); private: @@ -524,11 +496,6 @@ class HVecMax FINAL : public HVecBinaryOperation { bool IsUnsigned() const { return GetPackedFlag<kFieldMaxOpIsUnsigned>(); } - bool InstructionDataEquals(const HInstruction* other) const OVERRIDE { - const HVecMax* o = other->AsVecMax(); - return HVecOperation::InstructionDataEquals(o) && IsUnsigned() == o->IsUnsigned(); - } - DECLARE_INSTRUCTION(VecMax); private: @@ -727,9 +694,10 @@ class HVecMultiplyAccumulate FINAL : public HVecOperation { static constexpr int kInputMulLeftIndex = 1; static constexpr int kInputMulRightIndex = 2; + bool CanBeMoved() const OVERRIDE { return true; } + bool InstructionDataEquals(const HInstruction* other) const OVERRIDE { - const HVecMultiplyAccumulate* o = other->AsVecMultiplyAccumulate(); - return HVecOperation::InstructionDataEquals(o) && GetOpKind() == o->GetOpKind(); + return op_kind_ == other->AsVecMultiplyAccumulate()->op_kind_; } InstructionKind GetOpKind() const { return op_kind_; } @@ -764,16 +732,10 @@ class HVecLoad FINAL : public HVecMemoryOperation { SetRawInputAt(1, index); SetPackedFlag<kFieldIsStringCharAt>(is_string_char_at); } + DECLARE_INSTRUCTION(VecLoad); bool IsStringCharAt() const { return GetPackedFlag<kFieldIsStringCharAt>(); } - bool InstructionDataEquals(const HInstruction* other) const OVERRIDE { - const HVecLoad* o = other->AsVecLoad(); - return HVecMemoryOperation::InstructionDataEquals(o) && IsStringCharAt() == o->IsStringCharAt(); - } - - DECLARE_INSTRUCTION(VecLoad); - private: // Additional packed bits. static constexpr size_t kFieldIsStringCharAt = HVecOperation::kNumberOfVectorOpPackedBits; @@ -805,11 +767,7 @@ class HVecStore FINAL : public HVecMemoryOperation { SetRawInputAt(1, index); SetRawInputAt(2, value); } - - bool CanBeMoved() const OVERRIDE { return false; } - DECLARE_INSTRUCTION(VecStore); - private: DISALLOW_COPY_AND_ASSIGN(HVecStore); }; diff --git a/compiler/optimizing/nodes_vector_test.cc b/compiler/optimizing/nodes_vector_test.cc deleted file mode 100644 index d33f8e5d2e..0000000000 --- a/compiler/optimizing/nodes_vector_test.cc +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "base/arena_allocator.h" -#include "nodes.h" -#include "optimizing_unit_test.h" - -namespace art { - -/** - * Fixture class for testing vector nodes. - */ -class NodesVectorTest : public CommonCompilerTest { - public: - NodesVectorTest() - : pool_(), - allocator_(&pool_), - graph_(CreateGraph(&allocator_)) { - BuildGraph(); - } - - ~NodesVectorTest() { } - - void BuildGraph() { - graph_->SetNumberOfVRegs(1); - entry_block_ = new (&allocator_) HBasicBlock(graph_); - exit_block_ = new (&allocator_) HBasicBlock(graph_); - graph_->AddBlock(entry_block_); - graph_->AddBlock(exit_block_); - graph_->SetEntryBlock(entry_block_); - graph_->SetExitBlock(exit_block_); - parameter_ = new (&allocator_) HParameterValue(graph_->GetDexFile(), - dex::TypeIndex(0), - 0, - Primitive::kPrimInt); - entry_block_->AddInstruction(parameter_); - } - - // General building fields. - ArenaPool pool_; - ArenaAllocator allocator_; - HGraph* graph_; - - HBasicBlock* entry_block_; - HBasicBlock* exit_block_; - - HInstruction* parameter_; -}; - -// -// The actual vector nodes tests. -// - -TEST(NodesVector, Alignment) { - EXPECT_TRUE(Alignment(1, 0).IsAlignedAt(1)); - EXPECT_FALSE(Alignment(1, 0).IsAlignedAt(2)); - - EXPECT_TRUE(Alignment(2, 0).IsAlignedAt(1)); - EXPECT_TRUE(Alignment(2, 1).IsAlignedAt(1)); - EXPECT_TRUE(Alignment(2, 0).IsAlignedAt(2)); - EXPECT_FALSE(Alignment(2, 1).IsAlignedAt(2)); - EXPECT_FALSE(Alignment(2, 0).IsAlignedAt(4)); - EXPECT_FALSE(Alignment(2, 1).IsAlignedAt(4)); - - EXPECT_TRUE(Alignment(4, 0).IsAlignedAt(1)); - EXPECT_TRUE(Alignment(4, 2).IsAlignedAt(1)); - EXPECT_TRUE(Alignment(4, 0).IsAlignedAt(2)); - EXPECT_TRUE(Alignment(4, 2).IsAlignedAt(2)); - EXPECT_TRUE(Alignment(4, 0).IsAlignedAt(4)); - EXPECT_FALSE(Alignment(4, 2).IsAlignedAt(4)); - EXPECT_FALSE(Alignment(4, 0).IsAlignedAt(8)); - EXPECT_FALSE(Alignment(4, 2).IsAlignedAt(8)); - - EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(1)); - EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(2)); - EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(4)); - EXPECT_TRUE(Alignment(16, 8).IsAlignedAt(8)); - EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(16)); - EXPECT_FALSE(Alignment(16, 1).IsAlignedAt(16)); - EXPECT_FALSE(Alignment(16, 7).IsAlignedAt(16)); - EXPECT_FALSE(Alignment(16, 0).IsAlignedAt(32)); -} - -TEST(NodesVector, AlignmentEQ) { - EXPECT_TRUE(Alignment(2, 0) == Alignment(2, 0)); - EXPECT_TRUE(Alignment(2, 1) == Alignment(2, 1)); - EXPECT_TRUE(Alignment(4, 0) == Alignment(4, 0)); - EXPECT_TRUE(Alignment(4, 2) == Alignment(4, 2)); - - EXPECT_FALSE(Alignment(4, 0) == Alignment(2, 0)); - EXPECT_FALSE(Alignment(4, 0) == Alignment(4, 1)); - EXPECT_FALSE(Alignment(4, 0) == Alignment(8, 0)); -} - -TEST(NodesVector, AlignmentString) { - EXPECT_STREQ("ALIGN(1,0)", Alignment(1, 0).ToString().c_str()); - - EXPECT_STREQ("ALIGN(2,0)", Alignment(2, 0).ToString().c_str()); - EXPECT_STREQ("ALIGN(2,1)", Alignment(2, 1).ToString().c_str()); - - EXPECT_STREQ("ALIGN(16,0)", Alignment(16, 0).ToString().c_str()); - EXPECT_STREQ("ALIGN(16,1)", Alignment(16, 1).ToString().c_str()); - EXPECT_STREQ("ALIGN(16,8)", Alignment(16, 8).ToString().c_str()); - EXPECT_STREQ("ALIGN(16,9)", Alignment(16, 9).ToString().c_str()); -} - -TEST_F(NodesVectorTest, VectorOperationProperties) { - HVecOperation* v0 = new (&allocator_) - HVecReplicateScalar(&allocator_, parameter_, Primitive::kPrimInt, 4); - HVecOperation* v1 = new (&allocator_) - HVecReplicateScalar(&allocator_, parameter_, Primitive::kPrimInt, 4); - HVecOperation* v2 = new (&allocator_) - HVecReplicateScalar(&allocator_, parameter_, Primitive::kPrimInt, 2); - HVecOperation* v3 = new (&allocator_) - HVecReplicateScalar(&allocator_, parameter_, Primitive::kPrimShort, 4); - HVecOperation* v4 = new (&allocator_) - HVecStore(&allocator_, parameter_, parameter_, v0, Primitive::kPrimInt, 4); - - EXPECT_TRUE(v0->Equals(v0)); - EXPECT_TRUE(v1->Equals(v1)); - EXPECT_TRUE(v2->Equals(v2)); - EXPECT_TRUE(v3->Equals(v3)); - EXPECT_TRUE(v4->Equals(v4)); - - EXPECT_TRUE(v0->Equals(v1)); - EXPECT_FALSE(v0->Equals(v2)); // different vector lengths - EXPECT_FALSE(v0->Equals(v3)); // different packed types - EXPECT_FALSE(v0->Equals(v4)); // different kinds - - EXPECT_TRUE(v1->Equals(v0)); // switch operands - EXPECT_FALSE(v4->Equals(v0)); - - EXPECT_EQ(4u, v0->GetVectorLength()); - EXPECT_EQ(4u, v1->GetVectorLength()); - EXPECT_EQ(2u, v2->GetVectorLength()); - EXPECT_EQ(4u, v3->GetVectorLength()); - EXPECT_EQ(4u, v4->GetVectorLength()); - - EXPECT_EQ(Primitive::kPrimDouble, v0->GetType()); - EXPECT_EQ(Primitive::kPrimDouble, v1->GetType()); - EXPECT_EQ(Primitive::kPrimDouble, v2->GetType()); - EXPECT_EQ(Primitive::kPrimDouble, v3->GetType()); - EXPECT_EQ(Primitive::kPrimDouble, v4->GetType()); - - EXPECT_EQ(Primitive::kPrimInt, v0->GetPackedType()); - EXPECT_EQ(Primitive::kPrimInt, v1->GetPackedType()); - EXPECT_EQ(Primitive::kPrimInt, v2->GetPackedType()); - EXPECT_EQ(Primitive::kPrimShort, v3->GetPackedType()); - EXPECT_EQ(Primitive::kPrimInt, v4->GetPackedType()); - - EXPECT_EQ(16u, v0->GetVectorNumberOfBytes()); - EXPECT_EQ(16u, v1->GetVectorNumberOfBytes()); - EXPECT_EQ(8u, v2->GetVectorNumberOfBytes()); - EXPECT_EQ(8u, v3->GetVectorNumberOfBytes()); - EXPECT_EQ(16u, v4->GetVectorNumberOfBytes()); - - EXPECT_TRUE(v0->CanBeMoved()); - EXPECT_TRUE(v1->CanBeMoved()); - EXPECT_TRUE(v2->CanBeMoved()); - EXPECT_TRUE(v3->CanBeMoved()); - EXPECT_FALSE(v4->CanBeMoved()); -} - -TEST_F(NodesVectorTest, VectorAlignmentAndStringCharAtMatterOnLoad) { - HVecLoad* v0 = new (&allocator_) - HVecLoad(&allocator_, parameter_, parameter_, Primitive::kPrimInt, 4, /*is_string_char_at*/ false); - HVecLoad* v1 = new (&allocator_) - HVecLoad(&allocator_, parameter_, parameter_, Primitive::kPrimInt, 4, /*is_string_char_at*/ false); - HVecLoad* v2 = new (&allocator_) - HVecLoad(&allocator_, parameter_, parameter_, Primitive::kPrimInt, 4, /*is_string_char_at*/ true); - - EXPECT_FALSE(v0->IsStringCharAt()); - EXPECT_FALSE(v1->IsStringCharAt()); - EXPECT_TRUE(v2->IsStringCharAt()); - - EXPECT_TRUE(v0->Equals(v0)); - EXPECT_TRUE(v1->Equals(v1)); - EXPECT_TRUE(v2->Equals(v2)); - - EXPECT_TRUE(v0->Equals(v1)); - EXPECT_FALSE(v0->Equals(v2)); - - EXPECT_TRUE(v0->GetAlignment() == Alignment(4, 0)); - EXPECT_TRUE(v1->GetAlignment() == Alignment(4, 0)); - EXPECT_TRUE(v2->GetAlignment() == Alignment(4, 0)); - - v1->SetAlignment(Alignment(8, 0)); - - EXPECT_TRUE(v1->GetAlignment() == Alignment(8, 0)); - - EXPECT_FALSE(v0->Equals(v1)); // no longer equal -} - -TEST_F(NodesVectorTest, VectorSignMattersOnMin) { - HVecOperation* v0 = new (&allocator_) - HVecReplicateScalar(&allocator_, parameter_, Primitive::kPrimInt, 4); - - HVecMin* v1 = new (&allocator_) - HVecMin(&allocator_, v0, v0, Primitive::kPrimInt, 4, /*is_unsigned*/ true); - HVecMin* v2 = new (&allocator_) - HVecMin(&allocator_, v0, v0, Primitive::kPrimInt, 4, /*is_unsigned*/ false); - HVecMin* v3 = new (&allocator_) - HVecMin(&allocator_, v0, v0, Primitive::kPrimInt, 2, /*is_unsigned*/ true); - - EXPECT_TRUE(v1->IsUnsigned()); - EXPECT_FALSE(v2->IsUnsigned()); - EXPECT_TRUE(v3->IsUnsigned()); - - EXPECT_TRUE(v1->Equals(v1)); - EXPECT_TRUE(v2->Equals(v2)); - EXPECT_TRUE(v3->Equals(v3)); - - EXPECT_FALSE(v1->Equals(v2)); // different signs - EXPECT_FALSE(v1->Equals(v3)); // different vector lengths -} - -TEST_F(NodesVectorTest, VectorSignMattersOnMax) { - HVecOperation* v0 = new (&allocator_) - HVecReplicateScalar(&allocator_, parameter_, Primitive::kPrimInt, 4); - - HVecMax* v1 = new (&allocator_) - HVecMax(&allocator_, v0, v0, Primitive::kPrimInt, 4, /*is_unsigned*/ true); - HVecMax* v2 = new (&allocator_) - HVecMax(&allocator_, v0, v0, Primitive::kPrimInt, 4, /*is_unsigned*/ false); - HVecMax* v3 = new (&allocator_) - HVecMax(&allocator_, v0, v0, Primitive::kPrimInt, 2, /*is_unsigned*/ true); - - EXPECT_TRUE(v1->IsUnsigned()); - EXPECT_FALSE(v2->IsUnsigned()); - EXPECT_TRUE(v3->IsUnsigned()); - - EXPECT_TRUE(v1->Equals(v1)); - EXPECT_TRUE(v2->Equals(v2)); - EXPECT_TRUE(v3->Equals(v3)); - - EXPECT_FALSE(v1->Equals(v2)); // different signs - EXPECT_FALSE(v1->Equals(v3)); // different vector lengths -} - -TEST_F(NodesVectorTest, VectorAttributesMatterOnHalvingAdd) { - HVecOperation* v0 = new (&allocator_) - HVecReplicateScalar(&allocator_, parameter_, Primitive::kPrimInt, 4); - - HVecHalvingAdd* v1 = new (&allocator_) HVecHalvingAdd( - &allocator_, v0, v0, Primitive::kPrimInt, 4, /*is_unsigned*/ true, /*is_rounded*/ true); - HVecHalvingAdd* v2 = new (&allocator_) HVecHalvingAdd( - &allocator_, v0, v0, Primitive::kPrimInt, 4, /*is_unsigned*/ true, /*is_rounded*/ false); - HVecHalvingAdd* v3 = new (&allocator_) HVecHalvingAdd( - &allocator_, v0, v0, Primitive::kPrimInt, 4, /*is_unsigned*/ false, /*is_rounded*/ true); - HVecHalvingAdd* v4 = new (&allocator_) HVecHalvingAdd( - &allocator_, v0, v0, Primitive::kPrimInt, 4, /*is_unsigned*/ false, /*is_rounded*/ false); - HVecHalvingAdd* v5 = new (&allocator_) HVecHalvingAdd( - &allocator_, v0, v0, Primitive::kPrimInt, 2, /*is_unsigned*/ true, /*is_rounded*/ true); - - EXPECT_TRUE(v1->Equals(v1)); - EXPECT_TRUE(v2->Equals(v2)); - EXPECT_TRUE(v3->Equals(v3)); - EXPECT_TRUE(v4->Equals(v4)); - EXPECT_TRUE(v5->Equals(v5)); - - EXPECT_TRUE(v1->IsUnsigned() && v1->IsRounded()); - EXPECT_TRUE(v2->IsUnsigned() && !v2->IsRounded()); - EXPECT_TRUE(!v3->IsUnsigned() && v3->IsRounded()); - EXPECT_TRUE(!v4->IsUnsigned() && !v4->IsRounded()); - EXPECT_TRUE(v5->IsUnsigned() && v5->IsRounded()); - - EXPECT_FALSE(v1->Equals(v2)); // different attributes - EXPECT_FALSE(v1->Equals(v3)); // different attributes - EXPECT_FALSE(v1->Equals(v4)); // different attributes - EXPECT_FALSE(v1->Equals(v5)); // different vector lengths -} - -TEST_F(NodesVectorTest, VectorOperationMattersOnMultiplyAccumulate) { - HVecOperation* v0 = new (&allocator_) - HVecReplicateScalar(&allocator_, parameter_, Primitive::kPrimInt, 4); - - HVecMultiplyAccumulate* v1 = new (&allocator_) - HVecMultiplyAccumulate(&allocator_, HInstruction::kAdd, v0, v0, v0, Primitive::kPrimInt, 4); - HVecMultiplyAccumulate* v2 = new (&allocator_) - HVecMultiplyAccumulate(&allocator_, HInstruction::kSub, v0, v0, v0, Primitive::kPrimInt, 4); - HVecMultiplyAccumulate* v3 = new (&allocator_) - HVecMultiplyAccumulate(&allocator_, HInstruction::kAdd, v0, v0, v0, Primitive::kPrimInt, 2); - - EXPECT_EQ(HInstruction::kAdd, v1->GetOpKind()); - EXPECT_EQ(HInstruction::kSub, v2->GetOpKind()); - EXPECT_EQ(HInstruction::kAdd, v3->GetOpKind()); - - EXPECT_TRUE(v1->Equals(v1)); - EXPECT_TRUE(v2->Equals(v2)); - EXPECT_TRUE(v3->Equals(v3)); - - EXPECT_FALSE(v1->Equals(v2)); // different operators - EXPECT_FALSE(v1->Equals(v3)); // different vector lengths -} - -} // namespace art |