xref: /aosp_15_r20/art/test/480-checker-dead-blocks/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2015 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 public class Main {
18*795d594fSAndroid Build Coastguard Worker 
assertIntEquals(int expected, int result)19*795d594fSAndroid Build Coastguard Worker   public static void assertIntEquals(int expected, int result) {
20*795d594fSAndroid Build Coastguard Worker     if (expected != result) {
21*795d594fSAndroid Build Coastguard Worker       throw new Error("Expected: " + expected + ", found: " + result);
22*795d594fSAndroid Build Coastguard Worker     }
23*795d594fSAndroid Build Coastguard Worker   }
24*795d594fSAndroid Build Coastguard Worker 
$inline$constantTrue()25*795d594fSAndroid Build Coastguard Worker   public static boolean $inline$constantTrue() {
26*795d594fSAndroid Build Coastguard Worker     return true;
27*795d594fSAndroid Build Coastguard Worker   }
28*795d594fSAndroid Build Coastguard Worker 
$inline$constantFalse()29*795d594fSAndroid Build Coastguard Worker   public static boolean $inline$constantFalse() {
30*795d594fSAndroid Build Coastguard Worker     return false;
31*795d594fSAndroid Build Coastguard Worker   }
32*795d594fSAndroid Build Coastguard Worker 
33*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testTrueBranch(int, int) dead_code_elimination$after_inlining (before)
34*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<ArgX:i\d+>>    ParameterValue
35*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<ArgY:i\d+>>    ParameterValue
36*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      If
37*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Add:i\d+>>     Add [<<ArgX>>,<<ArgY>>]
38*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Sub:i\d+>>     Sub [<<ArgX>>,<<ArgY>>]
39*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Phi:i\d+>>     Phi [<<Add>>,<<Sub>>]
40*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Phi>>]
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testTrueBranch(int, int) dead_code_elimination$after_inlining (after)
43*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<ArgX:i\d+>>    ParameterValue
44*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<ArgY:i\d+>>    ParameterValue
45*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Add:i\d+>>     Add [<<ArgX>>,<<ArgY>>]
46*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Add>>]
47*795d594fSAndroid Build Coastguard Worker 
48*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testTrueBranch(int, int) dead_code_elimination$after_inlining (after)
49*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      If
50*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Sub
51*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Phi
52*795d594fSAndroid Build Coastguard Worker 
testTrueBranch(int x, int y)53*795d594fSAndroid Build Coastguard Worker   public static int testTrueBranch(int x, int y) {
54*795d594fSAndroid Build Coastguard Worker     int z;
55*795d594fSAndroid Build Coastguard Worker     if ($inline$constantTrue()) {
56*795d594fSAndroid Build Coastguard Worker       z = x + y;
57*795d594fSAndroid Build Coastguard Worker     } else {
58*795d594fSAndroid Build Coastguard Worker       z = x - y;
59*795d594fSAndroid Build Coastguard Worker       // Prevent HSelect simplification by having a branch with multiple instructions.
60*795d594fSAndroid Build Coastguard Worker       System.nanoTime();
61*795d594fSAndroid Build Coastguard Worker     }
62*795d594fSAndroid Build Coastguard Worker     return z;
63*795d594fSAndroid Build Coastguard Worker   }
64*795d594fSAndroid Build Coastguard Worker 
65*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testFalseBranch(int, int) dead_code_elimination$after_inlining (before)
66*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<ArgX:i\d+>>    ParameterValue
67*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<ArgY:i\d+>>    ParameterValue
68*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      If
69*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Add:i\d+>>     Add [<<ArgX>>,<<ArgY>>]
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Sub:i\d+>>     Sub [<<ArgX>>,<<ArgY>>]
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Phi:i\d+>>     Phi [<<Add>>,<<Sub>>]
72*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Phi>>]
73*795d594fSAndroid Build Coastguard Worker 
74*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testFalseBranch(int, int) dead_code_elimination$after_inlining (after)
75*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<ArgX:i\d+>>    ParameterValue
76*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<ArgY:i\d+>>    ParameterValue
77*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Sub:i\d+>>     Sub [<<ArgX>>,<<ArgY>>]
78*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Sub>>]
79*795d594fSAndroid Build Coastguard Worker 
80*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testFalseBranch(int, int) dead_code_elimination$after_inlining (after)
81*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      If
82*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Add
83*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Phi
84*795d594fSAndroid Build Coastguard Worker 
testFalseBranch(int x, int y)85*795d594fSAndroid Build Coastguard Worker   public static int testFalseBranch(int x, int y) {
86*795d594fSAndroid Build Coastguard Worker     int z;
87*795d594fSAndroid Build Coastguard Worker     if ($inline$constantFalse()) {
88*795d594fSAndroid Build Coastguard Worker       z = x + y;
89*795d594fSAndroid Build Coastguard Worker     } else {
90*795d594fSAndroid Build Coastguard Worker       z = x - y;
91*795d594fSAndroid Build Coastguard Worker       // Prevent HSelect simplification by having a branch with multiple instructions.
92*795d594fSAndroid Build Coastguard Worker       System.nanoTime();
93*795d594fSAndroid Build Coastguard Worker     }
94*795d594fSAndroid Build Coastguard Worker     return z;
95*795d594fSAndroid Build Coastguard Worker   }
96*795d594fSAndroid Build Coastguard Worker 
97*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testRemoveLoop(int) dead_code_elimination$after_inlining (before)
98*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          Mul
99*795d594fSAndroid Build Coastguard Worker 
100*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testRemoveLoop(int) dead_code_elimination$after_inlining (after)
101*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Mul
102*795d594fSAndroid Build Coastguard Worker 
testRemoveLoop(int x)103*795d594fSAndroid Build Coastguard Worker   public static int testRemoveLoop(int x) {
104*795d594fSAndroid Build Coastguard Worker     if ($inline$constantFalse()) {
105*795d594fSAndroid Build Coastguard Worker       for (int i = 0; i < x; ++i) {
106*795d594fSAndroid Build Coastguard Worker         x *= x;
107*795d594fSAndroid Build Coastguard Worker       }
108*795d594fSAndroid Build Coastguard Worker     }
109*795d594fSAndroid Build Coastguard Worker     return x;
110*795d594fSAndroid Build Coastguard Worker   }
111*795d594fSAndroid Build Coastguard Worker 
112*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testInfiniteLoop(int) dead_code_elimination$after_inlining (before)
113*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return
114*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Exit
115*795d594fSAndroid Build Coastguard Worker 
116*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testInfiniteLoop(int) dead_code_elimination$after_inlining (after)
117*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Return
118*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Exit
119*795d594fSAndroid Build Coastguard Worker 
testInfiniteLoop(int x)120*795d594fSAndroid Build Coastguard Worker   public static int testInfiniteLoop(int x) {
121*795d594fSAndroid Build Coastguard Worker     while ($inline$constantTrue()) {
122*795d594fSAndroid Build Coastguard Worker       x++;
123*795d594fSAndroid Build Coastguard Worker     }
124*795d594fSAndroid Build Coastguard Worker     return x;
125*795d594fSAndroid Build Coastguard Worker   }
126*795d594fSAndroid Build Coastguard Worker 
127*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testDeadLoop(int) dead_code_elimination$after_inlining (before)
128*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      If
129*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Add
130*795d594fSAndroid Build Coastguard Worker 
131*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testDeadLoop(int) dead_code_elimination$after_inlining (after)
132*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Arg:i\d+>>     ParameterValue
133*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Arg>>]
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testDeadLoop(int) dead_code_elimination$after_inlining (after)
136*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      If
137*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Add
138*795d594fSAndroid Build Coastguard Worker 
testDeadLoop(int x)139*795d594fSAndroid Build Coastguard Worker   public static int testDeadLoop(int x) {
140*795d594fSAndroid Build Coastguard Worker     while ($inline$constantFalse()) {
141*795d594fSAndroid Build Coastguard Worker       x++;
142*795d594fSAndroid Build Coastguard Worker     }
143*795d594fSAndroid Build Coastguard Worker     return x;
144*795d594fSAndroid Build Coastguard Worker   }
145*795d594fSAndroid Build Coastguard Worker 
146*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testUpdateLoopInformation(int) dead_code_elimination$after_inlining (before)
147*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      If
148*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      If
149*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Add
150*795d594fSAndroid Build Coastguard Worker 
151*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testUpdateLoopInformation(int) dead_code_elimination$after_inlining (after)
152*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:     <<Arg:i\d+>>     ParameterValue
153*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                      Return [<<Arg>>]
154*795d594fSAndroid Build Coastguard Worker 
155*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testUpdateLoopInformation(int) dead_code_elimination$after_inlining (after)
156*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      If
157*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      Add
158*795d594fSAndroid Build Coastguard Worker 
testUpdateLoopInformation(int x)159*795d594fSAndroid Build Coastguard Worker   public static int testUpdateLoopInformation(int x) {
160*795d594fSAndroid Build Coastguard Worker     // Use of Or in the condition generates a dead loop where not all of its
161*795d594fSAndroid Build Coastguard Worker     // blocks are removed. This forces DCE to update their loop information.
162*795d594fSAndroid Build Coastguard Worker     while ($inline$constantFalse() || !$inline$constantTrue()) {
163*795d594fSAndroid Build Coastguard Worker       x++;
164*795d594fSAndroid Build Coastguard Worker     }
165*795d594fSAndroid Build Coastguard Worker     return x;
166*795d594fSAndroid Build Coastguard Worker   }
167*795d594fSAndroid Build Coastguard Worker 
168*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testRemoveSuspendCheck(int, int) dead_code_elimination$after_inlining (before)
169*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          SuspendCheck
170*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          SuspendCheck
171*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          SuspendCheck
172*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      SuspendCheck
173*795d594fSAndroid Build Coastguard Worker 
174*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.testRemoveSuspendCheck(int, int) dead_code_elimination$after_inlining (after)
175*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          SuspendCheck
176*795d594fSAndroid Build Coastguard Worker   /// CHECK:                          SuspendCheck
177*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:                      SuspendCheck
178*795d594fSAndroid Build Coastguard Worker 
testRemoveSuspendCheck(int x, int y)179*795d594fSAndroid Build Coastguard Worker   public static int testRemoveSuspendCheck(int x, int y) {
180*795d594fSAndroid Build Coastguard Worker     // Inner loop will leave behind the header with its SuspendCheck. DCE must
181*795d594fSAndroid Build Coastguard Worker     // remove it, otherwise the outer loop would end up with two.
182*795d594fSAndroid Build Coastguard Worker     while (y > 0) {
183*795d594fSAndroid Build Coastguard Worker       while ($inline$constantFalse() || !$inline$constantTrue()) {
184*795d594fSAndroid Build Coastguard Worker         x++;
185*795d594fSAndroid Build Coastguard Worker       }
186*795d594fSAndroid Build Coastguard Worker       y--;
187*795d594fSAndroid Build Coastguard Worker     }
188*795d594fSAndroid Build Coastguard Worker     return x;
189*795d594fSAndroid Build Coastguard Worker   }
190*795d594fSAndroid Build Coastguard Worker 
main(String[] args)191*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) {
192*795d594fSAndroid Build Coastguard Worker     assertIntEquals(7, testTrueBranch(4, 3));
193*795d594fSAndroid Build Coastguard Worker     assertIntEquals(1, testFalseBranch(4, 3));
194*795d594fSAndroid Build Coastguard Worker     assertIntEquals(42, testRemoveLoop(42));
195*795d594fSAndroid Build Coastguard Worker     assertIntEquals(23, testUpdateLoopInformation(23));
196*795d594fSAndroid Build Coastguard Worker     assertIntEquals(12, testRemoveSuspendCheck(12, 5));
197*795d594fSAndroid Build Coastguard Worker   }
198*795d594fSAndroid Build Coastguard Worker }
199