diff options
author | 2024-07-09 14:59:22 +0100 | |
---|---|---|
committer | 2024-07-10 12:24:32 +0000 | |
commit | 23d41e80e752feaee439a4535721cfcf42795b88 (patch) | |
tree | f526f8d2c02fe39eb4220baa6ce49b2b96a23787 /test/2278-nested-loops/src/Main.java | |
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
Diffstat (limited to 'test/2278-nested-loops/src/Main.java')
-rw-r--r-- | test/2278-nested-loops/src/Main.java | 90 |
1 files changed, 90 insertions, 0 deletions
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); + } + } +} |