Support VecLoad and VecStore in LSA.
Test: test-art-host
Test: test-art-target
Test: load_store_analysis_test
Change-Id: I7d819061ec9ea12f86a926566c3845231fce6e26
diff --git a/compiler/optimizing/load_store_elimination.cc b/compiler/optimizing/load_store_elimination.cc
index c899613..8678fab 100644
--- a/compiler/optimizing/load_store_elimination.cc
+++ b/compiler/optimizing/load_store_elimination.cc
@@ -302,11 +302,12 @@
HInstruction* ref,
size_t offset,
HInstruction* index,
+ size_t vector_length,
int16_t declaring_class_def_index) {
HInstruction* original_ref = heap_location_collector_.HuntForOriginalReference(ref);
ReferenceInfo* ref_info = heap_location_collector_.FindReferenceInfoOf(original_ref);
size_t idx = heap_location_collector_.FindHeapLocationIndex(
- ref_info, offset, index, declaring_class_def_index);
+ ref_info, offset, index, vector_length, declaring_class_def_index);
DCHECK_NE(idx, HeapLocationCollector::kHeapLocationNotFound);
ScopedArenaVector<HInstruction*>& heap_values =
heap_values_for_[instruction->GetBlock()->GetBlockId()];
@@ -367,12 +368,13 @@
HInstruction* ref,
size_t offset,
HInstruction* index,
+ size_t vector_length,
int16_t declaring_class_def_index,
HInstruction* value) {
HInstruction* original_ref = heap_location_collector_.HuntForOriginalReference(ref);
ReferenceInfo* ref_info = heap_location_collector_.FindReferenceInfoOf(original_ref);
size_t idx = heap_location_collector_.FindHeapLocationIndex(
- ref_info, offset, index, declaring_class_def_index);
+ ref_info, offset, index, vector_length, declaring_class_def_index);
DCHECK_NE(idx, HeapLocationCollector::kHeapLocationNotFound);
ScopedArenaVector<HInstruction*>& heap_values =
heap_values_for_[instruction->GetBlock()->GetBlockId()];
@@ -446,7 +448,12 @@
HInstruction* obj = instruction->InputAt(0);
size_t offset = instruction->GetFieldInfo().GetFieldOffset().SizeValue();
int16_t declaring_class_def_index = instruction->GetFieldInfo().GetDeclaringClassDefIndex();
- VisitGetLocation(instruction, obj, offset, nullptr, declaring_class_def_index);
+ VisitGetLocation(instruction,
+ obj,
+ offset,
+ nullptr,
+ HeapLocation::kScalar,
+ declaring_class_def_index);
}
void VisitInstanceFieldSet(HInstanceFieldSet* instruction) OVERRIDE {
@@ -454,14 +461,25 @@
size_t offset = instruction->GetFieldInfo().GetFieldOffset().SizeValue();
int16_t declaring_class_def_index = instruction->GetFieldInfo().GetDeclaringClassDefIndex();
HInstruction* value = instruction->InputAt(1);
- VisitSetLocation(instruction, obj, offset, nullptr, declaring_class_def_index, value);
+ VisitSetLocation(instruction,
+ obj,
+ offset,
+ nullptr,
+ HeapLocation::kScalar,
+ declaring_class_def_index,
+ value);
}
void VisitStaticFieldGet(HStaticFieldGet* instruction) OVERRIDE {
HInstruction* cls = instruction->InputAt(0);
size_t offset = instruction->GetFieldInfo().GetFieldOffset().SizeValue();
int16_t declaring_class_def_index = instruction->GetFieldInfo().GetDeclaringClassDefIndex();
- VisitGetLocation(instruction, cls, offset, nullptr, declaring_class_def_index);
+ VisitGetLocation(instruction,
+ cls,
+ offset,
+ nullptr,
+ HeapLocation::kScalar,
+ declaring_class_def_index);
}
void VisitStaticFieldSet(HStaticFieldSet* instruction) OVERRIDE {
@@ -469,7 +487,13 @@
size_t offset = instruction->GetFieldInfo().GetFieldOffset().SizeValue();
int16_t declaring_class_def_index = instruction->GetFieldInfo().GetDeclaringClassDefIndex();
HInstruction* value = instruction->InputAt(1);
- VisitSetLocation(instruction, cls, offset, nullptr, declaring_class_def_index, value);
+ VisitSetLocation(instruction,
+ cls,
+ offset,
+ nullptr,
+ HeapLocation::kScalar,
+ declaring_class_def_index,
+ value);
}
void VisitArrayGet(HArrayGet* instruction) OVERRIDE {
@@ -479,6 +503,7 @@
array,
HeapLocation::kInvalidFieldOffset,
index,
+ HeapLocation::kScalar,
HeapLocation::kDeclaringClassDefIndexForArrays);
}
@@ -490,6 +515,7 @@
array,
HeapLocation::kInvalidFieldOffset,
index,
+ HeapLocation::kScalar,
HeapLocation::kDeclaringClassDefIndexForArrays,
value);
}