370 // Nothing to do here. 371 } 372 373 JVMState* LibraryIntrinsic::generate(JVMState* jvms) { 374 LibraryCallKit kit(jvms, this); 375 Compile* C = kit.C; 376 int nodes = C->unique(); 377 #ifndef PRODUCT 378 if ((C->print_intrinsics() || C->print_inlining()) && Verbose) { 379 char buf[1000]; 380 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); 381 tty->print_cr("Intrinsic %s", str); 382 } 383 #endif 384 ciMethod* callee = kit.callee(); 385 const int bci = kit.bci(); 386 387 // Try to inline the intrinsic. 388 if ((CheckIntrinsics ? callee->intrinsic_candidate() : true) && 389 kit.try_to_inline(_last_predicate)) { 390 if (C->print_intrinsics() || C->print_inlining()) { 391 C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)"); 392 } 393 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked); 394 if (C->log()) { 395 C->log()->elem("intrinsic id='%s'%s nodes='%d'", 396 vmIntrinsics::name_at(intrinsic_id()), 397 (is_virtual() ? " virtual='1'" : ""), 398 C->unique() - nodes); 399 } 400 // Push the result from the inlined method onto the stack. 401 kit.push_result(); 402 C->print_inlining_update(this); 403 return kit.transfer_exceptions_into_jvms(); 404 } 405 406 // The intrinsic bailed out 407 if (C->print_intrinsics() || C->print_inlining()) { 408 if (jvms->has_method()) { 409 // Not a root compile. 410 const char* msg; 411 if (callee->intrinsic_candidate()) { 412 msg = is_virtual() ? "failed to inline (intrinsic, virtual)" : "failed to inline (intrinsic)"; 413 } else { 414 msg = is_virtual() ? "failed to inline (intrinsic, virtual), method not annotated" 415 : "failed to inline (intrinsic), method not annotated"; 416 } 417 C->print_inlining(callee, jvms->depth() - 1, bci, msg); 418 } else { 419 // Root compile 420 tty->print("Did not generate intrinsic %s%s at bci:%d in", 421 vmIntrinsics::name_at(intrinsic_id()), 422 (is_virtual() ? " (virtual)" : ""), bci); 423 } 424 } 425 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed); 426 C->print_inlining_update(this); 427 return NULL; 428 } 429 430 Node* LibraryIntrinsic::generate_predicate(JVMState* jvms, int predicate) { 431 LibraryCallKit kit(jvms, this); 432 Compile* C = kit.C; 433 int nodes = C->unique(); 434 _last_predicate = predicate; 435 #ifndef PRODUCT 436 assert(is_predicated() && predicate < predicates_count(), "sanity"); 437 if ((C->print_intrinsics() || C->print_inlining()) && Verbose) { 438 char buf[1000]; 439 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); 440 tty->print_cr("Predicate for intrinsic %s", str); 441 } 442 #endif 443 ciMethod* callee = kit.callee(); 444 const int bci = kit.bci(); 445 446 Node* slow_ctl = kit.try_to_predicate(predicate); 447 if (!kit.failing()) { 448 if (C->print_intrinsics() || C->print_inlining()) { 449 C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual, predicate)" : "(intrinsic, predicate)"); 450 } 451 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked); 452 if (C->log()) { 453 C->log()->elem("predicate_intrinsic id='%s'%s nodes='%d'", 454 vmIntrinsics::name_at(intrinsic_id()), 455 (is_virtual() ? " virtual='1'" : ""), 456 C->unique() - nodes); 457 } 458 return slow_ctl; // Could be NULL if the check folds. 459 } 460 461 // The intrinsic bailed out 462 if (C->print_intrinsics() || C->print_inlining()) { 463 if (jvms->has_method()) { 464 // Not a root compile. 465 const char* msg = "failed to generate predicate for intrinsic"; 466 C->print_inlining(kit.callee(), jvms->depth() - 1, bci, msg); 467 } else { 468 // Root compile 469 C->print_inlining_stream()->print("Did not generate predicate for intrinsic %s%s at bci:%d in", 470 vmIntrinsics::name_at(intrinsic_id()), 471 (is_virtual() ? " (virtual)" : ""), bci); 472 } 473 } 474 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed); 475 return NULL; 476 } 477 478 bool LibraryCallKit::try_to_inline(int predicate) { 479 // Handle symbolic names for otherwise undistinguished boolean switches: 480 const bool is_store = true; 481 const bool is_compress = true; 482 const bool is_static = true; 483 const bool is_volatile = true; 484 485 if (!jvms()->has_method()) { 486 // Root JVMState has a null method. 487 assert(map()->memory()->Opcode() == Op_Parm, ""); 488 // Insert the memory aliasing node 489 set_all_memory(reset_memory()); 490 } 491 assert(merged_memory(), ""); | 370 // Nothing to do here. 371 } 372 373 JVMState* LibraryIntrinsic::generate(JVMState* jvms) { 374 LibraryCallKit kit(jvms, this); 375 Compile* C = kit.C; 376 int nodes = C->unique(); 377 #ifndef PRODUCT 378 if ((C->print_intrinsics() || C->print_inlining()) && Verbose) { 379 char buf[1000]; 380 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); 381 tty->print_cr("Intrinsic %s", str); 382 } 383 #endif 384 ciMethod* callee = kit.callee(); 385 const int bci = kit.bci(); 386 387 // Try to inline the intrinsic. 388 if ((CheckIntrinsics ? callee->intrinsic_candidate() : true) && 389 kit.try_to_inline(_last_predicate)) { 390 const char *inline_msg = is_virtual() ? "(intrinsic, virtual)" 391 : "(intrinsic)"; 392 CompileTask::print_inlining_ul(callee, jvms->depth() - 1, bci, inline_msg); 393 if (C->print_intrinsics() || C->print_inlining()) { 394 C->print_inlining(callee, jvms->depth() - 1, bci, inline_msg); 395 } 396 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked); 397 if (C->log()) { 398 C->log()->elem("intrinsic id='%s'%s nodes='%d'", 399 vmIntrinsics::name_at(intrinsic_id()), 400 (is_virtual() ? " virtual='1'" : ""), 401 C->unique() - nodes); 402 } 403 // Push the result from the inlined method onto the stack. 404 kit.push_result(); 405 C->print_inlining_update(this); 406 return kit.transfer_exceptions_into_jvms(); 407 } 408 409 // The intrinsic bailed out 410 if (jvms->has_method()) { 411 // Not a root compile. 412 const char* msg; 413 if (callee->intrinsic_candidate()) { 414 msg = is_virtual() ? "failed to inline (intrinsic, virtual)" : "failed to inline (intrinsic)"; 415 } else { 416 msg = is_virtual() ? "failed to inline (intrinsic, virtual), method not annotated" 417 : "failed to inline (intrinsic), method not annotated"; 418 } 419 CompileTask::print_inlining_ul(callee, jvms->depth() - 1, bci, msg); 420 if (C->print_intrinsics() || C->print_inlining()) { 421 C->print_inlining(callee, jvms->depth() - 1, bci, msg); 422 } 423 } else { 424 // Root compile 425 ResourceMark rm; 426 stringStream msg_stream; 427 msg_stream.print("Did not generate intrinsic %s%s at bci:%d in", 428 vmIntrinsics::name_at(intrinsic_id()), 429 is_virtual() ? " (virtual)" : "", bci); 430 const char *msg = msg_stream.as_string(); 431 log_debug(jit, inlining)("%s", msg); 432 if (C->print_intrinsics() || C->print_inlining()) { 433 tty->print("%s", msg); 434 } 435 } 436 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed); 437 C->print_inlining_update(this); 438 return NULL; 439 } 440 441 Node* LibraryIntrinsic::generate_predicate(JVMState* jvms, int predicate) { 442 LibraryCallKit kit(jvms, this); 443 Compile* C = kit.C; 444 int nodes = C->unique(); 445 _last_predicate = predicate; 446 #ifndef PRODUCT 447 assert(is_predicated() && predicate < predicates_count(), "sanity"); 448 if ((C->print_intrinsics() || C->print_inlining()) && Verbose) { 449 char buf[1000]; 450 const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf)); 451 tty->print_cr("Predicate for intrinsic %s", str); 452 } 453 #endif 454 ciMethod* callee = kit.callee(); 455 const int bci = kit.bci(); 456 457 Node* slow_ctl = kit.try_to_predicate(predicate); 458 if (!kit.failing()) { 459 const char *inline_msg = is_virtual() ? "(intrinsic, virtual, predicate)" 460 : "(intrinsic, predicate)"; 461 CompileTask::print_inlining_ul(callee, jvms->depth() - 1, bci, inline_msg); 462 if (C->print_intrinsics() || C->print_inlining()) { 463 C->print_inlining(callee, jvms->depth() - 1, bci, inline_msg); 464 } 465 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked); 466 if (C->log()) { 467 C->log()->elem("predicate_intrinsic id='%s'%s nodes='%d'", 468 vmIntrinsics::name_at(intrinsic_id()), 469 (is_virtual() ? " virtual='1'" : ""), 470 C->unique() - nodes); 471 } 472 return slow_ctl; // Could be NULL if the check folds. 473 } 474 475 // The intrinsic bailed out 476 if (jvms->has_method()) { 477 // Not a root compile. 478 const char* msg = "failed to generate predicate for intrinsic"; 479 CompileTask::print_inlining_ul(kit.callee(), jvms->depth() - 1, bci, msg); 480 if (C->print_intrinsics() || C->print_inlining()) { 481 C->print_inlining(kit.callee(), jvms->depth() - 1, bci, msg); 482 } 483 } else { 484 // Root compile 485 ResourceMark rm; 486 stringStream msg_stream; 487 msg_stream.print("Did not generate intrinsic %s%s at bci:%d in", 488 vmIntrinsics::name_at(intrinsic_id()), 489 is_virtual() ? " (virtual)" : "", bci); 490 const char *msg = msg_stream.as_string(); 491 log_debug(jit, inlining)("%s", msg); 492 if (C->print_intrinsics() || C->print_inlining()) { 493 C->print_inlining_stream()->print("%s", msg); 494 } 495 } 496 C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_failed); 497 return NULL; 498 } 499 500 bool LibraryCallKit::try_to_inline(int predicate) { 501 // Handle symbolic names for otherwise undistinguished boolean switches: 502 const bool is_store = true; 503 const bool is_compress = true; 504 const bool is_static = true; 505 const bool is_volatile = true; 506 507 if (!jvms()->has_method()) { 508 // Root JVMState has a null method. 509 assert(map()->memory()->Opcode() == Op_Parm, ""); 510 // Insert the memory aliasing node 511 set_all_memory(reset_memory()); 512 } 513 assert(merged_memory(), ""); |