From 358af839c60db9e178f0b0bb9d430711c071b82a Mon Sep 17 00:00:00 2001 From: Aart Bik Date: Wed, 24 Feb 2016 14:17:53 -0800 Subject: Recognize for (int i = 0; i != x.length; i++) loops Rationale: Idiom occurs in real-life and is very straightforwardly recognized by existing induction/range machinery. Change-Id: I965a16e9de72f3523ea5023d30ed1c4e47ed5010 --- compiler/optimizing/induction_var_range.cc | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'compiler/optimizing/induction_var_range.cc') diff --git a/compiler/optimizing/induction_var_range.cc b/compiler/optimizing/induction_var_range.cc index b162696a42..f9b6910acd 100644 --- a/compiler/optimizing/induction_var_range.cc +++ b/compiler/optimizing/induction_var_range.cc @@ -216,6 +216,14 @@ bool InductionVarRange::IsConstant(HInductionVarAnalysis::InductionInfo* info, } } } while (RefineOuter(&v_min, &v_max)); + // Exploit array length + c >= c, with c <= 0 to avoid arithmetic wrap-around anomalies + // (e.g. array length == maxint and c == 1 would yield minint). + if (request == kAtLeast) { + if (v_min.a_constant == 1 && v_min.b_constant <= 0 && v_min.instruction->IsArrayLength()) { + *value = v_min.b_constant; + return true; + } + } } return false; } -- cgit v1.2.3-59-g8ed1b