summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Santiago Aboy Solanes <solanes@google.com> 2024-07-09 14:59:22 +0100
committer Treehugger Robot <android-test-infra-autosubmit@system.gserviceaccount.com> 2024-07-10 12:24:32 +0000
commit23d41e80e752feaee439a4535721cfcf42795b88 (patch)
treef526f8d2c02fe39eb4220baa6ce49b2b96a23787
parent894751180d273b68487f12f3532f24a219deb580 (diff)
Don't override is_min in the UseFullTripCount case
That information is propagated and used in other functions, so we have to keep the current value. Bug: 350830493 Fixes: 350830493 Test: art/test/testrunner/testrunner.py --host --64 --optimizing -b Change-Id: I25919aa3a1fedeca38e7633a87d60d44d7719724
-rw-r--r--compiler/optimizing/induction_var_range.cc4
-rw-r--r--test/2278-nested-loops/expected-stderr.txt0
-rw-r--r--test/2278-nested-loops/expected-stdout.txt0
-rw-r--r--test/2278-nested-loops/info.txt1
-rw-r--r--test/2278-nested-loops/src/Main.java90
5 files changed, 93 insertions, 2 deletions
diff --git a/compiler/optimizing/induction_var_range.cc b/compiler/optimizing/induction_var_range.cc
index 72719f89bf..767a149636 100644
--- a/compiler/optimizing/induction_var_range.cc
+++ b/compiler/optimizing/induction_var_range.cc
@@ -816,7 +816,7 @@ InductionVarRange::Value InductionVarRange::GetVal(const HBasicBlock* context,
case HInductionVarAnalysis::kTripCountInLoopUnsafe:
if (UseFullTripCount(context, loop, is_min)) {
// Return the full trip count (do not subtract 1 as we do in loop body).
- return GetVal(context, loop, info->op_a, trip, /*is_min=*/ false);
+ return GetVal(context, loop, info->op_a, trip, is_min);
}
FALLTHROUGH_INTENDED;
case HInductionVarAnalysis::kTripCountInBody:
@@ -1561,7 +1561,7 @@ bool InductionVarRange::GenerateCode(const HBasicBlock* context,
trip,
graph,
block,
- /*is_min=*/false,
+ is_min,
result,
allow_potential_overflow);
}
diff --git a/test/2278-nested-loops/expected-stderr.txt b/test/2278-nested-loops/expected-stderr.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/test/2278-nested-loops/expected-stderr.txt
diff --git a/test/2278-nested-loops/expected-stdout.txt b/test/2278-nested-loops/expected-stdout.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/test/2278-nested-loops/expected-stdout.txt
diff --git a/test/2278-nested-loops/info.txt b/test/2278-nested-loops/info.txt
new file mode 100644
index 0000000000..bc49582801
--- /dev/null
+++ b/test/2278-nested-loops/info.txt
@@ -0,0 +1 @@
+Tests that we correctly calculate nested loops.
diff --git a/test/2278-nested-loops/src/Main.java b/test/2278-nested-loops/src/Main.java
new file mode 100644
index 0000000000..48b9a925f1
--- /dev/null
+++ b/test/2278-nested-loops/src/Main.java
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+public class Main {
+ // Numbers have to be inlined for the bug to trigger: we cannot define this as a generic method
+ // that takes e.g. 12 as a parameter. We can define some methods to test different cases. Each
+ // method is the same as doing:
+ // result = initial_value;
+ // for (int i = start; i < end; ++i) { result += i * 10; }
+ // return result;
+ // As long as `end` is 5 or less
+
+ private static int $noinline$nestedLoopCalculation_0_2_12() {
+ int result = 12;
+ for (int outer = 0; outer < 2; ++outer) {
+ int first_inner;
+ for (first_inner = 5; first_inner > outer; first_inner--) {}
+ for (int second_inner = 0; second_inner < 10; second_inner++) {
+ result += first_inner;
+ }
+ }
+ return result;
+ }
+
+ private static int $noinline$nestedLoopCalculation_1_3_12() {
+ int result = 12;
+ for (int outer = 1; outer < 3; ++outer) {
+ int first_inner;
+ for (first_inner = 5; first_inner > outer; first_inner--) {}
+ for (int second_inner = 0; second_inner < 10; second_inner++) {
+ result += first_inner;
+ }
+ }
+ return result;
+ }
+
+ private static int $noinline$nestedLoopCalculation_minus2_2_12() {
+ int result = 12;
+ for (int outer = -2; outer < 2; ++outer) {
+ int first_inner;
+ for (first_inner = 5; first_inner > outer; first_inner--) {}
+ for (int second_inner = 0; second_inner < 10; second_inner++) {
+ result += first_inner;
+ }
+ }
+ return result;
+ }
+
+ private static int $noinline$nestedLoopCalculation_0_5_12() {
+ int result = 12;
+ for (int outer = 0; outer < 5; ++outer) {
+ int first_inner;
+ for (first_inner = 5; first_inner > outer; first_inner--) {}
+ for (int second_inner = 0; second_inner < 10; second_inner++) {
+ result += first_inner;
+ }
+ }
+ return result;
+ }
+
+ public static void main(String[] f) {
+ // 12 + 0 + 10 = 22
+ assertIntEquals(22, $noinline$nestedLoopCalculation_0_2_12());
+ // 12 + 10 + 20 = 42
+ assertIntEquals(42, $noinline$nestedLoopCalculation_1_3_12());
+ // 12 + (-20) + (-10) + 0 + 10 = -8
+ assertIntEquals(-8, $noinline$nestedLoopCalculation_minus2_2_12());
+ // 12 + 0 + 10 + 20 + 30 + 40 = 112
+ assertIntEquals(112, $noinline$nestedLoopCalculation_0_5_12());
+ }
+
+ public static void assertIntEquals(int expected, int result) {
+ if (expected != result) {
+ throw new Error("Expected: " + expected + ", found: " + result);
+ }
+ }
+}