1 /* 2 * Copyright (c) 2008, 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 * @test 26 * 27 * @summary converted from VM Testbase jit/inline/inline007. 28 * VM Testbase keywords: [jit, quick] 29 * VM Testbase readme: 30 * Inline007 is similar to inline004 in that it tests inlining. 31 * Inline004 still functions, but is not testing inlining, in 32 * JDK 1.2e. 33 * 34 * @library /vmTestbase 35 * /test/lib 36 * @run driver jdk.test.lib.FileInstaller . . 37 * @build jit.inline.inline007.inline007 38 * @run driver ExecDriver --java jit.inline.inline007.inline007 39 */ 40 41 package jit.inline.inline007; 42 43 44 import java.io.ByteArrayOutputStream; 45 import java.io.IOException; 46 47 import nsk.share.TestFailure; 48 import nsk.share.GoldChecker; 49 50 class inline007_1 { 51 final protected static int[] inlineObj = { 1, 2 }; 52 protected static int inlineInt = 3; /* Not final */ 53 } 54 55 class inline007Sup extends inline007_1 { 56 private int i1 = 0; 57 Object obj1 = inline007_1.inlineObj; 58 Object obj2 = inline007_1.inlineObj; 59 Object obj3 = inline007_1.inlineObj; 60 61 static int MPAT_Const4_fs_0() { 62 return 1; 63 } 64 static Object MPAT_Const4_fs_1() { 65 return null; 66 } 67 static int MPAT_GetStatic4_fs_0() { 68 return inlineInt; 69 } 70 static Object MPAT_GetStatic4_fs_1() { 71 return inlineObj; 72 } 73 int MPAT_Const4_fi_0() { 74 return 1; 75 } 76 Object MPAT_Const4_fi_1() { 77 return null; 78 } 79 int MPAT_GetField4_fi_0() { 80 return i1; 81 } 82 Object MPAT_GetField4_fi_1() { 83 return obj1; 84 } 85 void MPAT_PutField4_fi_0(int ival) { 86 i1 = ival; 87 return; 88 } 89 void MPAT_PutField4_fi_1(Object oval) { 90 obj1 = oval; 91 return; 92 } 93 void MPAT_PutField4Const4_fi() { 94 i1 = -1; 95 return; 96 } 97 int MPAT_GetStatic4_fi_0() { 98 return inlineInt; 99 } 100 Object MPAT_GetStatic4_fi_1() { 101 return inlineObj; 102 } 103 Object MPAT_Handle_fi() { 104 return this; 105 } 106 } 107 108 class inline007Sub extends inline007Sup { 109 private int i1 = 0; 110 Object obj1 = inline007_1.inlineObj; 111 Object obj2 = inline007_1.inlineObj; 112 Object obj3 = inline007_1.inlineObj; 113 114 static int MPAT_Const4_fs_0() { 115 return 1; 116 } 117 static Object MPAT_Const4_fs_1() { 118 return null; 119 } 120 static int MPAT_GetStatic4_fs_0() { 121 return inlineInt; 122 } 123 static Object MPAT_GetStatic4_fs_1() { 124 return inlineObj; 125 } 126 int MPAT_Const4_fi_0() { 127 return 1; 128 } 129 Object MPAT_Const4_fi_1() { 130 return null; 131 } 132 int MPAT_GetField4_fi_0() { 133 return i1; 134 } 135 Object MPAT_GetField4_fi_1() { 136 return obj1; 137 } 138 void MPAT_PutField4_fi_0(int ival) { 139 i1 = ival; 140 return; 141 } 142 void MPAT_PutField4_fi_1(Object oval) { 143 obj1 = oval; 144 return; 145 } 146 void MPAT_PutField4Const4_fi() { 147 i1 = -1; 148 return; 149 } 150 int MPAT_GetStatic4_fi_0() { 151 return inlineInt; 152 } 153 Object MPAT_GetStatic4_fi_1() { 154 return inlineObj; 155 } 156 Object MPAT_Handle_fi() { 157 return this; 158 } 159 } 160 161 class inline007 extends inline007_1 { 162 public static final GoldChecker goldChecker = new GoldChecker( "inline007" ); 163 164 static int[] myIters = new int[14]; 165 static int[] errFlag = new int[14]; 166 static int pFlag = 0; 167 final static int ITERS=5; 168 int intTarg1 = 0; 169 int intTarg2 = 0; 170 Object objTarg1 = null; 171 Object objTarg2 = null; 172 inline007Sub inline007sub = new inline007Sub(); 173 inline007Sup inline007sup = inline007sub; 174 175 private void runFinals () { 176 int jcount = 0; 177 int icount = 0; 178 179 if (pFlag==2) inline007.goldChecker.print("MPAT_Const4_fs_0"); 180 try { 181 for (jcount=0; jcount<ITERS; jcount++) { 182 intTarg1 = inline007Sub.MPAT_Const4_fs_0(); 183 intTarg2 = inline007Sup.MPAT_Const4_fs_0(); 184 if (intTarg1 != intTarg2) errFlag[icount]++; 185 } 186 } catch (Exception e) { 187 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 188 } finally { 189 myIters[icount] = jcount; 190 if (jcount != ITERS) errFlag[icount]++; 191 if (pFlag==2) inline007.goldChecker.println(); 192 } 193 icount++; 194 195 if (pFlag==2) inline007.goldChecker.print("MPAT_Const4_fs_1"); 196 try { 197 for (jcount=0; jcount<ITERS; jcount++) { 198 objTarg2 = inline007Sub.MPAT_Const4_fs_1(); 199 objTarg1 = inline007Sup.MPAT_Const4_fs_1(); 200 if (objTarg2 != objTarg1) errFlag[icount]++; 201 } 202 } catch (Exception e) { 203 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 204 } finally { 205 myIters[icount] = jcount; 206 if (jcount != ITERS) errFlag[icount]++; 207 if (pFlag==2) inline007.goldChecker.println(); 208 } 209 icount++; 210 211 212 if (pFlag==2) inline007.goldChecker.print("MPAT_GetStatic4_fs_0"); 213 try { 214 for (jcount=0; jcount<ITERS; jcount++) { 215 intTarg2 = inline007Sub.MPAT_GetStatic4_fs_0(); 216 intTarg1 = inline007Sup.MPAT_GetStatic4_fs_0(); 217 if (intTarg1 != intTarg2) errFlag[icount]++; 218 } 219 } catch (Exception e) { 220 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 221 } finally { 222 myIters[icount] = jcount; 223 if (jcount != ITERS) errFlag[icount]++; 224 if (pFlag==2) inline007.goldChecker.println(); 225 } 226 icount++; 227 228 229 if (pFlag==2) inline007.goldChecker.print("MPAT_GetStatic4_fs_1"); 230 try { 231 for (jcount=0; jcount<ITERS; jcount++) { 232 objTarg2 = inline007Sub.MPAT_GetStatic4_fs_1(); 233 objTarg1 = inline007Sup.MPAT_GetStatic4_fs_1(); 234 if (objTarg1 != objTarg2) errFlag[icount]++; 235 } 236 } catch (Exception e) { 237 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 238 } finally { 239 myIters[icount] = jcount; 240 if (jcount != ITERS) errFlag[icount]++; 241 if (pFlag==2) inline007.goldChecker.println(); 242 } 243 icount++; 244 245 246 /* Check inlining of instance methods */ 247 if (pFlag==2) inline007.goldChecker.print("MPAT_Const4_fi_0"); 248 try { 249 for (jcount=0; jcount<ITERS; jcount++) { 250 intTarg1 = inline007sub.MPAT_Const4_fi_0(); 251 intTarg2 = inline007sup.MPAT_Const4_fi_0(); 252 if (intTarg1 != intTarg2) errFlag[icount]++; 253 } 254 } catch (Exception e) { 255 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 256 } finally { 257 myIters[icount] = jcount; 258 if (jcount != ITERS) errFlag[icount]++; 259 if (pFlag==2) inline007.goldChecker.println(); 260 } 261 icount++; 262 263 if (pFlag==2) inline007.goldChecker.print("MPAT_Const4_fi_1"); 264 try { 265 for (jcount=0; jcount<ITERS; jcount++) { 266 objTarg1 = inline007sub.MPAT_Const4_fi_1(); 267 objTarg2 = inline007sup.MPAT_Const4_fi_1(); 268 if (objTarg1 != objTarg2) errFlag[icount]++; 269 } 270 } catch (Exception e) { 271 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 272 } finally { 273 myIters[icount] = jcount; 274 if (jcount != ITERS) errFlag[icount]++; 275 if (pFlag==2) inline007.goldChecker.println(); 276 } 277 icount++; 278 279 if (pFlag==2) inline007.goldChecker.print("MPAT_GetStatic4_fi_0"); 280 try { 281 for (jcount=0; jcount<ITERS; jcount++) { 282 intTarg2 = inline007sub.MPAT_GetStatic4_fi_0(); 283 intTarg1 = inline007sup.MPAT_GetStatic4_fi_0(); 284 if (intTarg1 != intTarg2) errFlag[icount]++; 285 } 286 } catch (Exception e) { 287 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 288 } finally { 289 myIters[icount] = jcount; 290 if (jcount != ITERS) errFlag[icount]++; 291 if (pFlag==2) inline007.goldChecker.println(); 292 } 293 if (pFlag==2) inline007.goldChecker.print("MPAT_GetStatic4_fi_1"); 294 try { 295 for (jcount=0; jcount<ITERS; jcount++) { 296 objTarg2 = inline007sub.MPAT_GetStatic4_fi_1(); 297 objTarg1 = inline007sup.MPAT_GetStatic4_fi_1(); 298 if (objTarg1 != objTarg2) errFlag[icount]++; 299 } 300 } catch (Exception e) { 301 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 302 } finally { 303 myIters[icount] = jcount; 304 if (jcount != ITERS) errFlag[icount]++; 305 if (pFlag==2) inline007.goldChecker.println(); 306 } 307 icount++; 308 309 if (pFlag==2) inline007.goldChecker.print("MPAT_GetField4_fi_0"); 310 try { 311 for (jcount=0; jcount<ITERS; jcount++) { 312 intTarg1 = inline007sub.MPAT_GetField4_fi_0(); 313 intTarg2 = inline007sup.MPAT_GetField4_fi_0(); 314 if (intTarg1 != intTarg2) errFlag[icount]++; 315 } 316 } catch (Exception e) { 317 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 318 } finally { 319 myIters[icount] = jcount; 320 if (jcount != ITERS) errFlag[icount]++; 321 if (pFlag==2) inline007.goldChecker.println(); 322 } 323 icount++; 324 325 if (pFlag==2) inline007.goldChecker.print("MPAT_GetField4_fi_1"); 326 try { 327 for (jcount=0; jcount<ITERS; jcount++) { 328 objTarg2 = inline007sub.MPAT_GetField4_fi_1(); 329 objTarg1 = inline007sup.MPAT_GetField4_fi_1(); 330 if (objTarg1 != objTarg2) errFlag[icount]++; 331 } 332 } catch (Exception e) { 333 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 334 } finally { 335 myIters[icount] = jcount; 336 if (jcount != ITERS) errFlag[icount]++; 337 if (pFlag==2) inline007.goldChecker.println(); 338 } 339 icount++; 340 341 if (pFlag==2) inline007.goldChecker.print("MPAT_PutField4_fi_0"); 342 try { 343 for (jcount=0; jcount<ITERS; jcount++) { 344 inline007sub.MPAT_PutField4_fi_0(10); 345 intTarg1 = inline007sup.MPAT_GetField4_fi_0(); 346 if (intTarg1 != 10) errFlag[icount]++; 347 } 348 } catch (Exception e) { 349 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 350 } finally { 351 myIters[icount] = jcount; 352 if (jcount != ITERS) errFlag[icount]++; 353 if (pFlag==2) inline007.goldChecker.println(); 354 } 355 icount++; 356 357 if (pFlag==2) inline007.goldChecker.print("MPAT_PutField4_fi_1"); 358 try { 359 for (jcount=0; jcount<ITERS; jcount++) { 360 inline007sub.MPAT_PutField4_fi_1("String1"); 361 objTarg1 = inline007sub.MPAT_GetField4_fi_1(); 362 if (objTarg1 != "String1") errFlag[icount]++; 363 } 364 } catch (Exception e) { 365 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 366 } finally { 367 myIters[icount] = jcount; 368 if (jcount != ITERS) errFlag[icount]++; 369 if (pFlag==2) inline007.goldChecker.println(); 370 } 371 icount++; 372 373 if (pFlag==2) inline007.goldChecker.print("MPAT_PutField4Const4_fi"); 374 try { 375 for (jcount=0; jcount<ITERS; jcount++) { 376 inline007sub.MPAT_PutField4Const4_fi(); 377 intTarg2 = inline007sup.MPAT_GetField4_fi_0(); 378 if (intTarg2 != -1) errFlag[icount]++; 379 } 380 } catch (Exception e) { 381 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 382 } finally { 383 myIters[icount] = jcount; 384 if (pFlag==2) inline007.goldChecker.println(); 385 } 386 icount++; 387 388 if (pFlag==2) inline007.goldChecker.print("MPAT_Handle_fi"); 389 try { 390 for (jcount=0; jcount<ITERS; jcount++) { 391 objTarg1 = inline007sub.MPAT_Handle_fi(); 392 objTarg2 = inline007sup.MPAT_Handle_fi(); 393 } 394 } catch (Exception e) { 395 if (pFlag==2) inline007.goldChecker.print(": iteration="+(jcount+1)+": "+e); 396 } finally { 397 myIters[icount] = jcount; 398 if (jcount != ITERS) errFlag[icount]++; 399 if (pFlag==2) inline007.goldChecker.println(); 400 } 401 icount++; 402 } 403 404 405 public static int result() { 406 int ierr = 0; 407 String state = null; 408 ByteArrayOutputStream baos = new ByteArrayOutputStream(80); 409 byte[] ba = new byte[80]; 410 String s = null; 411 412 String[] label = new String[14]; 413 label[0] = new String("Const4 class method (int) "); 414 label[1] = new String("Const4 class method (ref) "); 415 label[2] = new String("GetStatic4 class method (int) "); 416 label[3] = new String("GetStatic4 class method (ref) "); 417 label[4] = new String("Const4 instance method (int) "); 418 label[5] = new String("Const4 instance method (ref) "); 419 label[6] = new String("GetStatic4 instance method (int)"); 420 label[7] = new String("GetStatic4 instance method (ref)"); 421 label[8] = new String("GetField4 instance method (int) "); 422 label[9] = new String("GetField4 instance method (ref) "); 423 label[10] = new String("PutField4 instance method (int) "); 424 label[11] = new String("PutField4 instance method (ref) "); 425 label[12] = new String("PutField4Const4 instance method "); 426 label[13] = new String("Handle instance method "); 427 // Report headers 428 baos.reset(); 429 try { 430 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 431 s = "Pattern"; 432 for (int i=0; i<s.length(); i++) 433 ba[i]=(byte)s.charAt(i); 434 baos.write(ba,0,32); 435 } 436 catch (IndexOutOfBoundsException e){ 437 } 438 try { 439 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 440 baos.write(ba,0,3); 441 s = "Errors"; 442 for (int i=0; i<s.length(); i++) 443 ba[i]=(byte)s.charAt(i); 444 baos.write(ba,0,6); 445 } 446 catch (IndexOutOfBoundsException e){ 447 } 448 try { 449 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 450 baos.write(ba,0,3); 451 s = "Iterations"; 452 for (int i=0; i<s.length(); i++) 453 ba[i]=(byte)s.charAt(i); 454 baos.write(ba,0,10); 455 } 456 catch (IndexOutOfBoundsException e){ 457 } 458 try { 459 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 460 baos.write(ba,0,3); 461 s = "State"; 462 for (int i=0; i<s.length(); i++) 463 ba[i]=(byte)s.charAt(i); 464 baos.write(ba,0,5); 465 } 466 catch (IndexOutOfBoundsException e){ 467 } 468 inline007.goldChecker.print(baos.toString()); 469 inline007.goldChecker.println(); 470 471 // Report header underlining 472 baos.reset(); 473 try { 474 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 475 s = "Pattern"; 476 for (int i=0; i<s.length(); i++) 477 ba[i]=(byte)'='; 478 baos.write(ba,0,32); 479 } 480 catch (IndexOutOfBoundsException e){ 481 } 482 try { 483 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 484 baos.write(ba,0,3); 485 s = "Errors"; 486 for (int i=0; i<s.length(); i++) 487 ba[i]=(byte)'='; 488 baos.write(ba,0,6); 489 } 490 catch (IndexOutOfBoundsException e){ 491 } 492 try { 493 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 494 baos.write(ba,0,3); 495 s = "Iterations"; 496 for (int i=0; i<s.length(); i++) 497 ba[i]=(byte)'='; 498 baos.write(ba,0,10); 499 } 500 catch (IndexOutOfBoundsException e){ 501 } 502 try { 503 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 504 baos.write(ba,0,3); 505 s = "State"; 506 for (int i=0; i<s.length(); i++) 507 ba[i]=(byte)'='; 508 baos.write(ba,0,5); 509 } 510 catch (IndexOutOfBoundsException e){ 511 } 512 inline007.goldChecker.print(baos.toString()); 513 inline007.goldChecker.println(); 514 515 for (int icount=0; icount<14; icount++) { 516 if (myIters[icount] == ITERS && errFlag[icount] == 0) 517 state="PASS"; 518 else { 519 ierr++; 520 state="FAIL"; 521 } 522 baos.reset(); 523 try { 524 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 525 for (int i=0; i<label[icount].length(); i++) 526 ba[i]=(byte)label[icount].charAt(i); 527 baos.write(ba,0,32); 528 } 529 catch (IndexOutOfBoundsException e){ 530 inline007.goldChecker.println("0: "+e); 531 } 532 try { 533 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 534 baos.write(ba,0,3); 535 s = Integer.toString(errFlag[icount]); 536 for (int i=0; i<s.length(); i++) 537 ba[i]=(byte)s.charAt(i); 538 baos.write(ba,0,6); 539 } 540 catch (IndexOutOfBoundsException e){ 541 inline007.goldChecker.println("1: "+e); 542 } 543 try { 544 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 545 baos.write(ba,0,3); 546 s = Integer.toString(myIters[icount]); 547 for (int i=0; i<s.length(); i++) 548 ba[i]=(byte)s.charAt(i); 549 baos.write(ba,0,10); 550 } 551 catch (IndexOutOfBoundsException e){ 552 inline007.goldChecker.println("1: "+e); 553 } 554 try { 555 for (int i=0; i<ba.length; i++) ba[i]=(byte)' '; 556 baos.write(ba,0,3); 557 for (int i=0; i<state.length(); i++) 558 ba[i]=(byte)state.charAt(i); 559 baos.write(ba,0,5); 560 } 561 catch (IndexOutOfBoundsException e){ 562 inline007.goldChecker.println("3: "+e); 563 } 564 inline007.goldChecker.print(baos.toString()); 565 inline007.goldChecker.println(); 566 } 567 return ierr; 568 } 569 570 public static void main( String args[] ) { 571 int ierr; 572 inline007 myInline_n = new inline007(); 573 inline007 myInline_f = new inline007(); 574 575 if (args.length > 0 && args[0].equals("-help")) { 576 inline007.goldChecker.println("usage: java inline007 [-print | -report]"); 577 inline007.goldChecker.check(); 578 return; 579 } 580 if (args.length > 0 && args[0].equals("-print")) 581 pFlag = 2; 582 if (args.length > 0 && args[0].equals("-report")) 583 pFlag = 1; 584 for (int ii=0; ii<14; ii++) myIters[ii]=ITERS; 585 if (pFlag==2) inline007.goldChecker.println("inline007"); 586 587 /* Give the JIT an initial look at all the methods */ 588 myInline_f.runFinals(); 589 ierr = inline007.result(); 590 if (ierr == 0) { 591 inline007.goldChecker.println("PASSED."); 592 } 593 else { 594 inline007.goldChecker.println("FAILED. (ierr = " + ierr + ")"); 595 } 596 inline007.goldChecker.check(); 597 } 598 }