xref: /aosp_15_r20/art/test/2019-constantcalculationsinking/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2017 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker /**
17*795d594fSAndroid Build Coastguard Worker  *
18*795d594fSAndroid Build Coastguard Worker  * L: Break operator doesn't break one basic block limitation for int,
19*795d594fSAndroid Build Coastguard Worker  * for some reasons (most probably not a bug), there are two basic blocks for long type,
20*795d594fSAndroid Build Coastguard Worker  * 1 sinking expected for int, 0 for long.
21*795d594fSAndroid Build Coastguard Worker  * M: no limitations on basic blocks number, 1 constant calculation sinking expected for
22*795d594fSAndroid Build Coastguard Worker  * each method
23*795d594fSAndroid Build Coastguard Worker  *
24*795d594fSAndroid Build Coastguard Worker  **/
25*795d594fSAndroid Build Coastguard Worker 
26*795d594fSAndroid Build Coastguard Worker public class Main {
27*795d594fSAndroid Build Coastguard Worker 
28*795d594fSAndroid Build Coastguard Worker     final int iterations = 1100;
29*795d594fSAndroid Build Coastguard Worker 
assertIntEquals(int expected, int result)30*795d594fSAndroid Build Coastguard Worker     public static void assertIntEquals(int expected, int result) {
31*795d594fSAndroid Build Coastguard Worker         if (expected != result) {
32*795d594fSAndroid Build Coastguard Worker             throw new Error("Expected: " + expected + ", found: " + result);
33*795d594fSAndroid Build Coastguard Worker         }
34*795d594fSAndroid Build Coastguard Worker     }
35*795d594fSAndroid Build Coastguard Worker 
assertLongEquals(long expected, long result)36*795d594fSAndroid Build Coastguard Worker     public static void assertLongEquals(long expected, long result) {
37*795d594fSAndroid Build Coastguard Worker         if (expected != result) {
38*795d594fSAndroid Build Coastguard Worker             throw new Error("Expected: " + expected + ", found: " + result);
39*795d594fSAndroid Build Coastguard Worker         }
40*795d594fSAndroid Build Coastguard Worker     }
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker 
testLoopAddInt()43*795d594fSAndroid Build Coastguard Worker     public int testLoopAddInt() {
44*795d594fSAndroid Build Coastguard Worker         int testVar = 10000;
45*795d594fSAndroid Build Coastguard Worker         int additionalVar = 10;
46*795d594fSAndroid Build Coastguard Worker 
47*795d594fSAndroid Build Coastguard Worker         outer:
48*795d594fSAndroid Build Coastguard Worker             for (int i = 0; i < iterations; i++) {
49*795d594fSAndroid Build Coastguard Worker                 additionalVar += i;
50*795d594fSAndroid Build Coastguard Worker                 for (int k = 0; k < iterations; k++) {
51*795d594fSAndroid Build Coastguard Worker                     additionalVar += k;
52*795d594fSAndroid Build Coastguard Worker                     testVar += 5;
53*795d594fSAndroid Build Coastguard Worker                     continue outer;
54*795d594fSAndroid Build Coastguard Worker                 }
55*795d594fSAndroid Build Coastguard Worker             }
56*795d594fSAndroid Build Coastguard Worker         assertIntEquals(testVar + additionalVar, 619960);
57*795d594fSAndroid Build Coastguard Worker         return testVar + additionalVar;
58*795d594fSAndroid Build Coastguard Worker     }
59*795d594fSAndroid Build Coastguard Worker 
testLoopSubInt()60*795d594fSAndroid Build Coastguard Worker     public int testLoopSubInt() {
61*795d594fSAndroid Build Coastguard Worker         int testVar = 10000;
62*795d594fSAndroid Build Coastguard Worker         int additionalVar = 10;
63*795d594fSAndroid Build Coastguard Worker 
64*795d594fSAndroid Build Coastguard Worker         outer:
65*795d594fSAndroid Build Coastguard Worker             for (int i = 0; i < iterations; i++) {
66*795d594fSAndroid Build Coastguard Worker                 additionalVar += i;
67*795d594fSAndroid Build Coastguard Worker                 for (int k = 0; k < iterations; k++) {
68*795d594fSAndroid Build Coastguard Worker                     additionalVar += k;
69*795d594fSAndroid Build Coastguard Worker                     testVar -= 5;
70*795d594fSAndroid Build Coastguard Worker                     continue outer;
71*795d594fSAndroid Build Coastguard Worker                 }
72*795d594fSAndroid Build Coastguard Worker             }
73*795d594fSAndroid Build Coastguard Worker         assertIntEquals(testVar + additionalVar, 608960);
74*795d594fSAndroid Build Coastguard Worker         return testVar + additionalVar;
75*795d594fSAndroid Build Coastguard Worker     }
76*795d594fSAndroid Build Coastguard Worker 
testLoopSubLong()77*795d594fSAndroid Build Coastguard Worker     public long testLoopSubLong() {
78*795d594fSAndroid Build Coastguard Worker         long testVar = 10000;
79*795d594fSAndroid Build Coastguard Worker         long additionalVar = 10;
80*795d594fSAndroid Build Coastguard Worker 
81*795d594fSAndroid Build Coastguard Worker         outer:
82*795d594fSAndroid Build Coastguard Worker             for (long i = 0; i < iterations; i++) {
83*795d594fSAndroid Build Coastguard Worker                 additionalVar += i;
84*795d594fSAndroid Build Coastguard Worker                 for (long k = 0; k < iterations; k++) {
85*795d594fSAndroid Build Coastguard Worker                     additionalVar += k;
86*795d594fSAndroid Build Coastguard Worker                     testVar -= 5;
87*795d594fSAndroid Build Coastguard Worker                     continue outer;
88*795d594fSAndroid Build Coastguard Worker                 }
89*795d594fSAndroid Build Coastguard Worker             }
90*795d594fSAndroid Build Coastguard Worker         assertLongEquals(testVar + additionalVar, 608960);
91*795d594fSAndroid Build Coastguard Worker         return testVar + additionalVar;
92*795d594fSAndroid Build Coastguard Worker     }
93*795d594fSAndroid Build Coastguard Worker 
testLoopMulInt(int n)94*795d594fSAndroid Build Coastguard Worker     public int testLoopMulInt(int n) {
95*795d594fSAndroid Build Coastguard Worker         int testVar = 1;
96*795d594fSAndroid Build Coastguard Worker         int additionalVar = 10;
97*795d594fSAndroid Build Coastguard Worker 
98*795d594fSAndroid Build Coastguard Worker         outer:
99*795d594fSAndroid Build Coastguard Worker             for (int i = 0; i < 3; i++) {
100*795d594fSAndroid Build Coastguard Worker                 additionalVar += i + n * 2;
101*795d594fSAndroid Build Coastguard Worker                 for (int k = 0; k < 5; k++) {
102*795d594fSAndroid Build Coastguard Worker                     additionalVar += k + n + k % 3 - i % 2 + n % 4 - i % 5
103*795d594fSAndroid Build Coastguard Worker                                      + (k + 2) / 7 - (i - 5) / 3 + k * 3 - k / 2;
104*795d594fSAndroid Build Coastguard Worker                     testVar *= 6;
105*795d594fSAndroid Build Coastguard Worker                     continue outer;
106*795d594fSAndroid Build Coastguard Worker                 }
107*795d594fSAndroid Build Coastguard Worker             }
108*795d594fSAndroid Build Coastguard Worker         assertIntEquals(testVar + additionalVar, 324);
109*795d594fSAndroid Build Coastguard Worker         return testVar + additionalVar;
110*795d594fSAndroid Build Coastguard Worker     }
111*795d594fSAndroid Build Coastguard Worker 
testLoopMulLong(long n)112*795d594fSAndroid Build Coastguard Worker     public long testLoopMulLong(long n) {
113*795d594fSAndroid Build Coastguard Worker         long testVar = 1;
114*795d594fSAndroid Build Coastguard Worker         long additionalVar = 10;
115*795d594fSAndroid Build Coastguard Worker 
116*795d594fSAndroid Build Coastguard Worker         outer:
117*795d594fSAndroid Build Coastguard Worker             for (long i = 0; i < 5; i++) {
118*795d594fSAndroid Build Coastguard Worker                 additionalVar += i + n;
119*795d594fSAndroid Build Coastguard Worker                 for (long k = 0; k < 5; k++) {
120*795d594fSAndroid Build Coastguard Worker                     additionalVar += k + n + k % 3 - i % 2 + n % 4 - i % 5
121*795d594fSAndroid Build Coastguard Worker                                      + (k + 2) / 7 - (i - 5) / 3 + k * 3 - k / 2;
122*795d594fSAndroid Build Coastguard Worker                     testVar *= 6L;
123*795d594fSAndroid Build Coastguard Worker                     continue outer;
124*795d594fSAndroid Build Coastguard Worker                 }
125*795d594fSAndroid Build Coastguard Worker             }
126*795d594fSAndroid Build Coastguard Worker         assertLongEquals(testVar + additionalVar, 7897);
127*795d594fSAndroid Build Coastguard Worker         return testVar + additionalVar;
128*795d594fSAndroid Build Coastguard Worker     }
129*795d594fSAndroid Build Coastguard Worker 
testLoopDivInt()130*795d594fSAndroid Build Coastguard Worker     public int testLoopDivInt() {
131*795d594fSAndroid Build Coastguard Worker         int testVar = 10000;
132*795d594fSAndroid Build Coastguard Worker         int additionalVar = 10;
133*795d594fSAndroid Build Coastguard Worker 
134*795d594fSAndroid Build Coastguard Worker         outer:
135*795d594fSAndroid Build Coastguard Worker             for (int i = 0; i < iterations; i++) {
136*795d594fSAndroid Build Coastguard Worker                 additionalVar += i;
137*795d594fSAndroid Build Coastguard Worker                 for (int k = 0; k < iterations; k++) {
138*795d594fSAndroid Build Coastguard Worker                     additionalVar += k;
139*795d594fSAndroid Build Coastguard Worker                     testVar /= 5;
140*795d594fSAndroid Build Coastguard Worker                     continue outer;
141*795d594fSAndroid Build Coastguard Worker                 }
142*795d594fSAndroid Build Coastguard Worker             }
143*795d594fSAndroid Build Coastguard Worker         assertIntEquals(testVar + additionalVar, 604460);
144*795d594fSAndroid Build Coastguard Worker         return testVar + additionalVar;
145*795d594fSAndroid Build Coastguard Worker     }
146*795d594fSAndroid Build Coastguard Worker 
testLoopDivLong()147*795d594fSAndroid Build Coastguard Worker     public long testLoopDivLong() {
148*795d594fSAndroid Build Coastguard Worker         long testVar = 10000;
149*795d594fSAndroid Build Coastguard Worker         long additionalVar = 10;
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker         outer:
152*795d594fSAndroid Build Coastguard Worker             for (long i = 0; i < iterations; i++) {
153*795d594fSAndroid Build Coastguard Worker                 additionalVar += i;
154*795d594fSAndroid Build Coastguard Worker                 for (long k = 0; k < iterations; k++) {
155*795d594fSAndroid Build Coastguard Worker                     additionalVar += k;
156*795d594fSAndroid Build Coastguard Worker                     testVar /= 5;
157*795d594fSAndroid Build Coastguard Worker                     continue outer;
158*795d594fSAndroid Build Coastguard Worker                 }
159*795d594fSAndroid Build Coastguard Worker             }
160*795d594fSAndroid Build Coastguard Worker         assertLongEquals(testVar + additionalVar, 604460);
161*795d594fSAndroid Build Coastguard Worker         return testVar + additionalVar;
162*795d594fSAndroid Build Coastguard Worker     }
163*795d594fSAndroid Build Coastguard Worker 
testLoopRemInt()164*795d594fSAndroid Build Coastguard Worker     public int testLoopRemInt() {
165*795d594fSAndroid Build Coastguard Worker         int testVar = 10000;
166*795d594fSAndroid Build Coastguard Worker         int additionalVar = 10;
167*795d594fSAndroid Build Coastguard Worker 
168*795d594fSAndroid Build Coastguard Worker         outer:
169*795d594fSAndroid Build Coastguard Worker             for (int i = 0; i < iterations; i++) {
170*795d594fSAndroid Build Coastguard Worker                 additionalVar += i;
171*795d594fSAndroid Build Coastguard Worker                 for (int k = 0; k < iterations; k++) {
172*795d594fSAndroid Build Coastguard Worker                     additionalVar += k;
173*795d594fSAndroid Build Coastguard Worker                     testVar %= 5;
174*795d594fSAndroid Build Coastguard Worker                     continue outer;
175*795d594fSAndroid Build Coastguard Worker                 }
176*795d594fSAndroid Build Coastguard Worker             }
177*795d594fSAndroid Build Coastguard Worker         assertIntEquals(testVar + additionalVar, 604460);
178*795d594fSAndroid Build Coastguard Worker         return testVar + additionalVar;
179*795d594fSAndroid Build Coastguard Worker     }
180*795d594fSAndroid Build Coastguard Worker 
testLoopRemLong()181*795d594fSAndroid Build Coastguard Worker     public long testLoopRemLong() {
182*795d594fSAndroid Build Coastguard Worker         long testVar = 10000;
183*795d594fSAndroid Build Coastguard Worker         long additionalVar = 10;
184*795d594fSAndroid Build Coastguard Worker 
185*795d594fSAndroid Build Coastguard Worker         outer:
186*795d594fSAndroid Build Coastguard Worker             for (long i = 0; i < iterations; i++) {
187*795d594fSAndroid Build Coastguard Worker                 additionalVar += i;
188*795d594fSAndroid Build Coastguard Worker                 for (long k = 0; k < iterations; k++) {
189*795d594fSAndroid Build Coastguard Worker                     additionalVar += k;
190*795d594fSAndroid Build Coastguard Worker                     testVar %= 5;
191*795d594fSAndroid Build Coastguard Worker                     continue outer;
192*795d594fSAndroid Build Coastguard Worker                 }
193*795d594fSAndroid Build Coastguard Worker             }
194*795d594fSAndroid Build Coastguard Worker         assertLongEquals(testVar + additionalVar, 604460);
195*795d594fSAndroid Build Coastguard Worker         return testVar + additionalVar;
196*795d594fSAndroid Build Coastguard Worker     }
197*795d594fSAndroid Build Coastguard Worker 
testLoopAddLong()198*795d594fSAndroid Build Coastguard Worker     public long testLoopAddLong() {
199*795d594fSAndroid Build Coastguard Worker         long testVar = 10000;
200*795d594fSAndroid Build Coastguard Worker         long additionalVar = 10;
201*795d594fSAndroid Build Coastguard Worker 
202*795d594fSAndroid Build Coastguard Worker         outer:
203*795d594fSAndroid Build Coastguard Worker             for (long i = 0; i < iterations; i++) {
204*795d594fSAndroid Build Coastguard Worker                 additionalVar += i;
205*795d594fSAndroid Build Coastguard Worker                 for (long k = 0; k < iterations; k++) {
206*795d594fSAndroid Build Coastguard Worker                     additionalVar += k;
207*795d594fSAndroid Build Coastguard Worker                     testVar += 5;
208*795d594fSAndroid Build Coastguard Worker                     continue outer;
209*795d594fSAndroid Build Coastguard Worker                 }
210*795d594fSAndroid Build Coastguard Worker             }
211*795d594fSAndroid Build Coastguard Worker         assertLongEquals(testVar + additionalVar, 619960);
212*795d594fSAndroid Build Coastguard Worker         return testVar + additionalVar;
213*795d594fSAndroid Build Coastguard Worker     }
214*795d594fSAndroid Build Coastguard Worker 
main(String[] args)215*795d594fSAndroid Build Coastguard Worker     public static void main(String[] args) {
216*795d594fSAndroid Build Coastguard Worker         Main obj = new Main();
217*795d594fSAndroid Build Coastguard Worker         obj.testLoopAddInt();
218*795d594fSAndroid Build Coastguard Worker         obj.testLoopAddLong();
219*795d594fSAndroid Build Coastguard Worker         obj.testLoopRemLong();
220*795d594fSAndroid Build Coastguard Worker         obj.testLoopRemInt();
221*795d594fSAndroid Build Coastguard Worker         obj.testLoopDivLong();
222*795d594fSAndroid Build Coastguard Worker         obj.testLoopDivInt();
223*795d594fSAndroid Build Coastguard Worker         obj.testLoopMulLong(10);
224*795d594fSAndroid Build Coastguard Worker         obj.testLoopMulInt(10);
225*795d594fSAndroid Build Coastguard Worker         obj.testLoopSubLong();
226*795d594fSAndroid Build Coastguard Worker         obj.testLoopSubInt();
227*795d594fSAndroid Build Coastguard Worker     }
228*795d594fSAndroid Build Coastguard Worker 
229*795d594fSAndroid Build Coastguard Worker }
230