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