< prev index next >

src/share/vm/opto/library_call.cpp

Print this page




 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(), "");


< prev index next >