1 /* 2 * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 25 package org.graalvm.compiler.jtt.optimize; 26 27 import static org.junit.runners.Parameterized.Parameter; 28 import static org.junit.runners.Parameterized.Parameters; 29 30 import java.lang.reflect.Method; 31 import java.lang.reflect.Modifier; 32 import java.util.ArrayList; 33 import java.util.Collection; 34 import java.util.List; 35 36 import org.graalvm.compiler.jtt.JTTTest; 37 import org.graalvm.compiler.nodes.ValueNode; 38 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderContext; 39 import org.graalvm.compiler.nodes.graphbuilderconf.InlineInvokePlugin; 40 import org.junit.Test; 41 import org.junit.runner.RunWith; 42 import org.junit.runners.Parameterized; 43 44 import jdk.vm.ci.meta.ResolvedJavaMethod; 45 46 @RunWith(Parameterized.class) 47 public class IfNodeCanonicalizationsTest extends JTTTest { 48 49 @Override 50 protected InlineInvokePlugin.InlineInfo bytecodeParserShouldInlineInvoke(GraphBuilderContext b, ResolvedJavaMethod method, ValueNode[] args) { 51 if (method.getDeclaringClass().getUnqualifiedName().equals(IfNodeCanonicalizationsTest.class.getSimpleName()) && method.getName().startsWith("compare")) { 52 return InlineInvokePlugin.InlineInfo.createStandardInlineInfo(method); 53 } 54 return super.bytecodeParserShouldInlineInvoke(b, method, args); 55 } 56 57 @Parameter(value = 0) public String testName; 58 @Parameter(value = 1) public int x; 59 @Parameter(value = 2) public int y; 60 61 public static int compare0(int a, int b) { 62 return (a < b) ? 1 : ((a < b) ? 2 : 3); 63 } 64 65 public static int compare1(int a, int b) { 66 return (a < b) ? ((a < b) ? 1 : 2) : 3; 67 } 68 69 public static int compare2(int a, int b) { 70 return (a < b) ? 1 : ((a > b) ? 2 : 3); 71 } 72 73 public static int compare3(int a, int b) { 74 return (a < b) ? ((a > b) ? 1 : 2) : 3; 75 } 76 77 public static int compare4(int a, int b) { 78 return (a < b) ? 1 : ((a <= b) ? 2 : 3); 79 } 80 81 public static int compare5(int a, int b) { 82 return (a < b) ? ((a <= b) ? 1 : 2) : 3; 83 } 84 85 public static int compare6(int a, int b) { 86 return (a < b) ? 1 : ((a >= b) ? 2 : 3); 87 } 88 89 public static int compare7(int a, int b) { 90 return (a < b) ? ((a >= b) ? 1 : 2) : 3; 91 } 92 93 public static int compare8(int a, int b) { 94 return (a < b) ? 1 : ((a == b) ? 2 : 3); 95 } 96 97 public static int compare9(int a, int b) { 98 return (a < b) ? ((a == b) ? 1 : 2) : 3; 99 } 100 101 public static int compare10(int a, int b) { 102 return (a < b) ? 1 : ((a != b) ? 2 : 3); 103 } 104 105 public static int compare11(int a, int b) { 106 return (a < b) ? ((a != b) ? 1 : 2) : 3; 107 } 108 109 public static int compare12(int a, int b) { 110 return (a > b) ? 1 : ((a < b) ? 2 : 3); 111 } 112 113 public static int compare13(int a, int b) { 114 return (a > b) ? ((a < b) ? 1 : 2) : 3; 115 } 116 117 public static int compare14(int a, int b) { 118 return (a > b) ? 1 : ((a > b) ? 2 : 3); 119 } 120 121 public static int compare15(int a, int b) { 122 return (a > b) ? ((a > b) ? 1 : 2) : 3; 123 } 124 125 public static int compare16(int a, int b) { 126 return (a > b) ? 1 : ((a <= b) ? 2 : 3); 127 } 128 129 public static int compare17(int a, int b) { 130 return (a > b) ? ((a <= b) ? 1 : 2) : 3; 131 } 132 133 public static int compare18(int a, int b) { 134 return (a > b) ? 1 : ((a >= b) ? 2 : 3); 135 } 136 137 public static int compare19(int a, int b) { 138 return (a > b) ? ((a >= b) ? 1 : 2) : 3; 139 } 140 141 public static int compare20(int a, int b) { 142 return (a > b) ? 1 : ((a == b) ? 2 : 3); 143 } 144 145 public static int compare21(int a, int b) { 146 return (a > b) ? ((a == b) ? 1 : 2) : 3; 147 } 148 149 public static int compare22(int a, int b) { 150 return (a > b) ? 1 : ((a != b) ? 2 : 3); 151 } 152 153 public static int compare23(int a, int b) { 154 return (a > b) ? ((a != b) ? 1 : 2) : 3; 155 } 156 157 public static int compare24(int a, int b) { 158 return (a <= b) ? 1 : ((a < b) ? 2 : 3); 159 } 160 161 public static int compare25(int a, int b) { 162 return (a <= b) ? ((a < b) ? 1 : 2) : 3; 163 } 164 165 public static int compare26(int a, int b) { 166 return (a <= b) ? 1 : ((a > b) ? 2 : 3); 167 } 168 169 public static int compare27(int a, int b) { 170 return (a <= b) ? ((a > b) ? 1 : 2) : 3; 171 } 172 173 public static int compare28(int a, int b) { 174 return (a <= b) ? 1 : ((a <= b) ? 2 : 3); 175 } 176 177 public static int compare29(int a, int b) { 178 return (a <= b) ? ((a <= b) ? 1 : 2) : 3; 179 } 180 181 public static int compare30(int a, int b) { 182 return (a <= b) ? 1 : ((a >= b) ? 2 : 3); 183 } 184 185 public static int compare31(int a, int b) { 186 return (a <= b) ? ((a >= b) ? 1 : 2) : 3; 187 } 188 189 public static int compare32(int a, int b) { 190 return (a <= b) ? 1 : ((a == b) ? 2 : 3); 191 } 192 193 public static int compare33(int a, int b) { 194 return (a <= b) ? ((a == b) ? 1 : 2) : 3; 195 } 196 197 public static int compare34(int a, int b) { 198 return (a <= b) ? 1 : ((a != b) ? 2 : 3); 199 } 200 201 public static int compare35(int a, int b) { 202 return (a <= b) ? ((a != b) ? 1 : 2) : 3; 203 } 204 205 public static int compare36(int a, int b) { 206 return (a >= b) ? 1 : ((a < b) ? 2 : 3); 207 } 208 209 public static int compare37(int a, int b) { 210 return (a >= b) ? ((a < b) ? 1 : 2) : 3; 211 } 212 213 public static int compare38(int a, int b) { 214 return (a >= b) ? 1 : ((a > b) ? 2 : 3); 215 } 216 217 public static int compare39(int a, int b) { 218 return (a >= b) ? ((a > b) ? 1 : 2) : 3; 219 } 220 221 public static int compare40(int a, int b) { 222 return (a >= b) ? 1 : ((a <= b) ? 2 : 3); 223 } 224 225 public static int compare41(int a, int b) { 226 return (a >= b) ? ((a <= b) ? 1 : 2) : 3; 227 } 228 229 public static int compare42(int a, int b) { 230 return (a >= b) ? 1 : ((a >= b) ? 2 : 3); 231 } 232 233 public static int compare43(int a, int b) { 234 return (a >= b) ? ((a >= b) ? 1 : 2) : 3; 235 } 236 237 public static int compare44(int a, int b) { 238 return (a >= b) ? 1 : ((a == b) ? 2 : 3); 239 } 240 241 public static int compare45(int a, int b) { 242 return (a >= b) ? ((a == b) ? 1 : 2) : 3; 243 } 244 245 public static int compare46(int a, int b) { 246 return (a >= b) ? 1 : ((a != b) ? 2 : 3); 247 } 248 249 public static int compare47(int a, int b) { 250 return (a >= b) ? ((a != b) ? 1 : 2) : 3; 251 } 252 253 public static int compare48(int a, int b) { 254 return (a == b) ? 1 : ((a < b) ? 2 : 3); 255 } 256 257 public static int compare49(int a, int b) { 258 return (a == b) ? ((a < b) ? 1 : 2) : 3; 259 } 260 261 public static int compare50(int a, int b) { 262 return (a == b) ? 1 : ((a > b) ? 2 : 3); 263 } 264 265 public static int compare51(int a, int b) { 266 return (a == b) ? ((a > b) ? 1 : 2) : 3; 267 } 268 269 public static int compare52(int a, int b) { 270 return (a == b) ? 1 : ((a <= b) ? 2 : 3); 271 } 272 273 public static int compare53(int a, int b) { 274 return (a == b) ? ((a <= b) ? 1 : 2) : 3; 275 } 276 277 public static int compare54(int a, int b) { 278 return (a == b) ? 1 : ((a >= b) ? 2 : 3); 279 } 280 281 public static int compare55(int a, int b) { 282 return (a == b) ? ((a >= b) ? 1 : 2) : 3; 283 } 284 285 public static int compare56(int a, int b) { 286 return (a == b) ? 1 : ((a == b) ? 2 : 3); 287 } 288 289 public static int compare57(int a, int b) { 290 return (a == b) ? ((a == b) ? 1 : 2) : 3; 291 } 292 293 public static int compare58(int a, int b) { 294 return (a == b) ? 1 : ((a != b) ? 2 : 3); 295 } 296 297 public static int compare59(int a, int b) { 298 return (a == b) ? ((a != b) ? 1 : 2) : 3; 299 } 300 301 public static int compare60(int a, int b) { 302 return (a != b) ? 1 : ((a < b) ? 2 : 3); 303 } 304 305 public static int compare61(int a, int b) { 306 return (a != b) ? ((a < b) ? 1 : 2) : 3; 307 } 308 309 public static int compare62(int a, int b) { 310 return (a != b) ? 1 : ((a > b) ? 2 : 3); 311 } 312 313 public static int compare63(int a, int b) { 314 return (a != b) ? ((a > b) ? 1 : 2) : 3; 315 } 316 317 public static int compare64(int a, int b) { 318 return (a != b) ? 1 : ((a <= b) ? 2 : 3); 319 } 320 321 public static int compare65(int a, int b) { 322 return (a != b) ? ((a <= b) ? 1 : 2) : 3; 323 } 324 325 public static int compare66(int a, int b) { 326 return (a != b) ? 1 : ((a >= b) ? 2 : 3); 327 } 328 329 public static int compare67(int a, int b) { 330 return (a != b) ? ((a >= b) ? 1 : 2) : 3; 331 } 332 333 public static int compare68(int a, int b) { 334 return (a != b) ? 1 : ((a == b) ? 2 : 3); 335 } 336 337 public static int compare69(int a, int b) { 338 return (a != b) ? ((a == b) ? 1 : 2) : 3; 339 } 340 341 public static int compare70(int a, int b) { 342 return (a != b) ? 1 : ((a != b) ? 2 : 3); 343 } 344 345 public static int compare71(int a, int b) { 346 return (a != b) ? ((a != b) ? 1 : 2) : 3; 347 } 348 349 @Test 350 public void runNamedTest() { 351 runTest(testName, x, y); 352 } 353 354 @Parameters(name = "{0}(a = {1}, b = {2})") 355 public static Collection<Object[]> data() { 356 List<Object[]> tests = new ArrayList<>(); 357 for (Method m : IfNodeCanonicalizationsTest.class.getDeclaredMethods()) { 358 if (m.getName().startsWith("compare") && Modifier.isStatic(m.getModifiers())) { 359 tests.add(new Object[]{m.getName(), 0, 0}); 360 tests.add(new Object[]{m.getName(), 0, 1}); 361 tests.add(new Object[]{m.getName(), 1, 0}); 362 } 363 } 364 return tests; 365 } 366 }