xref: /aosp_15_r20/art/test/654-checker-periodic/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1 /*
2  * Copyright (C) 2017 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 /**
18  * Tests for last value of a few periodic sequences
19  * (found by fuzz testing).
20  */
21 public class Main {
22 
23   /// CHECK-START: int Main.doitUpInt(int) loop_optimization (before)
24   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
25   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
26   //
27   /// CHECK-START: int Main.doitUpInt(int) loop_optimization (after)
28   /// CHECK-NOT: Phi
doitUpInt(int n)29   static int doitUpInt(int n) {
30     // Complete loop is replaced by last-value.
31     int lI = 1;
32     for (int i1 = 0; i1  < n; i1++) {
33       lI = (1486662021 - lI);
34     }
35     return lI;
36   }
37 
38   /// CHECK-START: int Main.doitDownInt(int) loop_optimization (before)
39   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
40   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
41   //
42   /// CHECK-START: int Main.doitDownInt(int) loop_optimization (after)
43   /// CHECK-NOT: Phi
doitDownInt(int n)44   static int doitDownInt(int n) {
45     // Complete loop is replaced by last-value.
46     int lI = 1;
47     for (int i1 = n - 1; i1 >= 0; i1--) {
48       lI = (1486662021 - lI);
49     }
50     return lI;
51   }
52 
53   /// CHECK-START: int Main.doitDownInt2(int) loop_optimization (before)
54   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
55   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
56   //
57   /// CHECK-START: int Main.doitDownInt2(int) loop_optimization (after)
58   /// CHECK-NOT: Phi
doitDownInt2(int n)59   static int doitDownInt2(int n) {
60     // Complete loop is replaced by last-value.
61     int lI = 1;
62     for (int i1 = n; i1 > 0; i1--) {
63       lI = (1486662021 - lI);
64     }
65     return lI;
66   }
67 
68   /// CHECK-START: float Main.doitUpFloat(int) loop_optimization (before)
69   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
70   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
71   //
72   /// CHECK-START: float Main.doitUpFloat(int) loop_optimization (after)
73   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
74   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
doitUpFloat(int n)75   static float doitUpFloat(int n) {
76     // FP arithmetic is not sufficiently precise.
77     // The loop remains.
78     float lF = 1.0f;
79     for (int i1 = 0; i1  < n; i1++) {
80       lF = (1486662021.0f - lF);
81     }
82     return lF;
83   }
84 
85   /// CHECK-START: float Main.doitDownFloat(int) loop_optimization (before)
86   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
87   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
88   //
89   /// CHECK-START: float Main.doitDownFloat(int) loop_optimization (after)
90   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
91   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
doitDownFloat(int n)92   static float doitDownFloat(int n) {
93     // FP arithmetic is not sufficiently precise.
94     // The loop remains.
95     float lF = 1.0f;
96     for (int i1 = n - 1; i1 >= 0; i1--) {
97       lF = (1486662021.0f - lF);
98     }
99     return lF;
100   }
101 
102   /// CHECK-START: float Main.doitUpFloatAlt(int) loop_optimization (before)
103   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
104   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
105   //
106   /// CHECK-START: float Main.doitUpFloatAlt(int) loop_optimization (after)
107   /// CHECK-NOT: Phi
doitUpFloatAlt(int n)108   static float doitUpFloatAlt(int n) {
109     // Complete loop is replaced by last-value
110     // since the values are now precise.
111     float lF = 1.0f;
112     float l2 = 1486662020.0f;
113     for (int i1 = 0; i1  < n; i1++) {
114       float old = lF;
115       lF = l2;
116       l2 = old;
117     }
118     return lF;
119   }
120 
121   /// CHECK-START: float Main.doitDownFloatAlt(int) loop_optimization (before)
122   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
123   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
124   //
125   /// CHECK-START: float Main.doitDownFloatAlt(int) loop_optimization (after)
126   /// CHECK-NOT: Phi
doitDownFloatAlt(int n)127   static float doitDownFloatAlt(int n) {
128     // Complete loop is replaced by last-value
129     // since the values are now precise.
130     float lF = 1.0f;
131     float l2 = 1486662020.0f;
132     for (int i1 = n - 1; i1 >= 0; i1--) {
133       float old = lF;
134       lF = l2;
135       l2 = old;
136     }
137     return lF;
138   }
139 
140   /// CHECK-START: float Main.doitDownFloatAlt2(int) loop_optimization (before)
141   /// CHECK-DAG: <<Phi:i\d+>> Phi  loop:<<Loop:B\d+>> outer_loop:none
142   /// CHECK-DAG:              Phi  loop:<<Loop>>      outer_loop:none
143   //
144   /// CHECK-START: float Main.doitDownFloatAlt2(int) loop_optimization (after)
145   /// CHECK-NOT: Phi
doitDownFloatAlt2(int n)146   static float doitDownFloatAlt2(int n) {
147     // Complete loop is replaced by last-value
148     // since the values are now precise.
149     float lF = 1.0f;
150     float l2 = 1486662020.0f;
151     for (int i1 = n; i1 > 0; i1--) {
152       float old = lF;
153       lF = l2;
154       l2 = old;
155     }
156     return lF;
157   }
158 
159   // Main driver.
main(String[] args)160   public static void main(String[] args) {
161     for (int i = 0; i < 10; i++) {
162       int ei = (i & 1) == 0 ? 1 : 1486662020;
163       int ci = doitUpInt(i);
164       expectEquals(ei, ci);
165     }
166     for (int i = 0; i < 10; i++) {
167       int ei = (i & 1) == 0 ? 1 : 1486662020;
168       int ci = doitDownInt(i);
169       expectEquals(ei, ci);
170     }
171     for (int i = 0; i < 10; i++) {
172       int ei = (i & 1) == 0 ? 1 : 1486662020;
173       int ci = doitDownInt2(i);
174       expectEquals(ei, ci);
175     }
176     for (int i = 0; i < 10; i++) {
177       float ef = i == 0 ? 1.0f : ((i & 1) == 0 ? 0.0f : 1486662021.0f);
178       float cf = doitUpFloat(i);
179       expectEquals(ef, cf);
180     }
181     for (int i = 0; i < 10; i++) {
182       float ef = i == 0 ? 1.0f : ((i & 1) == 0 ? 0.0f : 1486662021.0f);
183       float cf = doitDownFloat(i);
184       expectEquals(ef, cf);
185     }
186     for (int i = 0; i < 10; i++) {
187       float ef = (i & 1) == 0 ? 1.0f : 1486662020.0f;
188       float cf = doitUpFloatAlt(i);
189       expectEquals(ef, cf);
190     }
191     for (int i = 0; i < 10; i++) {
192       float ef = (i & 1) == 0 ? 1.0f : 1486662020.0f;
193       float cf = doitDownFloatAlt(i);
194       expectEquals(ef, cf);
195     }
196     for (int i = 0; i < 10; i++) {
197       float ef = (i & 1) == 0 ? 1.0f : 1486662020.0f;
198       float cf = doitDownFloatAlt2(i);
199       expectEquals(ef, cf);
200     }
201     System.out.println("passed");
202   }
203 
expectEquals(int expected, int result)204   private static void expectEquals(int expected, int result) {
205     if (expected != result) {
206       throw new Error("Expected: " + expected + ", found: " + result);
207     }
208   }
209 
expectEquals(float expected, float result)210   private static void expectEquals(float expected, float result) {
211     if (expected != result) {
212       throw new Error("Expected: " + expected + ", found: " + result);
213     }
214   }
215 }
216 
217 
218