xref: /aosp_15_r20/art/test/2275-checker-empty-loops/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1 /*
2  * Copyright (C) 2024 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 public class Main {
18     static int static_int = 0;
19     static long static_long = 0;
20 
main(String[] args)21     public static void main(String[] args) {
22         $noinline$testSameStartEndInt();
23         assertIntEquals(0, static_int);
24         $noinline$testStartBiggerThanEndInt();
25         assertIntEquals(0, static_int);
26         $noinline$testUnknownParameterValuesInt(10, 1);
27         assertIntEquals(0, static_int);
28         $noinline$testKnownParameterValuesInt();
29         assertIntEquals(0, static_int);
30         $noinline$testKnownParameterValuesInt_WithOverflow();
31         assertIntEquals(0, static_int);
32 
33         $noinline$testSameStartEndLong();
34         assertLongEquals(0L, static_long);
35         $noinline$testStartBiggerThanEndLong();
36         assertLongEquals(0L, static_long);
37         $noinline$testUnknownParameterValuesLong(10L, 1L);
38         assertLongEquals(0L, static_long);
39         $noinline$testKnownParameterValuesLong();
40         assertLongEquals(0L, static_long);
41         $noinline$testKnownParameterValuesLong_WithOverflow();
42         assertLongEquals(0L, static_long);
43     }
44 
45     /// CHECK-START: void Main.$noinline$testSameStartEndInt() loop_optimization (before)
46     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
47     /// CHECK:               If [<<Comp>>]
48 
49     /// CHECK-START: void Main.$noinline$testSameStartEndInt() loop_optimization (after)
50     /// CHECK: <<Const1:i\d+>> IntConstant 1
51     /// CHECK:                 If [<<Const1>>]
52 
53     /// CHECK-START: void Main.$noinline$testSameStartEndInt() dead_code_elimination$after_loop_opt (before)
54     /// CHECK:     Phi
55     /// CHECK:     GreaterThanOrEqual
56     /// CHECK:     If
57     /// CHECK:     StaticFieldSet
58 
59     /// CHECK-START: void Main.$noinline$testSameStartEndInt() dead_code_elimination$after_loop_opt (after)
60     /// CHECK-NOT: Phi
61     /// CHECK-NOT: GreaterThanOrEqual
62     /// CHECK-NOT: If
63     /// CHECK-NOT: StaticFieldSet
$noinline$testSameStartEndInt()64     private static void $noinline$testSameStartEndInt() {
65         for (int i = 2; i < 2; i++) {
66             static_int = 24;
67         }
68     }
69 
70     /// CHECK-START: void Main.$noinline$testStartBiggerThanEndInt() loop_optimization (before)
71     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
72     /// CHECK:               If [<<Comp>>]
73 
74     /// CHECK-START: void Main.$noinline$testStartBiggerThanEndInt() loop_optimization (after)
75     /// CHECK: <<Const1:i\d+>> IntConstant 1
76     /// CHECK:                 If [<<Const1>>]
77 
78     /// CHECK-START: void Main.$noinline$testStartBiggerThanEndInt() dead_code_elimination$after_loop_opt (before)
79     /// CHECK:     Phi
80     /// CHECK:     GreaterThanOrEqual
81     /// CHECK:     If
82     /// CHECK:     StaticFieldSet
83 
84     /// CHECK-START: void Main.$noinline$testStartBiggerThanEndInt() dead_code_elimination$after_loop_opt (after)
85     /// CHECK-NOT: Phi
86     /// CHECK-NOT: GreaterThanOrEqual
87     /// CHECK-NOT: If
88     /// CHECK-NOT: StaticFieldSet
$noinline$testStartBiggerThanEndInt()89     public static void $noinline$testStartBiggerThanEndInt() {
90         for (int i = 2; i < 1; i++) {
91             static_int = 24;
92         }
93     }
94 
95     // Since the parameters are unknown, we have to keep the loop.
96 
97     /// CHECK-START: void Main.$noinline$testUnknownParameterValuesInt(int, int) loop_optimization (before)
98     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
99     /// CHECK:               If [<<Comp>>]
100 
101     /// CHECK-START: void Main.$noinline$testUnknownParameterValuesInt(int, int) loop_optimization (after)
102     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
103     /// CHECK:               If [<<Comp>>]
$noinline$testUnknownParameterValuesInt(int start, int end)104     public static void $noinline$testUnknownParameterValuesInt(int start, int end) {
105         for (int i = start; i < end; i++) {
106             static_int = 24;
107         }
108     }
109 
$inline$unknownParameterValuesInt(int start, int end)110     public static void $inline$unknownParameterValuesInt(int start, int end) {
111         for (int i = start; i < end; i++) {
112             static_int = 24;
113         }
114     }
115 
116     /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt() loop_optimization (before)
117     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
118     /// CHECK:               If [<<Comp>>]
119 
120     /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt() loop_optimization (after)
121     /// CHECK: <<Const1:i\d+>> IntConstant 1
122     /// CHECK:                 If [<<Const1>>]
123 
124     /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt() dead_code_elimination$after_loop_opt (before)
125     /// CHECK:     Phi
126     /// CHECK:     GreaterThanOrEqual
127     /// CHECK:     If
128     /// CHECK:     StaticFieldSet
129 
130     /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt() dead_code_elimination$after_loop_opt (after)
131     /// CHECK-NOT: Phi
132     /// CHECK-NOT: GreaterThanOrEqual
133     /// CHECK-NOT: If
134     /// CHECK-NOT: StaticFieldSet
$noinline$testKnownParameterValuesInt()135     public static void $noinline$testKnownParameterValuesInt() {
136         $inline$unknownParameterValuesInt(10, 1);
137     }
138 
139     // Known limitatation: The loop count calculation would overflow so loop optimization doesn't
140     // know how many trips there are.
141 
142     /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt_WithOverflow() loop_optimization (before)
143     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
144     /// CHECK:               If [<<Comp>>]
145 
146     /// CHECK-START: void Main.$noinline$testKnownParameterValuesInt_WithOverflow() loop_optimization (after)
147     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
148     /// CHECK:               If [<<Comp>>]
$noinline$testKnownParameterValuesInt_WithOverflow()149     public static void $noinline$testKnownParameterValuesInt_WithOverflow() {
150         $inline$unknownParameterValuesInt(Integer.MAX_VALUE, Integer.MIN_VALUE);
151     }
152 
153     /// CHECK-START: void Main.$noinline$testSameStartEndLong() loop_optimization (before)
154     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
155     /// CHECK:               If [<<Comp>>]
156 
157     /// CHECK-START: void Main.$noinline$testSameStartEndLong() loop_optimization (after)
158     /// CHECK: <<Const1:i\d+>> IntConstant 1
159     /// CHECK:                 If [<<Const1>>]
160 
161     /// CHECK-START: void Main.$noinline$testSameStartEndLong() dead_code_elimination$after_loop_opt (before)
162     /// CHECK:     Phi
163     /// CHECK:     GreaterThanOrEqual
164     /// CHECK:     If
165     /// CHECK:     StaticFieldSet
166 
167     /// CHECK-START: void Main.$noinline$testSameStartEndLong() dead_code_elimination$after_loop_opt (after)
168     /// CHECK-NOT: Phi
169     /// CHECK-NOT: GreaterThanOrEqual
170     /// CHECK-NOT: If
171     /// CHECK-NOT: StaticFieldSet
$noinline$testSameStartEndLong()172     private static void $noinline$testSameStartEndLong() {
173         for (long i = 2; i < 2; i++) {
174             static_long = 24;
175         }
176     }
177 
178     /// CHECK-START: void Main.$noinline$testStartBiggerThanEndLong() loop_optimization (before)
179     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
180     /// CHECK:               If [<<Comp>>]
181 
182     /// CHECK-START: void Main.$noinline$testStartBiggerThanEndLong() loop_optimization (after)
183     /// CHECK: <<Const1:i\d+>> IntConstant 1
184     /// CHECK:                 If [<<Const1>>]
185 
186     /// CHECK-START: void Main.$noinline$testStartBiggerThanEndLong() dead_code_elimination$after_loop_opt (before)
187     /// CHECK:     Phi
188     /// CHECK:     GreaterThanOrEqual
189     /// CHECK:     If
190     /// CHECK:     StaticFieldSet
191 
192     /// CHECK-START: void Main.$noinline$testStartBiggerThanEndLong() dead_code_elimination$after_loop_opt (after)
193     /// CHECK-NOT: Phi
194     /// CHECK-NOT: GreaterThanOrEqual
195     /// CHECK-NOT: If
196     /// CHECK-NOT: StaticFieldSet
$noinline$testStartBiggerThanEndLong()197     public static void $noinline$testStartBiggerThanEndLong() {
198         for (long i = 2; i < 1; i++) {
199             static_long = 24;
200         }
201     }
202 
203     // Since the parameters are unknown, we have to keep the loop.
204 
205     /// CHECK-START: void Main.$noinline$testUnknownParameterValuesLong(long, long) loop_optimization (before)
206     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
207     /// CHECK:               If [<<Comp>>]
208 
209     /// CHECK-START: void Main.$noinline$testUnknownParameterValuesLong(long, long) loop_optimization (after)
210     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
211     /// CHECK:               If [<<Comp>>]
$noinline$testUnknownParameterValuesLong(long start, long end)212     public static void $noinline$testUnknownParameterValuesLong(long start, long end) {
213         for (long i = start; i < end; i++) {
214             static_long = 24;
215         }
216     }
217 
$inline$unknownParameterValuesLong(long start, long end)218     public static void $inline$unknownParameterValuesLong(long start, long end) {
219         for (long i = start; i < end; i++) {
220             static_long = 24;
221         }
222     }
223 
224     /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong() loop_optimization (before)
225     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
226     /// CHECK:               If [<<Comp>>]
227 
228     /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong() loop_optimization (after)
229     /// CHECK: <<Const1:i\d+>> IntConstant 1
230     /// CHECK:                 If [<<Const1>>]
231 
232     /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong() dead_code_elimination$after_loop_opt (before)
233     /// CHECK:     Phi
234     /// CHECK:     GreaterThanOrEqual
235     /// CHECK:     If
236     /// CHECK:     StaticFieldSet
237 
238     /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong() dead_code_elimination$after_loop_opt (after)
239     /// CHECK-NOT: Phi
240     /// CHECK-NOT: GreaterThanOrEqual
241     /// CHECK-NOT: If
242     /// CHECK-NOT: StaticFieldSet
$noinline$testKnownParameterValuesLong()243     public static void $noinline$testKnownParameterValuesLong() {
244         $inline$unknownParameterValuesLong(10L, 1L);
245     }
246 
247     // Known limitatation: The loop count calculation would overflow so loop optimization doesn't
248     // know how many trips there are.
249 
250     /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong_WithOverflow() loop_optimization (before)
251     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
252     /// CHECK:               If [<<Comp>>]
253 
254     /// CHECK-START: void Main.$noinline$testKnownParameterValuesLong_WithOverflow() loop_optimization (after)
255     /// CHECK: <<Comp:z\d+>> GreaterThanOrEqual
256     /// CHECK:               If [<<Comp>>]
$noinline$testKnownParameterValuesLong_WithOverflow()257     public static void $noinline$testKnownParameterValuesLong_WithOverflow() {
258         $inline$unknownParameterValuesLong(Long.MAX_VALUE, Long.MIN_VALUE);
259     }
260 
assertIntEquals(int expected, int result)261     public static void assertIntEquals(int expected, int result) {
262         if (expected != result) {
263             throw new Error("Expected: " + expected + ", found: " + result);
264         }
265     }
266 
assertLongEquals(long expected, long result)267     public static void assertLongEquals(long expected, long result) {
268         if (expected != result) {
269             throw new Error("Expected: " + expected + ", found: " + result);
270         }
271     }
272 }
273