1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2018 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker /** 18*795d594fSAndroid Build Coastguard Worker * Functional tests for detecting min/max. 19*795d594fSAndroid Build Coastguard Worker */ 20*795d594fSAndroid Build Coastguard Worker public class TestMinMax { 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker // 23*795d594fSAndroid Build Coastguard Worker // Direct intrinsics. 24*795d594fSAndroid Build Coastguard Worker // 25*795d594fSAndroid Build Coastguard Worker 26*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minI(int) builder (after) 27*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 28*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Con:i\d+>> IntConstant 20 29*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min [<<Par>>,<<Con>>] 30*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 31*795d594fSAndroid Build Coastguard Worker // 32*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minI(int) builder (after) 33*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 34*795d594fSAndroid Build Coastguard Worker // 35*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int TestMinMax.minI(int) disassembly (after) 36*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{w\d+}}, #0x14 37*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{w\d+}}, #0x14 38*795d594fSAndroid Build Coastguard Worker // Check that the constant generation was handled by VIXL. 39*795d594fSAndroid Build Coastguard Worker /// CHECK: mov w16, #0x14 40*795d594fSAndroid Build Coastguard Worker /// CHECK: csel {{w\d+}}, {{w\d+}}, w16, lt minI(int a)41*795d594fSAndroid Build Coastguard Worker public static int minI(int a) { 42*795d594fSAndroid Build Coastguard Worker return Math.min(a, 20); 43*795d594fSAndroid Build Coastguard Worker } 44*795d594fSAndroid Build Coastguard Worker 45*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestMinMax.minL(long) builder (after) 46*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:j\d+>> ParameterValue 47*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Con:j\d+>> LongConstant 20 48*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:j\d+>> Min [<<Par>>,<<Con>>] 49*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 50*795d594fSAndroid Build Coastguard Worker // 51*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestMinMax.minL(long) builder (after) 52*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 53*795d594fSAndroid Build Coastguard Worker // 54*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long TestMinMax.minL(long) disassembly (after) 55*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{x\d+}}, #0x14 56*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{x\d+}}, #0x14 57*795d594fSAndroid Build Coastguard Worker // Check that the constant generation was handled by VIXL. 58*795d594fSAndroid Build Coastguard Worker /// CHECK: mov x16, #0x14 59*795d594fSAndroid Build Coastguard Worker /// CHECK: csel {{x\d+}}, {{x\d+}}, x16, lt minL(long a)60*795d594fSAndroid Build Coastguard Worker public static long minL(long a) { 61*795d594fSAndroid Build Coastguard Worker return Math.min(a, 20L); 62*795d594fSAndroid Build Coastguard Worker } 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.maxI(int) builder (after) 65*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 66*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Con:i\d+>> IntConstant 20 67*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max [<<Par>>,<<Con>>] 68*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 69*795d594fSAndroid Build Coastguard Worker // 70*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.maxI(int) builder (after) 71*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 72*795d594fSAndroid Build Coastguard Worker // 73*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int TestMinMax.maxI(int) disassembly (after) 74*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{w\d+}}, #0x14 75*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{w\d+}}, #0x14 76*795d594fSAndroid Build Coastguard Worker // Check that the constant generation was handled by VIXL. 77*795d594fSAndroid Build Coastguard Worker /// CHECK: mov w16, #0x14 78*795d594fSAndroid Build Coastguard Worker /// CHECK: csel {{w\d+}}, {{w\d+}}, w16, gt maxI(int a)79*795d594fSAndroid Build Coastguard Worker public static int maxI(int a) { 80*795d594fSAndroid Build Coastguard Worker return Math.max(a, 20); 81*795d594fSAndroid Build Coastguard Worker } 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestMinMax.maxL(long) builder (after) 84*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:j\d+>> ParameterValue 85*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Con:j\d+>> LongConstant 20 86*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:j\d+>> Max [<<Par>>,<<Con>>] 87*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 88*795d594fSAndroid Build Coastguard Worker // 89*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestMinMax.maxL(long) builder (after) 90*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 91*795d594fSAndroid Build Coastguard Worker // 92*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long TestMinMax.maxL(long) disassembly (after) 93*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{x\d+}}, #0x14 94*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{x\d+}}, #0x14 95*795d594fSAndroid Build Coastguard Worker // Check that the constant generation was handled by VIXL. 96*795d594fSAndroid Build Coastguard Worker /// CHECK: mov x16, #0x14 97*795d594fSAndroid Build Coastguard Worker /// CHECK: csel {{x\d+}}, {{x\d+}}, x16, gt maxL(long a)98*795d594fSAndroid Build Coastguard Worker public static long maxL(long a) { 99*795d594fSAndroid Build Coastguard Worker return Math.max(a, 20L); 100*795d594fSAndroid Build Coastguard Worker } 101*795d594fSAndroid Build Coastguard Worker 102*795d594fSAndroid Build Coastguard Worker // 103*795d594fSAndroid Build Coastguard Worker // Special Cases 104*795d594fSAndroid Build Coastguard Worker // 105*795d594fSAndroid Build Coastguard Worker 106*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int TestMinMax.minIntConstantZero(int) disassembly (after) 107*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 108*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{w\d+}}, #0x0 109*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{w\d+}}, #0x0 (0) 110*795d594fSAndroid Build Coastguard Worker /// CHECK: csel {{w\d+}}, {{w\d+}}, wzr, lt 111*795d594fSAndroid Build Coastguard Worker /// CHECK: ret minIntConstantZero(int a)112*795d594fSAndroid Build Coastguard Worker public static int minIntConstantZero(int a) { 113*795d594fSAndroid Build Coastguard Worker return Math.min(a, 0); 114*795d594fSAndroid Build Coastguard Worker } 115*795d594fSAndroid Build Coastguard Worker 116*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int TestMinMax.minIntConstantOne(int) disassembly (after) 117*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 118*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{w\d+}}, #0x1 119*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{w\d+}}, #0x1 (1) 120*795d594fSAndroid Build Coastguard Worker /// CHECK: csinc {{w\d+}}, {{w\d+}}, wzr, lt 121*795d594fSAndroid Build Coastguard Worker /// CHECK: ret minIntConstantOne(int a)122*795d594fSAndroid Build Coastguard Worker public static int minIntConstantOne(int a) { 123*795d594fSAndroid Build Coastguard Worker return Math.min(a, 1); 124*795d594fSAndroid Build Coastguard Worker } 125*795d594fSAndroid Build Coastguard Worker 126*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int TestMinMax.minIntConstantMinusOne(int) disassembly (after) 127*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 128*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{w\d+}}, #0xffffffff 129*795d594fSAndroid Build Coastguard Worker /// CHECK: cmn {{w\d+}}, #0x1 (1) 130*795d594fSAndroid Build Coastguard Worker /// CHECK: csinv {{w\d+}}, {{w\d+}}, wzr, lt 131*795d594fSAndroid Build Coastguard Worker /// CHECK: ret minIntConstantMinusOne(int a)132*795d594fSAndroid Build Coastguard Worker public static int minIntConstantMinusOne(int a) { 133*795d594fSAndroid Build Coastguard Worker return Math.min(a, -1); 134*795d594fSAndroid Build Coastguard Worker } 135*795d594fSAndroid Build Coastguard Worker 136*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long TestMinMax.minLongConstantZero(long) disassembly (after) 137*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 138*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{x\d+}}, #0x0 139*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{x\d+}}, #0x0 (0) 140*795d594fSAndroid Build Coastguard Worker /// CHECK: csel {{x\d+}}, {{x\d+}}, xzr, lt 141*795d594fSAndroid Build Coastguard Worker /// CHECK: ret minLongConstantZero(long a)142*795d594fSAndroid Build Coastguard Worker public static long minLongConstantZero(long a) { 143*795d594fSAndroid Build Coastguard Worker return Math.min(a, 0L); 144*795d594fSAndroid Build Coastguard Worker } 145*795d594fSAndroid Build Coastguard Worker 146*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long TestMinMax.minLongConstantOne(long) disassembly (after) 147*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 148*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{x\d+}}, #0x1 149*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{x\d+}}, #0x1 (1) 150*795d594fSAndroid Build Coastguard Worker /// CHECK: csinc {{x\d+}}, {{x\d+}}, xzr, lt 151*795d594fSAndroid Build Coastguard Worker /// CHECK: ret minLongConstantOne(long a)152*795d594fSAndroid Build Coastguard Worker public static long minLongConstantOne(long a) { 153*795d594fSAndroid Build Coastguard Worker return Math.min(a, 1L); 154*795d594fSAndroid Build Coastguard Worker } 155*795d594fSAndroid Build Coastguard Worker 156*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long TestMinMax.minLongConstantMinusOne(long) disassembly (after) 157*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 158*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{x\d+}}, #0xffffffffffffffff 159*795d594fSAndroid Build Coastguard Worker /// CHECK: cmn {{x\d+}}, #0x1 (1) 160*795d594fSAndroid Build Coastguard Worker /// CHECK: csinv {{x\d+}}, {{x\d+}}, xzr, lt 161*795d594fSAndroid Build Coastguard Worker /// CHECK: ret minLongConstantMinusOne(long a)162*795d594fSAndroid Build Coastguard Worker public static long minLongConstantMinusOne(long a) { 163*795d594fSAndroid Build Coastguard Worker return Math.min(a, -1L); 164*795d594fSAndroid Build Coastguard Worker } 165*795d594fSAndroid Build Coastguard Worker 166*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int TestMinMax.maxIntConstantZero(int) disassembly (after) 167*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 168*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{w\d+}}, #0x0 169*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{w\d+}}, #0x0 (0) 170*795d594fSAndroid Build Coastguard Worker /// CHECK: csel {{w\d+}}, {{w\d+}}, wzr, gt 171*795d594fSAndroid Build Coastguard Worker /// CHECK: ret maxIntConstantZero(int a)172*795d594fSAndroid Build Coastguard Worker public static int maxIntConstantZero(int a) { 173*795d594fSAndroid Build Coastguard Worker return Math.max(a, 0); 174*795d594fSAndroid Build Coastguard Worker } 175*795d594fSAndroid Build Coastguard Worker 176*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int TestMinMax.maxIntConstantOne(int) disassembly (after) 177*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 178*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{w\d+}}, #0x1 179*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{w\d+}}, #0x1 (1) 180*795d594fSAndroid Build Coastguard Worker /// CHECK: csinc {{w\d+}}, {{w\d+}}, wzr, gt 181*795d594fSAndroid Build Coastguard Worker /// CHECK: ret maxIntConstantOne(int a)182*795d594fSAndroid Build Coastguard Worker public static int maxIntConstantOne(int a) { 183*795d594fSAndroid Build Coastguard Worker return Math.max(a, 1); 184*795d594fSAndroid Build Coastguard Worker } 185*795d594fSAndroid Build Coastguard Worker 186*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int TestMinMax.maxIntConstantMinusOne(int) disassembly (after) 187*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 188*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{w\d+}}, #0xffffffff 189*795d594fSAndroid Build Coastguard Worker /// CHECK: cmn {{w\d+}}, #0x1 (1) 190*795d594fSAndroid Build Coastguard Worker /// CHECK: csinv {{w\d+}}, {{w\d+}}, wzr, gt 191*795d594fSAndroid Build Coastguard Worker /// CHECK: ret maxIntConstantMinusOne(int a)192*795d594fSAndroid Build Coastguard Worker public static int maxIntConstantMinusOne(int a) { 193*795d594fSAndroid Build Coastguard Worker return Math.max(a, -1); 194*795d594fSAndroid Build Coastguard Worker } 195*795d594fSAndroid Build Coastguard Worker 196*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: int TestMinMax.maxIntLargeConstant(int) disassembly (after) 197*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 198*795d594fSAndroid Build Coastguard Worker /// CHECK: mov {{w\d+}}, #0x2001 199*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{w\d+}}, {{w\d+}} 200*795d594fSAndroid Build Coastguard Worker // Check that constant generation was not handled by VIXL. 201*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{w\d+}}, #0x2001 202*795d594fSAndroid Build Coastguard Worker /// CHECK: csel {{w\d+}}, {{w\d+}}, {{w\d+}}, gt 203*795d594fSAndroid Build Coastguard Worker /// CHECK: ret maxIntLargeConstant(int a)204*795d594fSAndroid Build Coastguard Worker public static int maxIntLargeConstant(int a) { 205*795d594fSAndroid Build Coastguard Worker return Math.max(a, 8193); 206*795d594fSAndroid Build Coastguard Worker } 207*795d594fSAndroid Build Coastguard Worker 208*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long TestMinMax.maxLongConstantZero(long) disassembly (after) 209*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 210*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{x\d+}}, #0x0 211*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{x\d+}}, #0x0 (0) 212*795d594fSAndroid Build Coastguard Worker /// CHECK: csel {{x\d+}}, {{x\d+}}, xzr, gt 213*795d594fSAndroid Build Coastguard Worker /// CHECK: ret maxLongConstantZero(long a)214*795d594fSAndroid Build Coastguard Worker public static long maxLongConstantZero(long a) { 215*795d594fSAndroid Build Coastguard Worker return Math.max(a, 0L); 216*795d594fSAndroid Build Coastguard Worker } 217*795d594fSAndroid Build Coastguard Worker 218*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long TestMinMax.maxLongConstantOne(long) disassembly (after) 219*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 220*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{x\d+}}, #0x1 221*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{x\d+}}, #0x1 (1) 222*795d594fSAndroid Build Coastguard Worker /// CHECK: csinc {{x\d+}}, {{x\d+}}, xzr, gt 223*795d594fSAndroid Build Coastguard Worker /// CHECK: ret maxLongConstantOne(long a)224*795d594fSAndroid Build Coastguard Worker public static long maxLongConstantOne(long a) { 225*795d594fSAndroid Build Coastguard Worker return Math.max(a, 1L); 226*795d594fSAndroid Build Coastguard Worker } 227*795d594fSAndroid Build Coastguard Worker 228*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long TestMinMax.maxLongConstantMinusOne(long) disassembly (after) 229*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 230*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{x\d+}}, #0xffffffffffffffff 231*795d594fSAndroid Build Coastguard Worker /// CHECK: cmn {{x\d+}}, #0x1 (1) 232*795d594fSAndroid Build Coastguard Worker /// CHECK: csinv {{x\d+}}, {{x\d+}}, xzr, gt 233*795d594fSAndroid Build Coastguard Worker /// CHECK: ret maxLongConstantMinusOne(long a)234*795d594fSAndroid Build Coastguard Worker public static long maxLongConstantMinusOne(long a) { 235*795d594fSAndroid Build Coastguard Worker return Math.max(a, -1L); 236*795d594fSAndroid Build Coastguard Worker } 237*795d594fSAndroid Build Coastguard Worker 238*795d594fSAndroid Build Coastguard Worker /// CHECK-START-ARM64: long TestMinMax.maxLongLargeConstant(long) disassembly (after) 239*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 240*795d594fSAndroid Build Coastguard Worker /// CHECK: mov {{x\d+}}, #0x2001 241*795d594fSAndroid Build Coastguard Worker /// CHECK: cmp {{x\d+}}, {{x\d+}} 242*795d594fSAndroid Build Coastguard Worker // Check that constant generation was not handled by VIXL. 243*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: mov {{x\d+}}, #0x2001 244*795d594fSAndroid Build Coastguard Worker /// CHECK: csel {{x\d+}}, {{x\d+}}, {{x\d+}}, gt 245*795d594fSAndroid Build Coastguard Worker /// CHECK: ret maxLongLargeConstant(long a)246*795d594fSAndroid Build Coastguard Worker public static long maxLongLargeConstant(long a) { 247*795d594fSAndroid Build Coastguard Worker return Math.max(a, 8193L); 248*795d594fSAndroid Build Coastguard Worker } 249*795d594fSAndroid Build Coastguard Worker 250*795d594fSAndroid Build Coastguard Worker // 251*795d594fSAndroid Build Coastguard Worker // Different types. 252*795d594fSAndroid Build Coastguard Worker // 253*795d594fSAndroid Build Coastguard Worker 254*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min1(int, int) instruction_simplifier$after_gvn (before) 255*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> GreaterThanOrEqual [<<Op1:i\d+>>,<<Op2:i\d+>>] 256*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>] 257*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 258*795d594fSAndroid Build Coastguard Worker // 259*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min1(int, int) instruction_simplifier$after_gvn (after) 260*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min 261*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 262*795d594fSAndroid Build Coastguard Worker // 263*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min1(int, int) instruction_simplifier$after_gvn (after) 264*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select min1(int a, int b)265*795d594fSAndroid Build Coastguard Worker public static int min1(int a, int b) { 266*795d594fSAndroid Build Coastguard Worker return a < b ? a : b; 267*795d594fSAndroid Build Coastguard Worker } 268*795d594fSAndroid Build Coastguard Worker 269*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min2(int, int) instruction_simplifier$after_gvn (before) 270*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> GreaterThan [<<Op1:i\d+>>,<<Op2:i\d+>>] 271*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>] 272*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 273*795d594fSAndroid Build Coastguard Worker // 274*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min2(int, int) instruction_simplifier$after_gvn (after) 275*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min 276*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 277*795d594fSAndroid Build Coastguard Worker // 278*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min2(int, int) instruction_simplifier$after_gvn (after) 279*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select min2(int a, int b)280*795d594fSAndroid Build Coastguard Worker public static int min2(int a, int b) { 281*795d594fSAndroid Build Coastguard Worker return a <= b ? a : b; 282*795d594fSAndroid Build Coastguard Worker } 283*795d594fSAndroid Build Coastguard Worker 284*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min3(int, int) instruction_simplifier$after_gvn (before) 285*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThanOrEqual [<<Op1:i\d+>>,<<Op2:i\d+>>] 286*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>] 287*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 288*795d594fSAndroid Build Coastguard Worker // 289*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min3(int, int) instruction_simplifier$after_gvn (after) 290*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min 291*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 292*795d594fSAndroid Build Coastguard Worker // 293*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min3(int, int) instruction_simplifier$after_gvn (after) 294*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select min3(int a, int b)295*795d594fSAndroid Build Coastguard Worker public static int min3(int a, int b) { 296*795d594fSAndroid Build Coastguard Worker return a > b ? b : a; 297*795d594fSAndroid Build Coastguard Worker } 298*795d594fSAndroid Build Coastguard Worker 299*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min4(int, int) instruction_simplifier$after_gvn (before) 300*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:i\d+>>,<<Op2:i\d+>>] 301*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>] 302*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 303*795d594fSAndroid Build Coastguard Worker // 304*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min4(int, int) instruction_simplifier$after_gvn (after) 305*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min 306*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 307*795d594fSAndroid Build Coastguard Worker // 308*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min4(int, int) instruction_simplifier$after_gvn (after) 309*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select min4(int a, int b)310*795d594fSAndroid Build Coastguard Worker public static int min4(int a, int b) { 311*795d594fSAndroid Build Coastguard Worker return a >= b ? b : a; 312*795d594fSAndroid Build Coastguard Worker } 313*795d594fSAndroid Build Coastguard Worker 314*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min5(short, short) instruction_simplifier$after_gvn (before) 315*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:s\d+>>,<<Op2:s\d+>>] 316*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>] 317*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 318*795d594fSAndroid Build Coastguard Worker // 319*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min5(short, short) instruction_simplifier$after_gvn (after) 320*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min 321*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 322*795d594fSAndroid Build Coastguard Worker // 323*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min5(short, short) instruction_simplifier$after_gvn (after) 324*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select min5(short a, short b)325*795d594fSAndroid Build Coastguard Worker public static int min5(short a, short b) { 326*795d594fSAndroid Build Coastguard Worker return a >= b ? b : a; 327*795d594fSAndroid Build Coastguard Worker } 328*795d594fSAndroid Build Coastguard Worker 329*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min6(byte, byte) instruction_simplifier$after_gvn (before) 330*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:b\d+>>,<<Op2:b\d+>>] 331*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>] 332*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 333*795d594fSAndroid Build Coastguard Worker // 334*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min6(byte, byte) instruction_simplifier$after_gvn (after) 335*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min 336*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 337*795d594fSAndroid Build Coastguard Worker // 338*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min6(byte, byte) instruction_simplifier$after_gvn (after) 339*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select min6(byte a, byte b)340*795d594fSAndroid Build Coastguard Worker public static int min6(byte a, byte b) { 341*795d594fSAndroid Build Coastguard Worker return a >= b ? b : a; 342*795d594fSAndroid Build Coastguard Worker } 343*795d594fSAndroid Build Coastguard Worker 344*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestMinMax.min7(long, long) instruction_simplifier$after_gvn (before) 345*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:j\d+>>,<<Op2:j\d+>>] 346*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:j\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>] 347*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 348*795d594fSAndroid Build Coastguard Worker // 349*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestMinMax.min7(long, long) instruction_simplifier$after_gvn (after) 350*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:j\d+>> Min 351*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 352*795d594fSAndroid Build Coastguard Worker // 353*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestMinMax.min7(long, long) instruction_simplifier$after_gvn (after) 354*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select min7(long a, long b)355*795d594fSAndroid Build Coastguard Worker public static long min7(long a, long b) { 356*795d594fSAndroid Build Coastguard Worker return a >= b ? b : a; 357*795d594fSAndroid Build Coastguard Worker } 358*795d594fSAndroid Build Coastguard Worker 359*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max1(int, int) instruction_simplifier$after_gvn (before) 360*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> GreaterThanOrEqual [<<Op1:i\d+>>,<<Op2:i\d+>>] 361*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>] 362*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 363*795d594fSAndroid Build Coastguard Worker // 364*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max1(int, int) instruction_simplifier$after_gvn (after) 365*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max 366*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 367*795d594fSAndroid Build Coastguard Worker // 368*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max1(int, int) instruction_simplifier$after_gvn (after) 369*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select max1(int a, int b)370*795d594fSAndroid Build Coastguard Worker public static int max1(int a, int b) { 371*795d594fSAndroid Build Coastguard Worker return a < b ? b : a; 372*795d594fSAndroid Build Coastguard Worker } 373*795d594fSAndroid Build Coastguard Worker 374*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max2(int, int) instruction_simplifier$after_gvn (before) 375*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> GreaterThan [<<Op1:i\d+>>,<<Op2:i\d+>>] 376*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op2>>,<<Op1>>,<<Cnd>>] 377*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 378*795d594fSAndroid Build Coastguard Worker // 379*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max2(int, int) instruction_simplifier$after_gvn (after) 380*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max 381*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 382*795d594fSAndroid Build Coastguard Worker // 383*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max2(int, int) instruction_simplifier$after_gvn (after) 384*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select max2(int a, int b)385*795d594fSAndroid Build Coastguard Worker public static int max2(int a, int b) { 386*795d594fSAndroid Build Coastguard Worker return a <= b ? b : a; 387*795d594fSAndroid Build Coastguard Worker } 388*795d594fSAndroid Build Coastguard Worker 389*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max3(int, int) instruction_simplifier$after_gvn (before) 390*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThanOrEqual [<<Op1:i\d+>>,<<Op2:i\d+>>] 391*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>] 392*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 393*795d594fSAndroid Build Coastguard Worker // 394*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max3(int, int) instruction_simplifier$after_gvn (after) 395*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max 396*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 397*795d594fSAndroid Build Coastguard Worker // 398*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max3(int, int) instruction_simplifier$after_gvn (after) 399*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select max3(int a, int b)400*795d594fSAndroid Build Coastguard Worker public static int max3(int a, int b) { 401*795d594fSAndroid Build Coastguard Worker return a > b ? a : b; 402*795d594fSAndroid Build Coastguard Worker } 403*795d594fSAndroid Build Coastguard Worker 404*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max4(int, int) instruction_simplifier$after_gvn (before) 405*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:i\d+>>,<<Op2:i\d+>>] 406*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>] 407*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 408*795d594fSAndroid Build Coastguard Worker // 409*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max4(int, int) instruction_simplifier$after_gvn (after) 410*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max 411*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 412*795d594fSAndroid Build Coastguard Worker // 413*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max4(int, int) instruction_simplifier$after_gvn (after) 414*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select max4(int a, int b)415*795d594fSAndroid Build Coastguard Worker public static int max4(int a, int b) { 416*795d594fSAndroid Build Coastguard Worker return a >= b ? a : b; 417*795d594fSAndroid Build Coastguard Worker } 418*795d594fSAndroid Build Coastguard Worker 419*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max5(short, short) instruction_simplifier$after_gvn (before) 420*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:s\d+>>,<<Op2:s\d+>>] 421*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>] 422*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 423*795d594fSAndroid Build Coastguard Worker // 424*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max5(short, short) instruction_simplifier$after_gvn (after) 425*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max 426*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 427*795d594fSAndroid Build Coastguard Worker // 428*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max5(short, short) instruction_simplifier$after_gvn (after) 429*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select max5(short a, short b)430*795d594fSAndroid Build Coastguard Worker public static int max5(short a, short b) { 431*795d594fSAndroid Build Coastguard Worker return a >= b ? a : b; 432*795d594fSAndroid Build Coastguard Worker } 433*795d594fSAndroid Build Coastguard Worker 434*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max6(byte, byte) instruction_simplifier$after_gvn (before) 435*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:b\d+>>,<<Op2:b\d+>>] 436*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>] 437*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 438*795d594fSAndroid Build Coastguard Worker // 439*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max6(byte, byte) instruction_simplifier$after_gvn (after) 440*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max 441*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 442*795d594fSAndroid Build Coastguard Worker // 443*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max6(byte, byte) instruction_simplifier$after_gvn (after) 444*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select max6(byte a, byte b)445*795d594fSAndroid Build Coastguard Worker public static int max6(byte a, byte b) { 446*795d594fSAndroid Build Coastguard Worker return a >= b ? a : b; 447*795d594fSAndroid Build Coastguard Worker } 448*795d594fSAndroid Build Coastguard Worker 449*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestMinMax.max7(long, long) instruction_simplifier$after_gvn (before) 450*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Op1:j\d+>>,<<Op2:j\d+>>] 451*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:j\d+>> Select [<<Op1>>,<<Op2>>,<<Cnd>>] 452*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 453*795d594fSAndroid Build Coastguard Worker // 454*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestMinMax.max7(long, long) instruction_simplifier$after_gvn (after) 455*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:j\d+>> Max 456*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 457*795d594fSAndroid Build Coastguard Worker // 458*795d594fSAndroid Build Coastguard Worker /// CHECK-START: long TestMinMax.max7(long, long) instruction_simplifier$after_gvn (after) 459*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select max7(long a, long b)460*795d594fSAndroid Build Coastguard Worker public static long max7(long a, long b) { 461*795d594fSAndroid Build Coastguard Worker return a >= b ? a : b; 462*795d594fSAndroid Build Coastguard Worker } 463*795d594fSAndroid Build Coastguard Worker 464*795d594fSAndroid Build Coastguard Worker // 465*795d594fSAndroid Build Coastguard Worker // Complications. 466*795d594fSAndroid Build Coastguard Worker // 467*795d594fSAndroid Build Coastguard Worker 468*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min0(int[], int[]) instruction_simplifier$after_gvn (before) 469*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Ar1:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}] 470*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Ar2:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}] 471*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> GreaterThan [<<Ar1>>,<<Ar2>>] 472*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Ar1>>,<<Ar2>>,<<Cnd>>] 473*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 474*795d594fSAndroid Build Coastguard Worker // 475*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min0(int[], int[]) instruction_simplifier$after_gvn (after) 476*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min 477*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 478*795d594fSAndroid Build Coastguard Worker // 479*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.min0(int[], int[]) instruction_simplifier$after_gvn (after) 480*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select min0(int[] a, int[] b)481*795d594fSAndroid Build Coastguard Worker public static int min0(int[] a, int[] b) { 482*795d594fSAndroid Build Coastguard Worker // Repeat of array references needs finding the common subexpressions 483*795d594fSAndroid Build Coastguard Worker // prior to doing the select and min/max recognition. 484*795d594fSAndroid Build Coastguard Worker return a[0] <= b[0] ? a[0] : b[0]; 485*795d594fSAndroid Build Coastguard Worker } 486*795d594fSAndroid Build Coastguard Worker 487*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max0(int[], int[]) instruction_simplifier$after_gvn (before) 488*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Ar1:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}] 489*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Ar2:i\d+>> ArrayGet [{{l\d+}},{{i\d+}}] 490*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd:z\d+>> LessThan [<<Ar1>>,<<Ar2>>] 491*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel:i\d+>> Select [<<Ar1>>,<<Ar2>>,<<Cnd>>] 492*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel>>] 493*795d594fSAndroid Build Coastguard Worker // 494*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max0(int[], int[]) instruction_simplifier$after_gvn (after) 495*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max 496*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 497*795d594fSAndroid Build Coastguard Worker // 498*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.max0(int[], int[]) instruction_simplifier$after_gvn (after) 499*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select max0(int[] a, int[] b)500*795d594fSAndroid Build Coastguard Worker public static int max0(int[] a, int[] b) { 501*795d594fSAndroid Build Coastguard Worker // Repeat of array references needs finding the common subexpressions 502*795d594fSAndroid Build Coastguard Worker // prior to doing the select and min/max recognition. 503*795d594fSAndroid Build Coastguard Worker return a[0] >= b[0] ? a[0] : b[0]; 504*795d594fSAndroid Build Coastguard Worker } 505*795d594fSAndroid Build Coastguard Worker 506*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax1(int) instruction_simplifier$after_gvn (before) 507*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 508*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<P100:i\d+>> IntConstant 100 509*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<M100:i\d+>> IntConstant -100 510*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd1:z\d+>> LessThanOrEqual [<<Par>>,<<P100>>] 511*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel1:i\d+>> Select [<<P100>>,<<Par>>,<<Cnd1>>] 512*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd2:z\d+>> GreaterThanOrEqual [<<Sel1>>,<<M100>>] 513*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel2:i\d+>> Select [<<M100>>,<<Sel1>>,<<Cnd2>>] 514*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel2>>] 515*795d594fSAndroid Build Coastguard Worker // 516*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax1(int) instruction_simplifier$after_gvn (after) 517*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 518*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<P100:i\d+>> IntConstant 100 519*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<M100:i\d+>> IntConstant -100 520*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min [<<Par>>,<<P100>>] 521*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max [<<Min>>,<<M100>>] 522*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 523*795d594fSAndroid Build Coastguard Worker // 524*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax1(int) instruction_simplifier$after_gvn (after) 525*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select minmax1(int x)526*795d594fSAndroid Build Coastguard Worker public static int minmax1(int x) { 527*795d594fSAndroid Build Coastguard Worker // Simple if-if gives clean select sequence. 528*795d594fSAndroid Build Coastguard Worker if (x > 100) { 529*795d594fSAndroid Build Coastguard Worker x = 100; 530*795d594fSAndroid Build Coastguard Worker } 531*795d594fSAndroid Build Coastguard Worker if (x < -100) { 532*795d594fSAndroid Build Coastguard Worker x = -100; 533*795d594fSAndroid Build Coastguard Worker } 534*795d594fSAndroid Build Coastguard Worker return x; 535*795d594fSAndroid Build Coastguard Worker } 536*795d594fSAndroid Build Coastguard Worker 537*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax2(int) instruction_simplifier$after_gvn (before) 538*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 539*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<P100:i\d+>> IntConstant 100 540*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<M100:i\d+>> IntConstant -100 541*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd1:z\d+>> LessThanOrEqual [<<Par>>,<<P100>>] 542*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd2:z\d+>> GreaterThanOrEqual [<<Par>>,<<M100>>] 543*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel1:i\d+>> Select [<<M100>>,<<Par>>,<<Cnd2>>] 544*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel2:i\d+>> Select [<<P100>>,<<Sel1>>,<<Cnd1>>] 545*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel2>>] 546*795d594fSAndroid Build Coastguard Worker // 547*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax2(int) instruction_simplifier$after_gvn (after) 548*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 549*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<P100:i\d+>> IntConstant 100 550*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<M100:i\d+>> IntConstant -100 551*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max [<<Par>>,<<M100>>] 552*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min [<<Max>>,<<P100>>] 553*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 554*795d594fSAndroid Build Coastguard Worker // 555*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax2(int) instruction_simplifier$after_gvn (after) 556*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select minmax2(int x)557*795d594fSAndroid Build Coastguard Worker public static int minmax2(int x) { 558*795d594fSAndroid Build Coastguard Worker // Simple if-else requires inspecting bounds of resulting selects. 559*795d594fSAndroid Build Coastguard Worker if (x > 100) { 560*795d594fSAndroid Build Coastguard Worker x = 100; 561*795d594fSAndroid Build Coastguard Worker } else if (x < -100) { 562*795d594fSAndroid Build Coastguard Worker x = -100; 563*795d594fSAndroid Build Coastguard Worker } 564*795d594fSAndroid Build Coastguard Worker return x; 565*795d594fSAndroid Build Coastguard Worker } 566*795d594fSAndroid Build Coastguard Worker 567*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax3(int) select_generator (after) 568*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 569*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<P100:i\d+>> IntConstant 100 570*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<M100:i\d+>> IntConstant -100 571*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd1:z\d+>> LessThanOrEqual [<<Par>>,<<P100>>] 572*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd2:z\d+>> GreaterThanOrEqual [<<Par>>,<<M100>>] 573*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel1:i\d+>> Select [<<M100>>,<<Par>>,<<Cnd2>>] 574*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel2:i\d+>> Select [<<P100>>,<<Sel1>>,<<Cnd1>>] 575*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel2>>] 576*795d594fSAndroid Build Coastguard Worker 577*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax3(int) instruction_simplifier$after_gvn (after) 578*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 579*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<P100:i\d+>> IntConstant 100 580*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<M100:i\d+>> IntConstant -100 581*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max [<<Par>>,<<M100>>] 582*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min [<<Max>>,<<P100>>] 583*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Min>>] 584*795d594fSAndroid Build Coastguard Worker // 585*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax3(int) instruction_simplifier$after_gvn (after) 586*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select minmax3(int x)587*795d594fSAndroid Build Coastguard Worker public static int minmax3(int x) { 588*795d594fSAndroid Build Coastguard Worker return (x > 100) ? 100 : ((x < -100) ? -100 : x); 589*795d594fSAndroid Build Coastguard Worker } 590*795d594fSAndroid Build Coastguard Worker 591*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax4(int) select_generator (after) 592*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 593*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<P100:i\d+>> IntConstant 100 594*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<M100:i\d+>> IntConstant -100 595*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd1:z\d+>> GreaterThanOrEqual [<<Par>>,<<M100>>] 596*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd2:z\d+>> LessThanOrEqual [<<Par>>,<<P100>>] 597*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel1:i\d+>> Select [<<P100>>,<<Par>>,<<Cnd2>>] 598*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel2:i\d+>> Select [<<M100>>,<<Sel1>>,<<Cnd1>>] 599*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Sel2>>] 600*795d594fSAndroid Build Coastguard Worker 601*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax4(int) instruction_simplifier$after_gvn (after) 602*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par:i\d+>> ParameterValue 603*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<P100:i\d+>> IntConstant 100 604*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<M100:i\d+>> IntConstant -100 605*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min [<<Par>>,<<P100>>] 606*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max [<<Min>>,<<M100>>] 607*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Max>>] 608*795d594fSAndroid Build Coastguard Worker // 609*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmax4(int) instruction_simplifier$after_gvn (after) 610*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: Select minmax4(int x)611*795d594fSAndroid Build Coastguard Worker public static int minmax4(int x) { 612*795d594fSAndroid Build Coastguard Worker return (x < -100) ? -100 : ((x > 100) ? 100 : x); 613*795d594fSAndroid Build Coastguard Worker } 614*795d594fSAndroid Build Coastguard Worker 615*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmaxCSEScalar(int, int) select_generator (after) 616*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par1:i\d+>> ParameterValue 617*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par2:i\d+>> ParameterValue 618*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd1:z\d+>> LessThanOrEqual [<<Par1>>,<<Par2>>] 619*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel1:i\d+>> Select [<<Par1>>,<<Par2>>,<<Cnd1>>] 620*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd2:z\d+>> GreaterThanOrEqual [<<Par1>>,<<Par2>>] 621*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel2:i\d+>> Select [<<Par1>>,<<Par2>>,<<Cnd2>>] 622*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Sel1>>,<<Sel2>>] 623*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:i\d+>> Add [<<Sel1>>,<<Add1>>] 624*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Sel2>>,<<Add2>>] 625*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:i\d+>> Add [<<Sel1>>,<<Add3>>] 626*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add5:i\d+>> Add [<<Sel2>>,<<Add4>>] 627*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Add5>>] 628*795d594fSAndroid Build Coastguard Worker // 629*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmaxCSEScalar(int, int) instruction_simplifier$after_gvn (after) 630*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par1:i\d+>> ParameterValue 631*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par2:i\d+>> ParameterValue 632*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max [<<Par1>>,<<Par2>>] 633*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min [<<Par1>>,<<Par2>>] 634*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Max>>,<<Min>>] 635*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:i\d+>> Add [<<Max>>,<<Add1>>] 636*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Min>>,<<Add2>>] 637*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:i\d+>> Add [<<Max>>,<<Add3>>] 638*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add5:i\d+>> Add [<<Min>>,<<Add4>>] 639*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Add5>>] minmaxCSEScalar(int x, int y)640*795d594fSAndroid Build Coastguard Worker public static int minmaxCSEScalar(int x, int y) { 641*795d594fSAndroid Build Coastguard Worker int t1 = (x > y) ? x : y; 642*795d594fSAndroid Build Coastguard Worker int t2 = (x < y) ? x : y; 643*795d594fSAndroid Build Coastguard Worker int t3 = (x > y) ? x : y; 644*795d594fSAndroid Build Coastguard Worker int t4 = (x < y) ? x : y; 645*795d594fSAndroid Build Coastguard Worker int t5 = (x > y) ? x : y; 646*795d594fSAndroid Build Coastguard Worker int t6 = (x < y) ? x : y; 647*795d594fSAndroid Build Coastguard Worker // Make sure min/max is CSEed. 648*795d594fSAndroid Build Coastguard Worker return t1 + t2 + t3 + t4 + t5 + t6; 649*795d594fSAndroid Build Coastguard Worker } 650*795d594fSAndroid Build Coastguard Worker 651*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmaxCSEArray(int[], int[]) select_generator (after) 652*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr1:i\d+>> ArrayGet 653*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr2:i\d+>> ArrayGet 654*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd1:z\d+>> LessThanOrEqual [<<Arr1>>,<<Arr2>>] 655*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel1:i\d+>> Select [<<Arr1>>,<<Arr2>>,<<Cnd1>>] 656*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Cnd2:z\d+>> GreaterThanOrEqual [<<Arr1>>,<<Arr2>>] 657*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Sel2:i\d+>> Select [<<Arr1>>,<<Arr2>>,<<Cnd2>>] 658*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Sel1>>,<<Sel2>>] 659*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:i\d+>> Add [<<Sel1>>,<<Add1>>] 660*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Sel2>>,<<Add2>>] 661*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:i\d+>> Add [<<Sel1>>,<<Add3>>] 662*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add5:i\d+>> Add [<<Sel2>>,<<Add4>>] 663*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Add5>>] 664*795d594fSAndroid Build Coastguard Worker // 665*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmaxCSEArray(int[], int[]) instruction_simplifier$after_gvn (after) 666*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr1:i\d+>> ArrayGet 667*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Arr2:i\d+>> ArrayGet 668*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max [<<Arr1>>,<<Arr2>>] 669*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min [<<Arr1>>,<<Arr2>>] 670*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Max>>,<<Min>>] 671*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:i\d+>> Add [<<Max>>,<<Add1>>] 672*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Min>>,<<Add2>>] 673*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add4:i\d+>> Add [<<Max>>,<<Add3>>] 674*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add5:i\d+>> Add [<<Min>>,<<Add4>>] 675*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Add5>>] minmaxCSEArray(int[] x, int[] y)676*795d594fSAndroid Build Coastguard Worker public static int minmaxCSEArray(int[] x, int[] y) { 677*795d594fSAndroid Build Coastguard Worker int t1 = (x[0] > y[0]) ? x[0] : y[0]; 678*795d594fSAndroid Build Coastguard Worker int t2 = (x[0] < y[0]) ? x[0] : y[0]; 679*795d594fSAndroid Build Coastguard Worker int t3 = (x[0] > y[0]) ? x[0] : y[0]; 680*795d594fSAndroid Build Coastguard Worker int t4 = (x[0] < y[0]) ? x[0] : y[0]; 681*795d594fSAndroid Build Coastguard Worker int t5 = (x[0] > y[0]) ? x[0] : y[0]; 682*795d594fSAndroid Build Coastguard Worker int t6 = (x[0] < y[0]) ? x[0] : y[0]; 683*795d594fSAndroid Build Coastguard Worker // Make sure min/max is CSEed. 684*795d594fSAndroid Build Coastguard Worker return t1 + t2 + t3 + t4 + t5 + t6; 685*795d594fSAndroid Build Coastguard Worker } 686*795d594fSAndroid Build Coastguard Worker 687*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int TestMinMax.minmaxCSEScalarAndCond(int, int) instruction_simplifier$after_gvn (after) 688*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par1:i\d+>> ParameterValue 689*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Par2:i\d+>> ParameterValue 690*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Max:i\d+>> Max [<<Par1>>,<<Par2>>] 691*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Min:i\d+>> Min [<<Par1>>,<<Par2>>] 692*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add:i\d+>> Add [<<Max>>,<<Min>>] 693*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Add>>] 694*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add1:i\d+>> Add [<<Max>>,<<Min>>] 695*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add2:i\d+>> Add [<<Max>>,<<Add1>>] 696*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: <<Add3:i\d+>> Add [<<Min>>,<<Add2>>] 697*795d594fSAndroid Build Coastguard Worker /// CHECK-DAG: Return [<<Add3>>] minmaxCSEScalarAndCond(int x, int y)698*795d594fSAndroid Build Coastguard Worker public static int minmaxCSEScalarAndCond(int x, int y) { 699*795d594fSAndroid Build Coastguard Worker int t1 = (x > y) ? x : y; 700*795d594fSAndroid Build Coastguard Worker int t2 = (x < y) ? x : y; 701*795d594fSAndroid Build Coastguard Worker if (x == y) 702*795d594fSAndroid Build Coastguard Worker return t1 + t2; 703*795d594fSAndroid Build Coastguard Worker int t3 = (x > y) ? x : y; 704*795d594fSAndroid Build Coastguard Worker int t4 = (x < y) ? x : y; 705*795d594fSAndroid Build Coastguard Worker // Make sure min/max is CSEed. 706*795d594fSAndroid Build Coastguard Worker return t1 + t2 + t3 + t4; 707*795d594fSAndroid Build Coastguard Worker } 708*795d594fSAndroid Build Coastguard Worker main()709*795d594fSAndroid Build Coastguard Worker public static void main() { 710*795d594fSAndroid Build Coastguard Worker // Intrinsics. 711*795d594fSAndroid Build Coastguard Worker expectEquals(10, minI(10)); 712*795d594fSAndroid Build Coastguard Worker expectEquals(20, minI(25)); 713*795d594fSAndroid Build Coastguard Worker expectEquals(-1, minIntConstantZero(-1)); 714*795d594fSAndroid Build Coastguard Worker expectEquals(0, minIntConstantZero(1)); 715*795d594fSAndroid Build Coastguard Worker expectEquals(0, minIntConstantOne(0)); 716*795d594fSAndroid Build Coastguard Worker expectEquals(1, minIntConstantOne(2)); 717*795d594fSAndroid Build Coastguard Worker expectEquals(-2, minIntConstantMinusOne(-2)); 718*795d594fSAndroid Build Coastguard Worker expectEquals(-1, minIntConstantMinusOne(0)); 719*795d594fSAndroid Build Coastguard Worker expectEquals(10L, minL(10L)); 720*795d594fSAndroid Build Coastguard Worker expectEquals(20L, minL(25L)); 721*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, minLongConstantZero(-1L)); 722*795d594fSAndroid Build Coastguard Worker expectEquals(0L, minLongConstantZero(1L)); 723*795d594fSAndroid Build Coastguard Worker expectEquals(0L, minLongConstantOne(0L)); 724*795d594fSAndroid Build Coastguard Worker expectEquals(1L, minLongConstantOne(2L)); 725*795d594fSAndroid Build Coastguard Worker expectEquals(-2L, minLongConstantMinusOne(-2L)); 726*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, minLongConstantMinusOne(0L)); 727*795d594fSAndroid Build Coastguard Worker expectEquals(20, maxI(10)); 728*795d594fSAndroid Build Coastguard Worker expectEquals(25, maxI(25)); 729*795d594fSAndroid Build Coastguard Worker expectEquals(0, maxIntConstantZero(-1)); 730*795d594fSAndroid Build Coastguard Worker expectEquals(1, maxIntConstantZero(1)); 731*795d594fSAndroid Build Coastguard Worker expectEquals(1, maxIntConstantOne(0)); 732*795d594fSAndroid Build Coastguard Worker expectEquals(2, maxIntConstantOne(2)); 733*795d594fSAndroid Build Coastguard Worker expectEquals(-1, maxIntConstantMinusOne(-2)); 734*795d594fSAndroid Build Coastguard Worker expectEquals(0, maxIntConstantMinusOne(0)); 735*795d594fSAndroid Build Coastguard Worker expectEquals(8193, maxIntLargeConstant(8192)); 736*795d594fSAndroid Build Coastguard Worker expectEquals(9000, maxIntLargeConstant(9000)); 737*795d594fSAndroid Build Coastguard Worker expectEquals(20L, maxL(10L)); 738*795d594fSAndroid Build Coastguard Worker expectEquals(25L, maxL(25L)); 739*795d594fSAndroid Build Coastguard Worker expectEquals(0L, maxLongConstantZero(-1L)); 740*795d594fSAndroid Build Coastguard Worker expectEquals(1L, maxLongConstantZero(1L)); 741*795d594fSAndroid Build Coastguard Worker expectEquals(1L, maxLongConstantOne(0L)); 742*795d594fSAndroid Build Coastguard Worker expectEquals(2L, maxLongConstantOne(2L)); 743*795d594fSAndroid Build Coastguard Worker expectEquals(-1L, maxLongConstantMinusOne(-2L)); 744*795d594fSAndroid Build Coastguard Worker expectEquals(0L, maxLongConstantMinusOne(0L)); 745*795d594fSAndroid Build Coastguard Worker expectEquals(8193L, maxLongLargeConstant(8192L)); 746*795d594fSAndroid Build Coastguard Worker expectEquals(9000L, maxLongLargeConstant(9000L)); 747*795d594fSAndroid Build Coastguard Worker // Types. 748*795d594fSAndroid Build Coastguard Worker expectEquals(10, min1(10, 20)); 749*795d594fSAndroid Build Coastguard Worker expectEquals(10, min2(10, 20)); 750*795d594fSAndroid Build Coastguard Worker expectEquals(10, min3(10, 20)); 751*795d594fSAndroid Build Coastguard Worker expectEquals(10, min4(10, 20)); 752*795d594fSAndroid Build Coastguard Worker expectEquals(10, min5((short) 10, (short) 20)); 753*795d594fSAndroid Build Coastguard Worker expectEquals(10, min6((byte) 10, (byte) 20)); 754*795d594fSAndroid Build Coastguard Worker expectEquals(10L, min7(10L, 20L)); 755*795d594fSAndroid Build Coastguard Worker expectEquals(20, max1(10, 20)); 756*795d594fSAndroid Build Coastguard Worker expectEquals(20, max2(10, 20)); 757*795d594fSAndroid Build Coastguard Worker expectEquals(20, max3(10, 20)); 758*795d594fSAndroid Build Coastguard Worker expectEquals(20, max4(10, 20)); 759*795d594fSAndroid Build Coastguard Worker expectEquals(20, max5((short) 10, (short) 20)); 760*795d594fSAndroid Build Coastguard Worker expectEquals(20, max6((byte) 10, (byte) 20)); 761*795d594fSAndroid Build Coastguard Worker expectEquals(20L, max7(10L, 20L)); 762*795d594fSAndroid Build Coastguard Worker // Complications. 763*795d594fSAndroid Build Coastguard Worker int[] a = { 10 }; 764*795d594fSAndroid Build Coastguard Worker int[] b = { 20 }; 765*795d594fSAndroid Build Coastguard Worker expectEquals(10, min0(a, b)); 766*795d594fSAndroid Build Coastguard Worker expectEquals(20, max0(a, b)); 767*795d594fSAndroid Build Coastguard Worker expectEquals(-100, minmax1(-200)); 768*795d594fSAndroid Build Coastguard Worker expectEquals(10, minmax1(10)); 769*795d594fSAndroid Build Coastguard Worker expectEquals(100, minmax1(200)); 770*795d594fSAndroid Build Coastguard Worker expectEquals(-100, minmax2(-200)); 771*795d594fSAndroid Build Coastguard Worker expectEquals(10, minmax2(10)); 772*795d594fSAndroid Build Coastguard Worker expectEquals(100, minmax2(200)); 773*795d594fSAndroid Build Coastguard Worker expectEquals(-100, minmax3(-200)); 774*795d594fSAndroid Build Coastguard Worker expectEquals(10, minmax3(10)); 775*795d594fSAndroid Build Coastguard Worker expectEquals(100, minmax3(200)); 776*795d594fSAndroid Build Coastguard Worker expectEquals(-100, minmax4(-200)); 777*795d594fSAndroid Build Coastguard Worker expectEquals(10, minmax4(10)); 778*795d594fSAndroid Build Coastguard Worker expectEquals(100, minmax4(200)); 779*795d594fSAndroid Build Coastguard Worker expectEquals(90, minmaxCSEScalar(10, 20)); 780*795d594fSAndroid Build Coastguard Worker expectEquals(90, minmaxCSEArray(a, b)); 781*795d594fSAndroid Build Coastguard Worker expectEquals(20, minmaxCSEScalarAndCond(10, 10)); 782*795d594fSAndroid Build Coastguard Worker expectEquals(60, minmaxCSEScalarAndCond(10, 20)); 783*795d594fSAndroid Build Coastguard Worker System.out.println("TestMinMax passed"); 784*795d594fSAndroid Build Coastguard Worker } 785*795d594fSAndroid Build Coastguard Worker expectEquals(int expected, int result)786*795d594fSAndroid Build Coastguard Worker private static void expectEquals(int expected, int result) { 787*795d594fSAndroid Build Coastguard Worker if (expected != result) { 788*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 789*795d594fSAndroid Build Coastguard Worker } 790*795d594fSAndroid Build Coastguard Worker } 791*795d594fSAndroid Build Coastguard Worker expectEquals(long expected, long result)792*795d594fSAndroid Build Coastguard Worker private static void expectEquals(long expected, long result) { 793*795d594fSAndroid Build Coastguard Worker if (expected != result) { 794*795d594fSAndroid Build Coastguard Worker throw new Error("Expected: " + expected + ", found: " + result); 795*795d594fSAndroid Build Coastguard Worker } 796*795d594fSAndroid Build Coastguard Worker } 797*795d594fSAndroid Build Coastguard Worker } 798