xref: /aosp_15_r20/art/compiler/optimizing/nodes_vector_test.cc (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker #include "base/arena_allocator.h"
18*795d594fSAndroid Build Coastguard Worker #include "base/macros.h"
19*795d594fSAndroid Build Coastguard Worker #include "nodes.h"
20*795d594fSAndroid Build Coastguard Worker #include "optimizing_unit_test.h"
21*795d594fSAndroid Build Coastguard Worker 
22*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN {
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker /**
25*795d594fSAndroid Build Coastguard Worker  * Fixture class for testing vector nodes.
26*795d594fSAndroid Build Coastguard Worker  */
27*795d594fSAndroid Build Coastguard Worker class NodesVectorTest : public OptimizingUnitTest {
28*795d594fSAndroid Build Coastguard Worker  public:
NodesVectorTest()29*795d594fSAndroid Build Coastguard Worker   NodesVectorTest()
30*795d594fSAndroid Build Coastguard Worker       : graph_(CreateGraph()) {
31*795d594fSAndroid Build Coastguard Worker     BuildGraph();
32*795d594fSAndroid Build Coastguard Worker   }
33*795d594fSAndroid Build Coastguard Worker 
~NodesVectorTest()34*795d594fSAndroid Build Coastguard Worker   ~NodesVectorTest() { }
35*795d594fSAndroid Build Coastguard Worker 
BuildGraph()36*795d594fSAndroid Build Coastguard Worker   void BuildGraph() {
37*795d594fSAndroid Build Coastguard Worker     graph_->SetNumberOfVRegs(1);
38*795d594fSAndroid Build Coastguard Worker     entry_block_ = new (GetAllocator()) HBasicBlock(graph_);
39*795d594fSAndroid Build Coastguard Worker     exit_block_ = new (GetAllocator()) HBasicBlock(graph_);
40*795d594fSAndroid Build Coastguard Worker     graph_->AddBlock(entry_block_);
41*795d594fSAndroid Build Coastguard Worker     graph_->AddBlock(exit_block_);
42*795d594fSAndroid Build Coastguard Worker     graph_->SetEntryBlock(entry_block_);
43*795d594fSAndroid Build Coastguard Worker     graph_->SetExitBlock(exit_block_);
44*795d594fSAndroid Build Coastguard Worker     int8_parameter_ = MakeParam(DataType::Type::kInt8);
45*795d594fSAndroid Build Coastguard Worker     int16_parameter_ = MakeParam(DataType::Type::kInt16);
46*795d594fSAndroid Build Coastguard Worker     int32_parameter_ = MakeParam(DataType::Type::kInt32);
47*795d594fSAndroid Build Coastguard Worker   }
48*795d594fSAndroid Build Coastguard Worker 
49*795d594fSAndroid Build Coastguard Worker   // General building fields.
50*795d594fSAndroid Build Coastguard Worker   HGraph* graph_;
51*795d594fSAndroid Build Coastguard Worker 
52*795d594fSAndroid Build Coastguard Worker   HBasicBlock* entry_block_;
53*795d594fSAndroid Build Coastguard Worker   HBasicBlock* exit_block_;
54*795d594fSAndroid Build Coastguard Worker 
55*795d594fSAndroid Build Coastguard Worker   HInstruction* int8_parameter_;
56*795d594fSAndroid Build Coastguard Worker   HInstruction* int16_parameter_;
57*795d594fSAndroid Build Coastguard Worker   HInstruction* int32_parameter_;
58*795d594fSAndroid Build Coastguard Worker };
59*795d594fSAndroid Build Coastguard Worker 
60*795d594fSAndroid Build Coastguard Worker //
61*795d594fSAndroid Build Coastguard Worker // The actual vector nodes tests.
62*795d594fSAndroid Build Coastguard Worker //
63*795d594fSAndroid Build Coastguard Worker 
TEST(NodesVector,Alignment)64*795d594fSAndroid Build Coastguard Worker TEST(NodesVector, Alignment) {
65*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(1, 0).IsAlignedAt(1));
66*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(1, 0).IsAlignedAt(2));
67*795d594fSAndroid Build Coastguard Worker 
68*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(2, 0).IsAlignedAt(1));
69*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(2, 1).IsAlignedAt(1));
70*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(2, 0).IsAlignedAt(2));
71*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(2, 1).IsAlignedAt(2));
72*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(2, 0).IsAlignedAt(4));
73*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(2, 1).IsAlignedAt(4));
74*795d594fSAndroid Build Coastguard Worker 
75*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(4, 0).IsAlignedAt(1));
76*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(4, 2).IsAlignedAt(1));
77*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(4, 0).IsAlignedAt(2));
78*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(4, 2).IsAlignedAt(2));
79*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(4, 0).IsAlignedAt(4));
80*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(4, 2).IsAlignedAt(4));
81*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(4, 0).IsAlignedAt(8));
82*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(4, 2).IsAlignedAt(8));
83*795d594fSAndroid Build Coastguard Worker 
84*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(1));
85*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(2));
86*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(4));
87*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(16, 8).IsAlignedAt(8));
88*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(16, 0).IsAlignedAt(16));
89*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(16, 1).IsAlignedAt(16));
90*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(16, 7).IsAlignedAt(16));
91*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(16, 0).IsAlignedAt(32));
92*795d594fSAndroid Build Coastguard Worker 
93*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(16u, Alignment(16, 0).Base());
94*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(0u, Alignment(16, 0).Offset());
95*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(4u, Alignment(16, 4).Offset());
96*795d594fSAndroid Build Coastguard Worker }
97*795d594fSAndroid Build Coastguard Worker 
TEST(NodesVector,AlignmentEQ)98*795d594fSAndroid Build Coastguard Worker TEST(NodesVector, AlignmentEQ) {
99*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(2, 0) == Alignment(2, 0));
100*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(2, 1) == Alignment(2, 1));
101*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(4, 0) == Alignment(4, 0));
102*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(Alignment(4, 2) == Alignment(4, 2));
103*795d594fSAndroid Build Coastguard Worker 
104*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(4, 0) == Alignment(2, 0));
105*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(4, 0) == Alignment(4, 1));
106*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(Alignment(4, 0) == Alignment(8, 0));
107*795d594fSAndroid Build Coastguard Worker }
108*795d594fSAndroid Build Coastguard Worker 
TEST(NodesVector,AlignmentString)109*795d594fSAndroid Build Coastguard Worker TEST(NodesVector, AlignmentString) {
110*795d594fSAndroid Build Coastguard Worker   EXPECT_STREQ("ALIGN(1,0)", Alignment(1, 0).ToString().c_str());
111*795d594fSAndroid Build Coastguard Worker 
112*795d594fSAndroid Build Coastguard Worker   EXPECT_STREQ("ALIGN(2,0)", Alignment(2, 0).ToString().c_str());
113*795d594fSAndroid Build Coastguard Worker   EXPECT_STREQ("ALIGN(2,1)", Alignment(2, 1).ToString().c_str());
114*795d594fSAndroid Build Coastguard Worker 
115*795d594fSAndroid Build Coastguard Worker   EXPECT_STREQ("ALIGN(16,0)", Alignment(16, 0).ToString().c_str());
116*795d594fSAndroid Build Coastguard Worker   EXPECT_STREQ("ALIGN(16,1)", Alignment(16, 1).ToString().c_str());
117*795d594fSAndroid Build Coastguard Worker   EXPECT_STREQ("ALIGN(16,8)", Alignment(16, 8).ToString().c_str());
118*795d594fSAndroid Build Coastguard Worker   EXPECT_STREQ("ALIGN(16,9)", Alignment(16, 9).ToString().c_str());
119*795d594fSAndroid Build Coastguard Worker }
120*795d594fSAndroid Build Coastguard Worker 
TEST_F(NodesVectorTest,VectorOperationProperties)121*795d594fSAndroid Build Coastguard Worker TEST_F(NodesVectorTest, VectorOperationProperties) {
122*795d594fSAndroid Build Coastguard Worker   HVecOperation* v0 = new (GetAllocator())
123*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt32, 4, kNoDexPc);
124*795d594fSAndroid Build Coastguard Worker   HVecOperation* v1 = new (GetAllocator())
125*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt32, 4, kNoDexPc);
126*795d594fSAndroid Build Coastguard Worker   HVecOperation* v2 = new (GetAllocator())
127*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt32, 2, kNoDexPc);
128*795d594fSAndroid Build Coastguard Worker   HVecOperation* v3 = new (GetAllocator())
129*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt16, 4, kNoDexPc);
130*795d594fSAndroid Build Coastguard Worker   HVecOperation* v4 = new (GetAllocator()) HVecStore(
131*795d594fSAndroid Build Coastguard Worker       GetAllocator(),
132*795d594fSAndroid Build Coastguard Worker       int32_parameter_,
133*795d594fSAndroid Build Coastguard Worker       int32_parameter_,
134*795d594fSAndroid Build Coastguard Worker       v0,
135*795d594fSAndroid Build Coastguard Worker       DataType::Type::kInt32,
136*795d594fSAndroid Build Coastguard Worker       SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
137*795d594fSAndroid Build Coastguard Worker       4,
138*795d594fSAndroid Build Coastguard Worker       kNoDexPc);
139*795d594fSAndroid Build Coastguard Worker 
140*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v0->Equals(v0));
141*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->Equals(v1));
142*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v2->Equals(v2));
143*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v3->Equals(v3));
144*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v4->Equals(v4));
145*795d594fSAndroid Build Coastguard Worker 
146*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v0->Equals(v1));
147*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->Equals(v2));  // different vector lengths
148*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->Equals(v3));  // different packed types
149*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->Equals(v4));  // different kinds
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->Equals(v0));  // switch operands
152*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v4->Equals(v0));
153*795d594fSAndroid Build Coastguard Worker 
154*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(4u, v0->GetVectorLength());
155*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(4u, v1->GetVectorLength());
156*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(2u, v2->GetVectorLength());
157*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(4u, v3->GetVectorLength());
158*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(4u, v4->GetVectorLength());
159*795d594fSAndroid Build Coastguard Worker 
160*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(DataType::Type::kFloat64, v0->GetType());
161*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(DataType::Type::kFloat64, v1->GetType());
162*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(DataType::Type::kFloat64, v2->GetType());
163*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(DataType::Type::kFloat64, v3->GetType());
164*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(DataType::Type::kFloat64, v4->GetType());
165*795d594fSAndroid Build Coastguard Worker 
166*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(DataType::Type::kInt32, v0->GetPackedType());
167*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(DataType::Type::kInt32, v1->GetPackedType());
168*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(DataType::Type::kInt32, v2->GetPackedType());
169*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(DataType::Type::kInt16, v3->GetPackedType());
170*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(DataType::Type::kInt32, v4->GetPackedType());
171*795d594fSAndroid Build Coastguard Worker 
172*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(16u, v0->GetVectorNumberOfBytes());
173*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(16u, v1->GetVectorNumberOfBytes());
174*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(8u, v2->GetVectorNumberOfBytes());
175*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(8u, v3->GetVectorNumberOfBytes());
176*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(16u, v4->GetVectorNumberOfBytes());
177*795d594fSAndroid Build Coastguard Worker 
178*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->CanBeMoved());
179*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v1->CanBeMoved());
180*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v2->CanBeMoved());
181*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v3->CanBeMoved());
182*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v4->CanBeMoved());
183*795d594fSAndroid Build Coastguard Worker }
184*795d594fSAndroid Build Coastguard Worker 
TEST_F(NodesVectorTest,VectorAlignmentAndStringCharAtMatterOnLoad)185*795d594fSAndroid Build Coastguard Worker TEST_F(NodesVectorTest, VectorAlignmentAndStringCharAtMatterOnLoad) {
186*795d594fSAndroid Build Coastguard Worker   HVecLoad* v0 = new (GetAllocator()) HVecLoad(GetAllocator(),
187*795d594fSAndroid Build Coastguard Worker                                                int32_parameter_,
188*795d594fSAndroid Build Coastguard Worker                                                int32_parameter_,
189*795d594fSAndroid Build Coastguard Worker                                                DataType::Type::kInt32,
190*795d594fSAndroid Build Coastguard Worker                                                SideEffects::ArrayReadOfType(DataType::Type::kInt32),
191*795d594fSAndroid Build Coastguard Worker                                                4,
192*795d594fSAndroid Build Coastguard Worker                                                /*is_string_char_at*/ false,
193*795d594fSAndroid Build Coastguard Worker                                                kNoDexPc);
194*795d594fSAndroid Build Coastguard Worker   HVecLoad* v1 = new (GetAllocator()) HVecLoad(GetAllocator(),
195*795d594fSAndroid Build Coastguard Worker                                                int32_parameter_,
196*795d594fSAndroid Build Coastguard Worker                                                int32_parameter_,
197*795d594fSAndroid Build Coastguard Worker                                                DataType::Type::kInt32,
198*795d594fSAndroid Build Coastguard Worker                                                SideEffects::ArrayReadOfType(DataType::Type::kInt32),
199*795d594fSAndroid Build Coastguard Worker                                                4,
200*795d594fSAndroid Build Coastguard Worker                                                /*is_string_char_at*/ false,
201*795d594fSAndroid Build Coastguard Worker                                                kNoDexPc);
202*795d594fSAndroid Build Coastguard Worker   HVecLoad* v2 = new (GetAllocator()) HVecLoad(GetAllocator(),
203*795d594fSAndroid Build Coastguard Worker                                                int32_parameter_,
204*795d594fSAndroid Build Coastguard Worker                                                int32_parameter_,
205*795d594fSAndroid Build Coastguard Worker                                                DataType::Type::kInt32,
206*795d594fSAndroid Build Coastguard Worker                                                SideEffects::ArrayReadOfType(DataType::Type::kInt32),
207*795d594fSAndroid Build Coastguard Worker                                                 4,
208*795d594fSAndroid Build Coastguard Worker                                                /*is_string_char_at*/ true,
209*795d594fSAndroid Build Coastguard Worker                                                kNoDexPc);
210*795d594fSAndroid Build Coastguard Worker 
211*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v0->CanBeMoved());
212*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->CanBeMoved());
213*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v2->CanBeMoved());
214*795d594fSAndroid Build Coastguard Worker 
215*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->IsStringCharAt());
216*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v1->IsStringCharAt());
217*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v2->IsStringCharAt());
218*795d594fSAndroid Build Coastguard Worker 
219*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v0->Equals(v0));
220*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->Equals(v1));
221*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v2->Equals(v2));
222*795d594fSAndroid Build Coastguard Worker 
223*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v0->Equals(v1));
224*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->Equals(v2));  // different is_string_char_at
225*795d594fSAndroid Build Coastguard Worker 
226*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v0->GetAlignment() == Alignment(4, 0));
227*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->GetAlignment() == Alignment(4, 0));
228*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v2->GetAlignment() == Alignment(4, 0));
229*795d594fSAndroid Build Coastguard Worker 
230*795d594fSAndroid Build Coastguard Worker   v1->SetAlignment(Alignment(8, 0));
231*795d594fSAndroid Build Coastguard Worker 
232*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->GetAlignment() == Alignment(8, 0));
233*795d594fSAndroid Build Coastguard Worker 
234*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->Equals(v1));  // no longer equal
235*795d594fSAndroid Build Coastguard Worker }
236*795d594fSAndroid Build Coastguard Worker 
TEST_F(NodesVectorTest,VectorAlignmentMattersOnStore)237*795d594fSAndroid Build Coastguard Worker TEST_F(NodesVectorTest, VectorAlignmentMattersOnStore) {
238*795d594fSAndroid Build Coastguard Worker   HVecOperation* p0 = new (GetAllocator())
239*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt32, 4, kNoDexPc);
240*795d594fSAndroid Build Coastguard Worker   HVecStore* v0 = new (GetAllocator()) HVecStore(
241*795d594fSAndroid Build Coastguard Worker       GetAllocator(),
242*795d594fSAndroid Build Coastguard Worker       int32_parameter_,
243*795d594fSAndroid Build Coastguard Worker       int32_parameter_,
244*795d594fSAndroid Build Coastguard Worker       p0,
245*795d594fSAndroid Build Coastguard Worker       DataType::Type::kInt32,
246*795d594fSAndroid Build Coastguard Worker       SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
247*795d594fSAndroid Build Coastguard Worker       4,
248*795d594fSAndroid Build Coastguard Worker       kNoDexPc);
249*795d594fSAndroid Build Coastguard Worker   HVecStore* v1 = new (GetAllocator()) HVecStore(
250*795d594fSAndroid Build Coastguard Worker       GetAllocator(),
251*795d594fSAndroid Build Coastguard Worker       int32_parameter_,
252*795d594fSAndroid Build Coastguard Worker       int32_parameter_,
253*795d594fSAndroid Build Coastguard Worker       p0,
254*795d594fSAndroid Build Coastguard Worker       DataType::Type::kInt32,
255*795d594fSAndroid Build Coastguard Worker       SideEffects::ArrayWriteOfType(DataType::Type::kInt32),
256*795d594fSAndroid Build Coastguard Worker       4,
257*795d594fSAndroid Build Coastguard Worker       kNoDexPc);
258*795d594fSAndroid Build Coastguard Worker 
259*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->CanBeMoved());
260*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v1->CanBeMoved());
261*795d594fSAndroid Build Coastguard Worker 
262*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v0->Equals(v1));
263*795d594fSAndroid Build Coastguard Worker 
264*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v0->GetAlignment() == Alignment(4, 0));
265*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->GetAlignment() == Alignment(4, 0));
266*795d594fSAndroid Build Coastguard Worker 
267*795d594fSAndroid Build Coastguard Worker   v1->SetAlignment(Alignment(8, 0));
268*795d594fSAndroid Build Coastguard Worker 
269*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->GetAlignment() == Alignment(8, 0));
270*795d594fSAndroid Build Coastguard Worker 
271*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->Equals(v1));  // no longer equal
272*795d594fSAndroid Build Coastguard Worker }
273*795d594fSAndroid Build Coastguard Worker 
TEST_F(NodesVectorTest,VectorAttributesMatterOnHalvingAdd)274*795d594fSAndroid Build Coastguard Worker TEST_F(NodesVectorTest, VectorAttributesMatterOnHalvingAdd) {
275*795d594fSAndroid Build Coastguard Worker   HVecOperation* u0 = new (GetAllocator())
276*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kUint32, 4, kNoDexPc);
277*795d594fSAndroid Build Coastguard Worker   HVecOperation* u1 = new (GetAllocator())
278*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int16_parameter_, DataType::Type::kUint16, 8, kNoDexPc);
279*795d594fSAndroid Build Coastguard Worker   HVecOperation* u2 = new (GetAllocator())
280*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int8_parameter_, DataType::Type::kUint8, 16, kNoDexPc);
281*795d594fSAndroid Build Coastguard Worker 
282*795d594fSAndroid Build Coastguard Worker   HVecOperation* p0 = new (GetAllocator())
283*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt32, 4, kNoDexPc);
284*795d594fSAndroid Build Coastguard Worker   HVecOperation* p1 = new (GetAllocator())
285*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int16_parameter_, DataType::Type::kInt16, 8, kNoDexPc);
286*795d594fSAndroid Build Coastguard Worker   HVecOperation* p2 = new (GetAllocator())
287*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int8_parameter_, DataType::Type::kInt8, 16, kNoDexPc);
288*795d594fSAndroid Build Coastguard Worker 
289*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v0 = new (GetAllocator()) HVecHalvingAdd(
290*795d594fSAndroid Build Coastguard Worker       GetAllocator(), u0, u0, DataType::Type::kUint32, 4, /*is_rounded*/ true, kNoDexPc);
291*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v1 = new (GetAllocator()) HVecHalvingAdd(
292*795d594fSAndroid Build Coastguard Worker       GetAllocator(), u0, u0, DataType::Type::kUint32, 4, /*is_rounded*/ false, kNoDexPc);
293*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v2 = new (GetAllocator()) HVecHalvingAdd(
294*795d594fSAndroid Build Coastguard Worker       GetAllocator(), p0, p0, DataType::Type::kInt32, 4, /*is_rounded*/ true, kNoDexPc);
295*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v3 = new (GetAllocator()) HVecHalvingAdd(
296*795d594fSAndroid Build Coastguard Worker       GetAllocator(), p0, p0, DataType::Type::kInt32, 4, /*is_rounded*/ false, kNoDexPc);
297*795d594fSAndroid Build Coastguard Worker 
298*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v4 = new (GetAllocator()) HVecHalvingAdd(
299*795d594fSAndroid Build Coastguard Worker       GetAllocator(), u1, u1, DataType::Type::kUint16, 8, /*is_rounded*/ true, kNoDexPc);
300*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v5 = new (GetAllocator()) HVecHalvingAdd(
301*795d594fSAndroid Build Coastguard Worker       GetAllocator(), u1, u1, DataType::Type::kUint16, 8, /*is_rounded*/ false, kNoDexPc);
302*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v6 = new (GetAllocator()) HVecHalvingAdd(
303*795d594fSAndroid Build Coastguard Worker       GetAllocator(), p1, p1, DataType::Type::kInt16, 8, /*is_rounded*/ true, kNoDexPc);
304*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v7 = new (GetAllocator()) HVecHalvingAdd(
305*795d594fSAndroid Build Coastguard Worker       GetAllocator(), p1, p1, DataType::Type::kInt16, 8, /*is_rounded*/ false, kNoDexPc);
306*795d594fSAndroid Build Coastguard Worker 
307*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v8 = new (GetAllocator()) HVecHalvingAdd(
308*795d594fSAndroid Build Coastguard Worker       GetAllocator(), u2, u2, DataType::Type::kUint8, 16, /*is_rounded*/ true, kNoDexPc);
309*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v9 = new (GetAllocator()) HVecHalvingAdd(
310*795d594fSAndroid Build Coastguard Worker       GetAllocator(), u2, u2, DataType::Type::kUint8, 16, /*is_rounded*/ false, kNoDexPc);
311*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v10 = new (GetAllocator()) HVecHalvingAdd(
312*795d594fSAndroid Build Coastguard Worker       GetAllocator(), p2, p2, DataType::Type::kInt8, 16, /*is_rounded*/ true, kNoDexPc);
313*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* v11 = new (GetAllocator()) HVecHalvingAdd(
314*795d594fSAndroid Build Coastguard Worker       GetAllocator(), p2, p2, DataType::Type::kInt8, 16, /*is_rounded*/ false, kNoDexPc);
315*795d594fSAndroid Build Coastguard Worker 
316*795d594fSAndroid Build Coastguard Worker   HVecHalvingAdd* hadd_insns[] = { v0, v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11 };
317*795d594fSAndroid Build Coastguard Worker 
318*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(u0->CanBeMoved());
319*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(u1->CanBeMoved());
320*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(u2->CanBeMoved());
321*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(p0->CanBeMoved());
322*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(p1->CanBeMoved());
323*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(p2->CanBeMoved());
324*795d594fSAndroid Build Coastguard Worker 
325*795d594fSAndroid Build Coastguard Worker   for (HVecHalvingAdd* hadd_insn : hadd_insns) {
326*795d594fSAndroid Build Coastguard Worker     EXPECT_TRUE(hadd_insn->CanBeMoved());
327*795d594fSAndroid Build Coastguard Worker   }
328*795d594fSAndroid Build Coastguard Worker 
329*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v0->IsRounded());
330*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(!v1->IsRounded());
331*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v2->IsRounded());
332*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(!v3->IsRounded());
333*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v4->IsRounded());
334*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(!v5->IsRounded());
335*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v6->IsRounded());
336*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(!v7->IsRounded());
337*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v8->IsRounded());
338*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(!v9->IsRounded());
339*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v10->IsRounded());
340*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(!v11->IsRounded());
341*795d594fSAndroid Build Coastguard Worker 
342*795d594fSAndroid Build Coastguard Worker   for (HVecHalvingAdd* hadd_insn1 : hadd_insns) {
343*795d594fSAndroid Build Coastguard Worker     for (HVecHalvingAdd* hadd_insn2 : hadd_insns) {
344*795d594fSAndroid Build Coastguard Worker       EXPECT_EQ(hadd_insn1 == hadd_insn2, hadd_insn1->Equals(hadd_insn2));
345*795d594fSAndroid Build Coastguard Worker     }
346*795d594fSAndroid Build Coastguard Worker   }
347*795d594fSAndroid Build Coastguard Worker }
348*795d594fSAndroid Build Coastguard Worker 
TEST_F(NodesVectorTest,VectorOperationMattersOnMultiplyAccumulate)349*795d594fSAndroid Build Coastguard Worker TEST_F(NodesVectorTest, VectorOperationMattersOnMultiplyAccumulate) {
350*795d594fSAndroid Build Coastguard Worker   HVecOperation* v0 = new (GetAllocator())
351*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt32, 4, kNoDexPc);
352*795d594fSAndroid Build Coastguard Worker 
353*795d594fSAndroid Build Coastguard Worker   HVecMultiplyAccumulate* v1 = new (GetAllocator()) HVecMultiplyAccumulate(
354*795d594fSAndroid Build Coastguard Worker       GetAllocator(), HInstruction::kAdd, v0, v0, v0, DataType::Type::kInt32, 4, kNoDexPc);
355*795d594fSAndroid Build Coastguard Worker   HVecMultiplyAccumulate* v2 = new (GetAllocator()) HVecMultiplyAccumulate(
356*795d594fSAndroid Build Coastguard Worker       GetAllocator(), HInstruction::kSub, v0, v0, v0, DataType::Type::kInt32, 4, kNoDexPc);
357*795d594fSAndroid Build Coastguard Worker   HVecMultiplyAccumulate* v3 = new (GetAllocator()) HVecMultiplyAccumulate(
358*795d594fSAndroid Build Coastguard Worker       GetAllocator(), HInstruction::kAdd, v0, v0, v0, DataType::Type::kInt32, 2, kNoDexPc);
359*795d594fSAndroid Build Coastguard Worker 
360*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->CanBeMoved());
361*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->CanBeMoved());
362*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v2->CanBeMoved());
363*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v3->CanBeMoved());
364*795d594fSAndroid Build Coastguard Worker 
365*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(HInstruction::kAdd, v1->GetOpKind());
366*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(HInstruction::kSub, v2->GetOpKind());
367*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(HInstruction::kAdd, v3->GetOpKind());
368*795d594fSAndroid Build Coastguard Worker 
369*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->Equals(v1));
370*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v2->Equals(v2));
371*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v3->Equals(v3));
372*795d594fSAndroid Build Coastguard Worker 
373*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v1->Equals(v2));  // different operators
374*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v1->Equals(v3));  // different vector lengths
375*795d594fSAndroid Build Coastguard Worker }
376*795d594fSAndroid Build Coastguard Worker 
TEST_F(NodesVectorTest,VectorKindMattersOnReduce)377*795d594fSAndroid Build Coastguard Worker TEST_F(NodesVectorTest, VectorKindMattersOnReduce) {
378*795d594fSAndroid Build Coastguard Worker   HVecOperation* v0 = new (GetAllocator())
379*795d594fSAndroid Build Coastguard Worker       HVecReplicateScalar(GetAllocator(), int32_parameter_, DataType::Type::kInt32, 4, kNoDexPc);
380*795d594fSAndroid Build Coastguard Worker 
381*795d594fSAndroid Build Coastguard Worker   HVecReduce* v1 = new (GetAllocator()) HVecReduce(
382*795d594fSAndroid Build Coastguard Worker       GetAllocator(), v0, DataType::Type::kInt32, 4, HVecReduce::kSum, kNoDexPc);
383*795d594fSAndroid Build Coastguard Worker   HVecReduce* v2 = new (GetAllocator()) HVecReduce(
384*795d594fSAndroid Build Coastguard Worker       GetAllocator(), v0, DataType::Type::kInt32, 4, HVecReduce::kMin, kNoDexPc);
385*795d594fSAndroid Build Coastguard Worker   HVecReduce* v3 = new (GetAllocator()) HVecReduce(
386*795d594fSAndroid Build Coastguard Worker       GetAllocator(), v0, DataType::Type::kInt32, 4, HVecReduce::kMax, kNoDexPc);
387*795d594fSAndroid Build Coastguard Worker 
388*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v0->CanBeMoved());
389*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->CanBeMoved());
390*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v2->CanBeMoved());
391*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v3->CanBeMoved());
392*795d594fSAndroid Build Coastguard Worker 
393*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(HVecReduce::kSum, v1->GetReductionKind());
394*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(HVecReduce::kMin, v2->GetReductionKind());
395*795d594fSAndroid Build Coastguard Worker   EXPECT_EQ(HVecReduce::kMax, v3->GetReductionKind());
396*795d594fSAndroid Build Coastguard Worker 
397*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v1->Equals(v1));
398*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v2->Equals(v2));
399*795d594fSAndroid Build Coastguard Worker   EXPECT_TRUE(v3->Equals(v3));
400*795d594fSAndroid Build Coastguard Worker 
401*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v1->Equals(v2));  // different kinds
402*795d594fSAndroid Build Coastguard Worker   EXPECT_FALSE(v1->Equals(v3));
403*795d594fSAndroid Build Coastguard Worker }
404*795d594fSAndroid Build Coastguard Worker 
405*795d594fSAndroid Build Coastguard Worker }  // namespace art
406