xref: /aosp_15_r20/art/test/663-checker-select-generator/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 public class Main {
18*795d594fSAndroid Build Coastguard Worker   // Check that we don't generate a select since we don't have a Phi (not even at
19*795d594fSAndroid Build Coastguard Worker   // the builder stage) since both values are the same.
20*795d594fSAndroid Build Coastguard Worker 
21*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondSameValue(boolean) builder (after)
22*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
23*795d594fSAndroid Build Coastguard Worker 
24*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondSameValue(boolean) select_generator (before)
25*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
26*795d594fSAndroid Build Coastguard Worker 
27*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondSameValue(boolean) select_generator (after)
28*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
29*795d594fSAndroid Build Coastguard Worker 
30*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondSameValue(boolean) select_generator (after)
31*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Select
$noinline$testSimpleDiamondSameValue(boolean bool_param)32*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testSimpleDiamondSameValue(boolean bool_param) {
33*795d594fSAndroid Build Coastguard Worker     int return_value;
34*795d594fSAndroid Build Coastguard Worker     if (bool_param) {
35*795d594fSAndroid Build Coastguard Worker       return_value = 10;
36*795d594fSAndroid Build Coastguard Worker     } else {
37*795d594fSAndroid Build Coastguard Worker       return_value = 10;
38*795d594fSAndroid Build Coastguard Worker     }
39*795d594fSAndroid Build Coastguard Worker     return return_value;
40*795d594fSAndroid Build Coastguard Worker   }
41*795d594fSAndroid Build Coastguard Worker 
42*795d594fSAndroid Build Coastguard Worker   // Check that we generate a select for a simple diamond pattern, with different values.
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondDifferentValue(boolean) select_generator (before)
45*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
46*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
47*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Phi:i\d+>>     Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>]
48*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Phi>>]
49*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL:  set(["<<Arg1>>","<<Arg2>>"]) == set(["<<Const10>>","<<Const20>>"])
50*795d594fSAndroid Build Coastguard Worker 
51*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondDifferentValue(boolean) select_generator (after)
52*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool:z\d+>>    ParameterValue
53*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
54*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
55*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select:i\d+>>  Select [<<Const20>>,<<Const10>>,<<Bool>>]
56*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Select>>]
$noinline$testSimpleDiamondDifferentValue(boolean bool_param)57*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testSimpleDiamondDifferentValue(boolean bool_param) {
58*795d594fSAndroid Build Coastguard Worker     int return_value;
59*795d594fSAndroid Build Coastguard Worker     if (bool_param) {
60*795d594fSAndroid Build Coastguard Worker       return_value = 10;
61*795d594fSAndroid Build Coastguard Worker     } else {
62*795d594fSAndroid Build Coastguard Worker       return_value = 20;
63*795d594fSAndroid Build Coastguard Worker     }
64*795d594fSAndroid Build Coastguard Worker     return return_value;
65*795d594fSAndroid Build Coastguard Worker   }
66*795d594fSAndroid Build Coastguard Worker 
67*795d594fSAndroid Build Coastguard Worker   // Check that we don't generate a select since we don't have no Phi (not even at the builder
68*795d594fSAndroid Build Coastguard Worker   // stage) since all values are the same.
69*795d594fSAndroid Build Coastguard Worker 
70*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValue(boolean, boolean) builder (after)
71*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
72*795d594fSAndroid Build Coastguard Worker 
73*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValue(boolean, boolean) select_generator (before)
74*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValue(boolean, boolean) select_generator (after)
77*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Phi
78*795d594fSAndroid Build Coastguard Worker 
79*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValue(boolean, boolean) select_generator (after)
80*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT: Select
$noinline$testDoubleDiamondSameValue(boolean bool_param_1, boolean bool_param_2)81*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testDoubleDiamondSameValue(boolean bool_param_1, boolean bool_param_2) {
82*795d594fSAndroid Build Coastguard Worker       int return_value;
83*795d594fSAndroid Build Coastguard Worker     if (bool_param_1) {
84*795d594fSAndroid Build Coastguard Worker       return_value = 10;
85*795d594fSAndroid Build Coastguard Worker     } else {
86*795d594fSAndroid Build Coastguard Worker       if (bool_param_2) {
87*795d594fSAndroid Build Coastguard Worker         return_value = 10;
88*795d594fSAndroid Build Coastguard Worker       } else {
89*795d594fSAndroid Build Coastguard Worker         return_value = 10;
90*795d594fSAndroid Build Coastguard Worker       }
91*795d594fSAndroid Build Coastguard Worker     }
92*795d594fSAndroid Build Coastguard Worker     return return_value;
93*795d594fSAndroid Build Coastguard Worker   }
94*795d594fSAndroid Build Coastguard Worker 
95*795d594fSAndroid Build Coastguard Worker   // Check that we generate a select for a double diamond pattern, with a different value in the outer branch.
96*795d594fSAndroid Build Coastguard Worker 
97*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueButNotAllOuter(boolean, boolean) select_generator (before)
98*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
99*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
100*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Phi:i\d+>>     Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>,<<Arg3:i\d+>>]
101*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Phi>>]
102*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL:  set(["<<Arg1>>","<<Arg2>>","<<Arg3>>"]) == set(["<<Const10>>","<<Const20>>","<<Const20>>"])
103*795d594fSAndroid Build Coastguard Worker 
104*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueButNotAllOuter(boolean, boolean) select_generator (after)
105*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool1:z\d+>>   ParameterValue
106*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool2:z\d+>>   ParameterValue
107*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
108*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
109*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select:i\d+>>  Select [<<Const20>>,<<Const20>>,<<Bool2>>]
110*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select2:i\d+>> Select [<<Select>>,<<Const10>>,<<Bool1>>]
111*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Select2>>]
$noinline$testDoubleDiamondSameValueButNotAllOuter(boolean bool_param_1, boolean bool_param_2)112*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testDoubleDiamondSameValueButNotAllOuter(boolean bool_param_1, boolean bool_param_2) {
113*795d594fSAndroid Build Coastguard Worker       int return_value;
114*795d594fSAndroid Build Coastguard Worker     if (bool_param_1) {
115*795d594fSAndroid Build Coastguard Worker       return_value = 10;
116*795d594fSAndroid Build Coastguard Worker     } else {
117*795d594fSAndroid Build Coastguard Worker       if (bool_param_2) {
118*795d594fSAndroid Build Coastguard Worker         return_value = 20;
119*795d594fSAndroid Build Coastguard Worker       } else {
120*795d594fSAndroid Build Coastguard Worker         return_value = 20;
121*795d594fSAndroid Build Coastguard Worker       }
122*795d594fSAndroid Build Coastguard Worker     }
123*795d594fSAndroid Build Coastguard Worker     return return_value;
124*795d594fSAndroid Build Coastguard Worker   }
125*795d594fSAndroid Build Coastguard Worker 
126*795d594fSAndroid Build Coastguard Worker   // Check that we generate a select for a double diamond pattern, with a different value in the inner branch.
127*795d594fSAndroid Build Coastguard Worker 
128*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueButNotAllInner(boolean, boolean) select_generator (before)
129*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
130*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
131*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Phi:i\d+>>     Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>,<<Arg3:i\d+>>]
132*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Phi>>]
133*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL:  set(["<<Arg1>>","<<Arg2>>","<<Arg3>>"]) == set(["<<Const10>>","<<Const20>>","<<Const20>>"])
134*795d594fSAndroid Build Coastguard Worker 
135*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueButNotAllInner(boolean, boolean) select_generator (after)
136*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool1:z\d+>>   ParameterValue
137*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool2:z\d+>>   ParameterValue
138*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
139*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
140*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select:i\d+>>  Select [<<Const20>>,<<Const10>>,<<Bool2>>]
141*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select2:i\d+>> Select [<<Select>>,<<Const20>>,<<Bool1>>]
142*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Select2>>]
$noinline$testDoubleDiamondSameValueButNotAllInner(boolean bool_param_1, boolean bool_param_2)143*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testDoubleDiamondSameValueButNotAllInner(boolean bool_param_1, boolean bool_param_2) {
144*795d594fSAndroid Build Coastguard Worker       int return_value;
145*795d594fSAndroid Build Coastguard Worker     if (bool_param_1) {
146*795d594fSAndroid Build Coastguard Worker       return_value = 20;
147*795d594fSAndroid Build Coastguard Worker     } else {
148*795d594fSAndroid Build Coastguard Worker       if (bool_param_2) {
149*795d594fSAndroid Build Coastguard Worker         return_value = 10;
150*795d594fSAndroid Build Coastguard Worker       } else {
151*795d594fSAndroid Build Coastguard Worker         return_value = 20;
152*795d594fSAndroid Build Coastguard Worker       }
153*795d594fSAndroid Build Coastguard Worker     }
154*795d594fSAndroid Build Coastguard Worker     return return_value;
155*795d594fSAndroid Build Coastguard Worker   }
156*795d594fSAndroid Build Coastguard Worker 
157*795d594fSAndroid Build Coastguard Worker   // Check that we generate a select for a double diamond pattern, with a all different values.
158*795d594fSAndroid Build Coastguard Worker 
159*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondDifferentValue(boolean, boolean) select_generator (before)
160*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
161*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
162*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const30:i\d+>> IntConstant 30
163*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Phi:i\d+>>     Phi [<<Arg1:i\d+>>,<<Arg2:i\d+>>,<<Arg3:i\d+>>]
164*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Phi>>]
165*795d594fSAndroid Build Coastguard Worker   /// CHECK-EVAL:  set(["<<Arg1>>","<<Arg2>>","<<Arg3>>"]) == set(["<<Const10>>","<<Const20>>","<<Const30>>"])
166*795d594fSAndroid Build Coastguard Worker 
167*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondDifferentValue(boolean, boolean) select_generator (after)
168*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool1:z\d+>>   ParameterValue
169*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool2:z\d+>>   ParameterValue
170*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
171*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
172*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const30:i\d+>> IntConstant 30
173*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select:i\d+>>  Select [<<Const30>>,<<Const20>>,<<Bool2>>]
174*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select2:i\d+>> Select [<<Select>>,<<Const10>>,<<Bool1>>]
175*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Select2>>]
$noinline$testDoubleDiamondDifferentValue(boolean bool_param_1, boolean bool_param_2)176*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testDoubleDiamondDifferentValue(boolean bool_param_1, boolean bool_param_2) {
177*795d594fSAndroid Build Coastguard Worker       int return_value;
178*795d594fSAndroid Build Coastguard Worker     if (bool_param_1) {
179*795d594fSAndroid Build Coastguard Worker       return_value = 10;
180*795d594fSAndroid Build Coastguard Worker     } else {
181*795d594fSAndroid Build Coastguard Worker       if (bool_param_2) {
182*795d594fSAndroid Build Coastguard Worker         return_value = 20;
183*795d594fSAndroid Build Coastguard Worker       } else {
184*795d594fSAndroid Build Coastguard Worker         return_value = 30;
185*795d594fSAndroid Build Coastguard Worker       }
186*795d594fSAndroid Build Coastguard Worker     }
187*795d594fSAndroid Build Coastguard Worker     return return_value;
188*795d594fSAndroid Build Coastguard Worker   }
189*795d594fSAndroid Build Coastguard Worker 
assertEquals(int expected, int actual)190*795d594fSAndroid Build Coastguard Worker   private static void assertEquals(int expected, int actual) {
191*795d594fSAndroid Build Coastguard Worker     if (expected != actual) {
192*795d594fSAndroid Build Coastguard Worker       throw new AssertionError("Expected " + expected + " got " + actual);
193*795d594fSAndroid Build Coastguard Worker     }
194*795d594fSAndroid Build Coastguard Worker   }
195*795d594fSAndroid Build Coastguard Worker 
196*795d594fSAndroid Build Coastguard Worker   // Check that we generate a select, which we collapse into a single return.
197*795d594fSAndroid Build Coastguard Worker 
198*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondSameValueWithReturn(boolean) builder (after)
199*795d594fSAndroid Build Coastguard Worker   /// CHECK:       <<Const10:i\d+>> IntConstant 10
200*795d594fSAndroid Build Coastguard Worker   /// CHECK:       Return [<<Const10>>]
201*795d594fSAndroid Build Coastguard Worker   /// CHECK:       Return [<<Const10>>]
202*795d594fSAndroid Build Coastguard Worker 
203*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondSameValueWithReturn(boolean) select_generator (after)
204*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool:z\d+>>   ParameterValue
205*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
206*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select:i\d+>>  Select [<<Const10>>,<<Const10>>,<<Bool>>]
207*795d594fSAndroid Build Coastguard Worker 
208*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondSameValueWithReturn(boolean) instruction_simplifier$after_gvn (after)
209*795d594fSAndroid Build Coastguard Worker   /// CHECK:       <<Const10:i\d+>> IntConstant 10
210*795d594fSAndroid Build Coastguard Worker   /// CHECK:       Return [<<Const10>>]
211*795d594fSAndroid Build Coastguard Worker 
212*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondSameValueWithReturn(boolean) instruction_simplifier$after_gvn (after)
213*795d594fSAndroid Build Coastguard Worker   /// CHECK:       Return
214*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:   Return
$noinline$testSimpleDiamondSameValueWithReturn(boolean bool_param)215*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testSimpleDiamondSameValueWithReturn(boolean bool_param) {
216*795d594fSAndroid Build Coastguard Worker     if (bool_param) {
217*795d594fSAndroid Build Coastguard Worker       return 10;
218*795d594fSAndroid Build Coastguard Worker     } else {
219*795d594fSAndroid Build Coastguard Worker       return 10;
220*795d594fSAndroid Build Coastguard Worker     }
221*795d594fSAndroid Build Coastguard Worker   }
222*795d594fSAndroid Build Coastguard Worker 
223*795d594fSAndroid Build Coastguard Worker   // Same as testSimpleDiamondDifferentValue, but branches return.
224*795d594fSAndroid Build Coastguard Worker 
225*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondDifferentValueWithReturn(boolean) select_generator (before)
226*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
227*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
228*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const10>>]
229*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const20>>]
230*795d594fSAndroid Build Coastguard Worker 
231*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testSimpleDiamondDifferentValueWithReturn(boolean) select_generator (after)
232*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool:z\d+>>    ParameterValue
233*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
234*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
235*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select:i\d+>>  Select [<<Const20>>,<<Const10>>,<<Bool>>]
236*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Select>>]
$noinline$testSimpleDiamondDifferentValueWithReturn(boolean bool_param)237*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testSimpleDiamondDifferentValueWithReturn(boolean bool_param) {
238*795d594fSAndroid Build Coastguard Worker     if (bool_param) {
239*795d594fSAndroid Build Coastguard Worker       return 10;
240*795d594fSAndroid Build Coastguard Worker     } else {
241*795d594fSAndroid Build Coastguard Worker       return 20;
242*795d594fSAndroid Build Coastguard Worker     }
243*795d594fSAndroid Build Coastguard Worker   }
244*795d594fSAndroid Build Coastguard Worker 
245*795d594fSAndroid Build Coastguard Worker   // Check that we generate a select, which we collapse into a single return.
246*795d594fSAndroid Build Coastguard Worker 
247*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueWithReturn(boolean, boolean) builder (after)
248*795d594fSAndroid Build Coastguard Worker   /// CHECK:       <<Const10:i\d+>> IntConstant 10
249*795d594fSAndroid Build Coastguard Worker   /// CHECK:       Return [<<Const10>>]
250*795d594fSAndroid Build Coastguard Worker   /// CHECK:       Return [<<Const10>>]
251*795d594fSAndroid Build Coastguard Worker 
252*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueWithReturn(boolean, boolean) select_generator (after)
253*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool1:z\d+>>   ParameterValue
254*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool2:z\d+>>   ParameterValue
255*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
256*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select:i\d+>>  Select [<<Const10>>,<<Const10>>,<<Bool2>>]
257*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select2:i\d+>> Select [<<Select>>,<<Const10>>,<<Bool1>>]
258*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Select2>>]
259*795d594fSAndroid Build Coastguard Worker 
260*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueWithReturn(boolean, boolean) instruction_simplifier$after_gvn (after)
261*795d594fSAndroid Build Coastguard Worker   /// CHECK:       <<Const10:i\d+>> IntConstant 10
262*795d594fSAndroid Build Coastguard Worker   /// CHECK:       Return [<<Const10>>]
263*795d594fSAndroid Build Coastguard Worker 
264*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueWithReturn(boolean, boolean) instruction_simplifier$after_gvn (after)
265*795d594fSAndroid Build Coastguard Worker   /// CHECK:       Return
266*795d594fSAndroid Build Coastguard Worker   /// CHECK-NOT:   Return
$noinline$testDoubleDiamondSameValueWithReturn(boolean bool_param_1, boolean bool_param_2)267*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testDoubleDiamondSameValueWithReturn(boolean bool_param_1, boolean bool_param_2) {
268*795d594fSAndroid Build Coastguard Worker     if (bool_param_1) {
269*795d594fSAndroid Build Coastguard Worker       return 10;
270*795d594fSAndroid Build Coastguard Worker     } else {
271*795d594fSAndroid Build Coastguard Worker       if (bool_param_2) {
272*795d594fSAndroid Build Coastguard Worker         return 10;
273*795d594fSAndroid Build Coastguard Worker       } else {
274*795d594fSAndroid Build Coastguard Worker         return 10;
275*795d594fSAndroid Build Coastguard Worker       }
276*795d594fSAndroid Build Coastguard Worker     }
277*795d594fSAndroid Build Coastguard Worker   }
278*795d594fSAndroid Build Coastguard Worker 
279*795d594fSAndroid Build Coastguard Worker   // Same as testDoubleDiamondSameValueButNotAllOuter, but branches return.
280*795d594fSAndroid Build Coastguard Worker 
281*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueButNotAllOuterWithReturn(boolean, boolean) select_generator (before)
282*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
283*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
284*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const10>>]
285*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const20>>]
286*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const20>>]
287*795d594fSAndroid Build Coastguard Worker 
288*795d594fSAndroid Build Coastguard Worker   // Note that we have 3 returns as D8 only merges when the line positions are equal.
289*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueButNotAllOuterWithReturn(boolean, boolean) select_generator (before)
290*795d594fSAndroid Build Coastguard Worker   /// CHECK:                    Return
291*795d594fSAndroid Build Coastguard Worker   /// CHECK:                    Return
292*795d594fSAndroid Build Coastguard Worker   /// CHECK:                    Return
293*795d594fSAndroid Build Coastguard Worker 
294*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueButNotAllOuterWithReturn(boolean, boolean) select_generator (after)
295*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool1:z\d+>>   ParameterValue
296*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool2:z\d+>>   ParameterValue
297*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
298*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
299*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select:i\d+>>  Select [<<Const20>>,<<Const20>>,<<Bool2>>]
300*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select2:i\d+>> Select [<<Select>>,<<Const10>>,<<Bool1>>]
301*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Select2>>]
$noinline$testDoubleDiamondSameValueButNotAllOuterWithReturn(boolean bool_param_1, boolean bool_param_2)302*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testDoubleDiamondSameValueButNotAllOuterWithReturn(boolean bool_param_1, boolean bool_param_2) {
303*795d594fSAndroid Build Coastguard Worker     if (bool_param_1) {
304*795d594fSAndroid Build Coastguard Worker       return 10;
305*795d594fSAndroid Build Coastguard Worker     } else {
306*795d594fSAndroid Build Coastguard Worker       if (bool_param_2) {
307*795d594fSAndroid Build Coastguard Worker         return 20;
308*795d594fSAndroid Build Coastguard Worker       } else {
309*795d594fSAndroid Build Coastguard Worker         return 20;
310*795d594fSAndroid Build Coastguard Worker       }
311*795d594fSAndroid Build Coastguard Worker     }
312*795d594fSAndroid Build Coastguard Worker   }
313*795d594fSAndroid Build Coastguard Worker 
314*795d594fSAndroid Build Coastguard Worker   // Same as testDoubleDiamondSameValueButNotAllInner, but branches return.
315*795d594fSAndroid Build Coastguard Worker 
316*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueButNotAllInnerWithReturn(boolean, boolean) select_generator (before)
317*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
318*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
319*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const10>>]
320*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const20>>]
321*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const20>>]
322*795d594fSAndroid Build Coastguard Worker 
323*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondSameValueButNotAllInnerWithReturn(boolean, boolean) select_generator (after)
324*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool1:z\d+>>   ParameterValue
325*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool2:z\d+>>   ParameterValue
326*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
327*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
328*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select:i\d+>>  Select [<<Const20>>,<<Const10>>,<<Bool2>>]
329*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select2:i\d+>> Select [<<Select>>,<<Const20>>,<<Bool1>>]
330*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Select2>>]
$noinline$testDoubleDiamondSameValueButNotAllInnerWithReturn(boolean bool_param_1, boolean bool_param_2)331*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testDoubleDiamondSameValueButNotAllInnerWithReturn(boolean bool_param_1, boolean bool_param_2) {
332*795d594fSAndroid Build Coastguard Worker     if (bool_param_1) {
333*795d594fSAndroid Build Coastguard Worker       return 20;
334*795d594fSAndroid Build Coastguard Worker     } else {
335*795d594fSAndroid Build Coastguard Worker       if (bool_param_2) {
336*795d594fSAndroid Build Coastguard Worker         return 10;
337*795d594fSAndroid Build Coastguard Worker       } else {
338*795d594fSAndroid Build Coastguard Worker         return 20;
339*795d594fSAndroid Build Coastguard Worker       }
340*795d594fSAndroid Build Coastguard Worker     }
341*795d594fSAndroid Build Coastguard Worker   }
342*795d594fSAndroid Build Coastguard Worker 
343*795d594fSAndroid Build Coastguard Worker   // Same as testDoubleDiamondDifferentValue, but branches return.
344*795d594fSAndroid Build Coastguard Worker 
345*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondDifferentValueWithReturn(boolean, boolean) select_generator (before)
346*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
347*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
348*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const30:i\d+>> IntConstant 30
349*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const10>>]
350*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const20>>]
351*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Const30>>]
352*795d594fSAndroid Build Coastguard Worker 
353*795d594fSAndroid Build Coastguard Worker   /// CHECK-START: int Main.$noinline$testDoubleDiamondDifferentValueWithReturn(boolean, boolean) select_generator (after)
354*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool1:z\d+>>   ParameterValue
355*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Bool2:z\d+>>   ParameterValue
356*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const10:i\d+>> IntConstant 10
357*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const20:i\d+>> IntConstant 20
358*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Const30:i\d+>> IntConstant 30
359*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select:i\d+>>  Select [<<Const30>>,<<Const20>>,<<Bool2>>]
360*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:   <<Select2:i\d+>> Select [<<Select>>,<<Const10>>,<<Bool1>>]
361*795d594fSAndroid Build Coastguard Worker   /// CHECK-DAG:                    Return [<<Select2>>]
$noinline$testDoubleDiamondDifferentValueWithReturn(boolean bool_param_1, boolean bool_param_2)362*795d594fSAndroid Build Coastguard Worker   private static int $noinline$testDoubleDiamondDifferentValueWithReturn(boolean bool_param_1, boolean bool_param_2) {
363*795d594fSAndroid Build Coastguard Worker     if (bool_param_1) {
364*795d594fSAndroid Build Coastguard Worker       return 10;
365*795d594fSAndroid Build Coastguard Worker     } else {
366*795d594fSAndroid Build Coastguard Worker       if (bool_param_2) {
367*795d594fSAndroid Build Coastguard Worker         return 20;
368*795d594fSAndroid Build Coastguard Worker       } else {
369*795d594fSAndroid Build Coastguard Worker         return 30;
370*795d594fSAndroid Build Coastguard Worker       }
371*795d594fSAndroid Build Coastguard Worker     }
372*795d594fSAndroid Build Coastguard Worker   }
373*795d594fSAndroid Build Coastguard Worker 
main(String[] args)374*795d594fSAndroid Build Coastguard Worker   public static void main(String[] args) throws Throwable {
375*795d594fSAndroid Build Coastguard Worker     // With phi
376*795d594fSAndroid Build Coastguard Worker     assertEquals(10, $noinline$testSimpleDiamondSameValue(false));
377*795d594fSAndroid Build Coastguard Worker     assertEquals(20, $noinline$testSimpleDiamondDifferentValue(false));
378*795d594fSAndroid Build Coastguard Worker     assertEquals(10, $noinline$testDoubleDiamondSameValue(false, false));
379*795d594fSAndroid Build Coastguard Worker     assertEquals(20, $noinline$testDoubleDiamondSameValueButNotAllOuter(false, false));
380*795d594fSAndroid Build Coastguard Worker     assertEquals(20, $noinline$testDoubleDiamondSameValueButNotAllInner(false, false));
381*795d594fSAndroid Build Coastguard Worker     assertEquals(30, $noinline$testDoubleDiamondDifferentValue(false, false));
382*795d594fSAndroid Build Coastguard Worker 
383*795d594fSAndroid Build Coastguard Worker     // With return
384*795d594fSAndroid Build Coastguard Worker     assertEquals(10, $noinline$testSimpleDiamondSameValueWithReturn(false));
385*795d594fSAndroid Build Coastguard Worker     assertEquals(20, $noinline$testSimpleDiamondDifferentValueWithReturn(false));
386*795d594fSAndroid Build Coastguard Worker     assertEquals(10, $noinline$testDoubleDiamondSameValueWithReturn(false, false));
387*795d594fSAndroid Build Coastguard Worker     assertEquals(20, $noinline$testDoubleDiamondSameValueButNotAllOuterWithReturn(false, false));
388*795d594fSAndroid Build Coastguard Worker     assertEquals(20, $noinline$testDoubleDiamondSameValueButNotAllInnerWithReturn(false, false));
389*795d594fSAndroid Build Coastguard Worker     assertEquals(30, $noinline$testDoubleDiamondDifferentValueWithReturn(false, false));
390*795d594fSAndroid Build Coastguard Worker   }
391*795d594fSAndroid Build Coastguard Worker }
392