summaryrefslogtreecommitdiff
path: root/compiler/optimizing
diff options
context:
space:
mode:
author Nicolas Geoffray <ngeoffray@google.com> 2015-06-24 15:51:38 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2015-06-24 15:51:38 +0000
commit0c955b174bf64707ee0ee03195ed56f9cec26fa2 (patch)
tree6c3ee67028e5f47a86bc20ee9323228a71033e57 /compiler/optimizing
parent22c4edd865bfdea29e80a789cef70e8e51d2a3a5 (diff)
parent8df886b9214802ad689316a1dedb00a6d102555c (diff)
Merge "BCE: don't assume a bounds check always gets a HArrayLength."
Diffstat (limited to 'compiler/optimizing')
-rw-r--r--compiler/optimizing/bounds_check_elimination.cc10
1 files changed, 8 insertions, 2 deletions
diff --git a/compiler/optimizing/bounds_check_elimination.cc b/compiler/optimizing/bounds_check_elimination.cc
index 92c7e28e97..ebc0adc64a 100644
--- a/compiler/optimizing/bounds_check_elimination.cc
+++ b/compiler/optimizing/bounds_check_elimination.cc
@@ -1386,7 +1386,7 @@ class BCEVisitor : public HGraphVisitor {
if (array_length->IsPhi()) {
// Input 1 of the phi contains the real array.length once the loop body is
// entered. That value will be used for bound analysis. The graph is still
- // strickly in SSA form.
+ // strictly in SSA form.
array_length = array_length->AsPhi()->InputAt(1)->AsArrayLength();
}
@@ -1782,7 +1782,13 @@ class BCEVisitor : public HGraphVisitor {
it != first_constant_index_bounds_check_map_.end();
++it) {
HBoundsCheck* bounds_check = it->second;
- HArrayLength* array_length = bounds_check->InputAt(1)->AsArrayLength();
+ HInstruction* array_length = bounds_check->InputAt(1);
+ if (!array_length->IsArrayLength()) {
+ // Prior deoptimizations may have changed the array length to a phi.
+ // TODO(mingyao): propagate the range to the phi?
+ DCHECK(array_length->IsPhi()) << array_length->DebugName();
+ continue;
+ }
HIntConstant* lower_bound_const_instr = nullptr;
int32_t lower_bound_const = INT_MIN;
size_t counter = 0;