1 /* 2 * Copyright (c) 2008, 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 * @bug 6689060 27 * @summary Escape Analysis does not work with Compressed Oops 28 * @run main/othervm -Xbatch -XX:CompileCommand=exclude,Test.dummy -XX:+AggressiveOpts Test 29 */ 30 31 import java.lang.reflect.Array; 32 33 class Point { 34 int x; 35 int y; 36 Point next; 37 int ax[]; 38 int ay[]; 39 Point pax[]; 40 Point pay[]; 41 public Point getNext() { 42 return next; 43 } 44 } 45 46 public class Test { 47 48 void dummy() { 49 // Empty method to verify correctness of DebugInfo. 50 // Use -XX:CompileCommand=exclude,Test.dummy 51 } 52 53 int ival(int i) { 54 return i*2; 55 } 56 57 int test80(int y, int l, int i) { 58 Point p = new Point(); 59 p.ax = new int[2]; 60 p.ay = new int[2]; 61 int x = 3; 62 p.ax[0] = x; 63 p.ay[1] = 3 * x + y; 64 dummy(); 65 return p.ax[0] * p.ay[1]; 66 } 67 68 int test81(int y, int l, int i) { 69 Point p = new Point(); 70 p.ax = new int[2]; 71 p.ay = new int[2]; 72 int x = 3; 73 p.ax[0] = x; 74 p.ay[1] = 3 * x + y; 75 dummy(); 76 return p.ax[0] * p.ay[1]; 77 } 78 79 80 int test44(int y) { 81 Point p1 = new Point(); 82 p1.x = ival(3); 83 dummy(); 84 p1.y = 3 * p1.x + y; 85 return p1.y; 86 } 87 88 int test43(int y) { 89 Point p1 = new Point(); 90 if ( (y & 1) == 1 ) { 91 p1.x = ival(3); 92 } else { 93 p1.x = ival(5); 94 } 95 dummy(); 96 p1.y = 3 * p1.x + y; 97 return p1.y; 98 } 99 100 int test42(int y) { 101 Point p1 = new Point(); 102 p1.x = 3; 103 for (int i = 0; i < y; i++) { 104 if ( (i & 1) == 1 ) { 105 p1.x += 4; 106 } 107 } 108 p1.y = 3 * y + p1.x; 109 return p1.y; 110 } 111 112 int test40(int y) { 113 Point p1 = new Point(); 114 if ( (y & 1) == 1 ) { 115 p1.x = 3; 116 } else { 117 p1.x = 5; 118 } 119 p1.y = 3 * p1.x + y; 120 return p1.y; 121 } 122 123 int test41(int y) { 124 Point p1 = new Point(); 125 if ( (y & 1) == 1 ) { 126 p1.x += 4; 127 } else { 128 p1.x += 5; 129 } 130 p1.y = 3 * p1.x + y; 131 return p1.y; 132 } 133 134 Point test00(int y) { 135 int x = 3; 136 Point p = new Point(); 137 p.x = x; 138 p.y = 3 * x + y; 139 return p; 140 } 141 142 Point test01(int y) { 143 int x = 3; 144 Point p = new Point(); 145 p.x = x; 146 p.y = 3 * x + y; 147 dummy(); 148 return p; 149 } 150 151 Point test02(int y) { 152 int x = 3; 153 Point p1 = null; 154 for (int i = 0; i < y; i++) { 155 Point p2 = new Point(); 156 p2.x = x; 157 p2.y = 3 * y + x; 158 p2.next = p1; 159 p1 = p2; 160 } 161 return p1; 162 } 163 164 Point test03(int y) { 165 int x = 3; 166 Point p1 = null; 167 for (int i = 0; i < y; i++) { 168 Point p2 = new Point(); 169 p2.x = x; 170 p2.y = 3 * y + x; 171 p2.next = p1; 172 p1 = p2; 173 } 174 dummy(); 175 return p1; 176 } 177 178 Point test04(int y) { 179 int x = 3; 180 Point p1 = null; 181 for (int i = 0; i < y; i++) { 182 Point p2 = new Point(); 183 p2.x = x; 184 p2.y = 3 * y + x; 185 p2.next = p1; 186 dummy(); 187 p1 = p2; 188 } 189 return p1; 190 } 191 192 int test05(int y) { 193 int x = 3; 194 Point p1 = new Point(); 195 for (int i = 0; i < y; i++) { 196 Point p2 = new Point(); 197 p2.x = x; 198 p2.y = 3 * y + x; 199 p1.next = p2; 200 p1 = p2; 201 } 202 return p1.y; 203 } 204 205 int test0(int y) { 206 int x = 3; 207 Point p = new Point(); 208 p.x = x; 209 p.y = 3 * x + y; 210 dummy(); 211 return p.x * p.y; 212 } 213 214 int test1(int y) { 215 Point p = new Point(); 216 if ( (y & 1) == 1 ) { 217 p = new Point(); // Kill previous 218 } 219 int x = 3; 220 p.x = x; 221 p.y = 3 * x + y; 222 dummy(); 223 return p.x * p.y; 224 } 225 226 int test2(int y) { 227 Point p1 = new Point(); 228 Point p2 = new Point(); 229 p1.x = 3; 230 p2.x = 4; 231 p1.y = 3 * p2.x + y; 232 p2.y = 3 * p1.x + y; 233 dummy(); 234 return p1.y * p2.y; 235 } 236 237 int test3(int y, Point p1) { 238 Point p2 = new Point(); 239 p1.x = 3; 240 p2.x = 4; 241 p1.y = 3 * p2.x + y; 242 p2.y = 3 * p1.x + y; 243 dummy(); 244 return p1.y * p2.y; 245 } 246 247 int test4(int y) { 248 Point p1 = new Point(); 249 Point p2 = new Point(); 250 if ( (y & 1) == 1 ) { 251 p1.x = 3; 252 p2.x = 4; 253 } else { 254 p1.x = 5; 255 p2.x = 6; 256 } 257 p1.y = 3 * p2.x + y; 258 p2.y = 3 * p1.x + y; 259 dummy(); 260 return p1.y * p2.y; 261 } 262 263 int test5(int y, Point p1) { 264 Point p2 = new Point(); 265 if ( (y & 1) == 1 ) { 266 p1.x = 3; 267 p2.x = 4; 268 } else { 269 p1.x = 5; 270 p2.x = 6; 271 } 272 p1.y = 3 * p2.x + y; 273 p2.y = 3 * p1.x + y; 274 dummy(); 275 return p1.y * p2.y; 276 } 277 278 int test6(int y) { 279 Point p1 = new Point(); 280 Point p2 = new Point(); 281 p1.next = p2; 282 if ( (y & 1) == 1 ) { 283 p1.x = 3; 284 p1.getNext().x = 4; 285 } else { 286 p1.x = 5; 287 p1.getNext().x = 6; 288 } 289 p1.y = 3 * p2.x + y; 290 p2.y = 3 * p1.x + y; 291 dummy(); 292 return p1.y * p2.y; 293 } 294 295 int test7(int y, Point p1) { 296 Point p2 = new Point(); 297 p1.next = p2; 298 if ( (y & 1) == 1 ) { 299 p1.x = 3; 300 p1.getNext().x = 4; 301 } else { 302 p1.x = 5; 303 p1.getNext().x = 6; 304 } 305 p1.y = 3 * p2.x + y; 306 p2.y = 3 * p1.x + y; 307 dummy(); 308 return p1.y * p2.y; 309 } 310 311 int test8(int y, int l, int i) { 312 Point p = new Point(); 313 p.ax = new int[l]; 314 p.ay = new int[l]; 315 int x = 3; 316 p.ax[i] = x; 317 p.ay[i] = 3 * x + y; 318 dummy(); 319 return p.ax[i] * p.ay[i]; 320 } 321 322 int test9(int y, int l, int i) { 323 Point p = new Point(); 324 p.pax = new Point[l]; 325 p.pay = new Point[l]; 326 p.pax[i] = new Point(); 327 p.pay[i] = new Point(); 328 p.pax[i].x = 3; 329 p.pay[i].x = 4; 330 p.pax[i].y = 3 * p.pay[i].x + y; 331 p.pay[i].y = 3 * p.pax[i].x + y; 332 dummy(); 333 return p.pax[i].y * p.pay[i].y; 334 } 335 336 int test10(int y, int l, int i, Class cls) { 337 Point p = new Point(); 338 try { 339 p.pax = (Point[])Array.newInstance(cls, l); 340 p.pax[i] = (Point)cls.newInstance(); 341 } 342 catch(java.lang.InstantiationException ex) { 343 return 0; 344 } 345 catch(java.lang.IllegalAccessException ex) { 346 return 0; 347 } 348 p.pax[i].x = 3; 349 p.pax[i].y = 3 * p.pax[i].x + y; 350 dummy(); 351 return p.pax[i].x * p.pax[i].y; 352 } 353 354 int test11(int y) { 355 Point p1 = new Point(); 356 Point p2 = new Point(); 357 p1.next = p2; 358 if ( (y & 1) == 1 ) { 359 p1.x = 3; 360 p1.next.x = 4; 361 } else { 362 p1.x = 5; 363 p1.next.x = 6; 364 } 365 p1.y = 3 * p1.next.x + y; 366 p1.next.y = 3 * p1.x + y; 367 dummy(); 368 return p1.y * p1.next.y; 369 } 370 371 int test12(int y) { 372 Point p1 = new Point(); 373 p1.next = p1; 374 if ( (y & 1) == 1 ) { 375 p1.x = 3; 376 p1.next.x = 4; 377 } else { 378 p1.x = 5; 379 p1.next.x = 6; 380 } 381 p1.y = 3 * p1.next.x + y; 382 p1.next.y = 3 * p1.x + y; 383 dummy(); 384 return p1.y * p1.next.y; 385 } 386 387 388 public static void main(String args[]) { 389 Test tsr = new Test(); 390 Point p = new Point(); 391 Point ptmp = p; 392 Class cls = Point.class; 393 int y = 0; 394 for (int i=0; i<10000; i++) { 395 ptmp.next = tsr.test00(1); 396 ptmp.next = tsr.test01(1); 397 ptmp.next = tsr.test02(1); 398 ptmp.next = tsr.test03(1); 399 ptmp.next = tsr.test04(1); 400 401 y = tsr.test05(1); 402 403 y = tsr.test80(y, 1, 0); 404 y = tsr.test81(y, 1, 0); 405 406 y = tsr.test44(y); 407 y = tsr.test43(y); 408 y = tsr.test42(y); 409 y = tsr.test40(y); 410 y = tsr.test41(y); 411 412 y = tsr.test0(y); 413 y = tsr.test1(y); 414 y = tsr.test2(y); 415 y = tsr.test3(y, p); 416 y = tsr.test4(y); 417 y = tsr.test5(y, p); 418 y = tsr.test6(y); 419 y = tsr.test7(y, p); 420 y = tsr.test8(y, 1, 0); 421 y = tsr.test9(y, 1, 0); 422 y = tsr.test10(y, 1, 0, cls); 423 y = tsr.test11(y); 424 y = tsr.test12(y); 425 } 426 for (int i=0; i<10000; i++) { 427 ptmp.next = tsr.test00(1); 428 ptmp.next = tsr.test01(1); 429 ptmp.next = tsr.test02(1); 430 ptmp.next = tsr.test03(1); 431 ptmp.next = tsr.test04(1); 432 433 y = tsr.test05(1); 434 435 y = tsr.test80(y, 1, 0); 436 y = tsr.test81(y, 1, 0); 437 438 y = tsr.test44(y); 439 y = tsr.test43(y); 440 y = tsr.test42(y); 441 y = tsr.test40(y); 442 y = tsr.test41(y); 443 444 y = tsr.test0(y); 445 y = tsr.test1(y); 446 y = tsr.test2(y); 447 y = tsr.test3(y, p); 448 y = tsr.test4(y); 449 y = tsr.test5(y, p); 450 y = tsr.test6(y); 451 y = tsr.test7(y, p); 452 y = tsr.test8(y, 1, 0); 453 y = tsr.test9(y, 1, 0); 454 y = tsr.test10(y, 1, 0, cls); 455 y = tsr.test11(y); 456 y = tsr.test12(y); 457 } 458 for (int i=0; i<10000; i++) { 459 ptmp.next = tsr.test00(1); 460 ptmp.next = tsr.test01(1); 461 ptmp.next = tsr.test02(1); 462 ptmp.next = tsr.test03(1); 463 ptmp.next = tsr.test04(1); 464 465 y = tsr.test05(1); 466 467 y = tsr.test80(y, 1, 0); 468 y = tsr.test81(y, 1, 0); 469 470 y = tsr.test44(y); 471 y = tsr.test43(y); 472 y = tsr.test42(y); 473 y = tsr.test40(y); 474 y = tsr.test41(y); 475 476 y = tsr.test0(y); 477 y = tsr.test1(y); 478 y = tsr.test2(y); 479 y = tsr.test3(y, p); 480 y = tsr.test4(y); 481 y = tsr.test5(y, p); 482 y = tsr.test6(y); 483 y = tsr.test7(y, p); 484 y = tsr.test8(y, 1, 0); 485 y = tsr.test9(y, 1, 0); 486 y = tsr.test10(y, 1, 0, cls); 487 y = tsr.test11(y); 488 y = tsr.test12(y); 489 } 490 491 int z = 0; 492 y = tsr.test80(0, 1, 0); 493 z += y; 494 System.out.println("After 'test80' y=" + y); 495 y = tsr.test81(0, 1, 0); 496 z += y; 497 System.out.println("After 'test81' y=" + y); 498 499 y = tsr.test44(0); 500 z += y; 501 System.out.println("After 'test44' y=" + y); 502 y = tsr.test43(0); 503 z += y; 504 System.out.println("After 'test43' y=" + y); 505 y = tsr.test42(0); 506 z += y; 507 System.out.println("After 'test42' y=" + y); 508 y = tsr.test40(0); 509 z += y; 510 System.out.println("After 'test40' y=" + y); 511 y = tsr.test41(0); 512 z += y; 513 System.out.println("After 'test41' y=" + y); 514 515 ptmp.next = tsr.test00(1); 516 z += y; 517 System.out.println("After 'test00' p.y=" + ptmp.next.y); 518 ptmp.next = tsr.test01(1); 519 z += y; 520 System.out.println("After 'test01' p.y=" + ptmp.next.y); 521 ptmp.next = tsr.test02(1); 522 z += y; 523 System.out.println("After 'test02' p.y=" + ptmp.next.y); 524 ptmp.next = tsr.test03(1); 525 z += y; 526 System.out.println("After 'test03' p.y=" + ptmp.next.y); 527 ptmp.next = tsr.test04(1); 528 z += y; 529 System.out.println("After 'test04' p.y=" + ptmp.next.y); 530 531 y = tsr.test05(1); 532 z += y; 533 System.out.println("After 'test05' y=" + y); 534 535 y = tsr.test0(0); 536 z += y; 537 System.out.println("After 'test0' y=" + y); 538 y = tsr.test1(0); 539 z += y; 540 System.out.println("After 'test1' y=" + y); 541 y = tsr.test2(0); 542 z += y; 543 System.out.println("After 'test2' y=" + y); 544 y = tsr.test3(0, new Point()); 545 z += y; 546 System.out.println("After 'test3' y=" + y); 547 y = tsr.test4(0); 548 z += y; 549 System.out.println("After 'test4' y=" + y); 550 y = tsr.test5(0, new Point()); 551 z += y; 552 System.out.println("After 'test5' y=" + y); 553 y = tsr.test6(0); 554 z += y; 555 System.out.println("After 'test6' y=" + y); 556 y = tsr.test7(0, new Point()); 557 z += y; 558 System.out.println("After 'test7' y=" + y); 559 y = tsr.test8(0, 1, 0); 560 z += y; 561 System.out.println("After 'test8' y=" + y); 562 y = tsr.test9(0, 1, 0); 563 z += y; 564 System.out.println("After 'test9' y=" + y); 565 y = tsr.test10(0, 1, 0, cls); 566 z += y; 567 System.out.println("After 'test10' y=" + y); 568 y = tsr.test11(0); 569 z += y; 570 System.out.println("After 'test11' y=" + y); 571 y = tsr.test12(0); 572 z += y; 573 System.out.println("After 'test12' y=" + y); 574 System.out.println("Sum of y =" + z); 575 } 576 }