diff options
author | 2024-07-09 14:59:22 +0100 | |
---|---|---|
committer | 2024-07-10 12:24:32 +0000 | |
commit | 23d41e80e752feaee439a4535721cfcf42795b88 (patch) | |
tree | f526f8d2c02fe39eb4220baa6ce49b2b96a23787 | |
parent | 894751180d273b68487f12f3532f24a219deb580 (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.cc | 4 | ||||
-rw-r--r-- | test/2278-nested-loops/expected-stderr.txt | 0 | ||||
-rw-r--r-- | test/2278-nested-loops/expected-stdout.txt | 0 | ||||
-rw-r--r-- | test/2278-nested-loops/info.txt | 1 | ||||
-rw-r--r-- | test/2278-nested-loops/src/Main.java | 90 |
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); + } + } +} |