Improve array index analysis in LSA.

This CL improves analysis on array index in load store analysis.

Test: m test-art-host
Test: m test-art-target
Test: m test-art-host-gtest-load_store_analysis_test

Change-Id: Id5e5aa8b396c68e082db95809659494107985fa2
diff --git a/compiler/optimizing/load_store_analysis.h b/compiler/optimizing/load_store_analysis.h
index 4e940f3..86fb8e0 100644
--- a/compiler/optimizing/load_store_analysis.h
+++ b/compiler/optimizing/load_store_analysis.h
@@ -214,6 +214,17 @@
     return nullptr;
   }
 
+  size_t GetArrayAccessHeapLocation(HInstruction* array, HInstruction* index) const {
+    DCHECK(array != nullptr);
+    DCHECK(index != nullptr);
+    HInstruction* original_ref = HuntForOriginalReference(array);
+    ReferenceInfo* ref_info = FindReferenceInfoOf(original_ref);
+    return FindHeapLocationIndex(ref_info,
+                                 HeapLocation::kInvalidFieldOffset,
+                                 index,
+                                 HeapLocation::kDeclaringClassDefIndexForArrays);
+  }
+
   bool HasHeapStores() const {
     return has_heap_stores_;
   }
@@ -300,6 +311,8 @@
     return true;
   }
 
+  bool CanArrayIndicesAlias(const HInstruction* i1, const HInstruction* i2) const;
+
   // `index1` and `index2` are indices in the array of collected heap locations.
   // Returns the position in the bit vector that tracks whether the two heap
   // locations may alias.
@@ -336,12 +349,7 @@
     if (loc1->IsArrayElement() && loc2->IsArrayElement()) {
       HInstruction* array_index1 = loc1->GetIndex();
       HInstruction* array_index2 = loc2->GetIndex();
-      DCHECK(array_index1 != nullptr);
-      DCHECK(array_index2 != nullptr);
-      if (array_index1->IsIntConstant() &&
-          array_index2->IsIntConstant() &&
-          array_index1->AsIntConstant()->GetValue() != array_index2->AsIntConstant()->GetValue()) {
-        // Different constant indices do not alias.
+      if (!CanArrayIndicesAlias(array_index1, array_index2)) {
         return false;
       }
       ReferenceInfo* ref_info = loc1->GetReferenceInfo();