src/share/vm/opto/library_call.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/share/vm/opto

src/share/vm/opto/library_call.cpp

Print this page
rev 6442 : 8026796: Make replace_in_map() on parent maps generic
Summary: propagate node replacements along control flow edges to callers
Reviewed-by:


  52  public:
  53  private:
  54   bool             _is_virtual;
  55   bool             _is_predicted;
  56   bool             _does_virtual_dispatch;
  57   vmIntrinsics::ID _intrinsic_id;
  58 
  59  public:
  60   LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id)
  61     : InlineCallGenerator(m),
  62       _is_virtual(is_virtual),
  63       _is_predicted(is_predicted),
  64       _does_virtual_dispatch(does_virtual_dispatch),
  65       _intrinsic_id(id)
  66   {
  67   }
  68   virtual bool is_intrinsic() const { return true; }
  69   virtual bool is_virtual()   const { return _is_virtual; }
  70   virtual bool is_predicted()   const { return _is_predicted; }
  71   virtual bool does_virtual_dispatch()   const { return _does_virtual_dispatch; }
  72   virtual JVMState* generate(JVMState* jvms, Parse* parent_parser);
  73   virtual Node* generate_predicate(JVMState* jvms);
  74   vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; }
  75 };
  76 
  77 
  78 // Local helper class for LibraryIntrinsic:
  79 class LibraryCallKit : public GraphKit {
  80  private:
  81   LibraryIntrinsic* _intrinsic;     // the library intrinsic being called
  82   Node*             _result;        // the result node, if any
  83   int               _reexecute_sp;  // the stack pointer when bytecode needs to be reexecuted
  84 
  85   const TypeOopPtr* sharpen_unsafe_type(Compile::AliasType* alias_type, const TypePtr *adr_type, bool is_native_ptr = false);
  86 
  87  public:
  88   LibraryCallKit(JVMState* jvms, LibraryIntrinsic* intrinsic)
  89     : GraphKit(jvms),
  90       _intrinsic(intrinsic),
  91       _result(NULL)
  92   {


 575   if (m->holder()->name() == ciSymbol::java_lang_Math() ||
 576       m->holder()->name() == ciSymbol::java_lang_Float() ||
 577       m->holder()->name() == ciSymbol::java_lang_Double()) {
 578     if (!InlineMathNatives)  return NULL;
 579   }
 580 
 581   // -XX:-InlineUnsafeOps disables natives from the Unsafe class.
 582   if (m->holder()->name() == ciSymbol::sun_misc_Unsafe()) {
 583     if (!InlineUnsafeOps)  return NULL;
 584   }
 585 
 586   return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id);
 587 }
 588 
 589 //----------------------register_library_intrinsics-----------------------
 590 // Initialize this file's data structures, for each Compile instance.
 591 void Compile::register_library_intrinsics() {
 592   // Nothing to do here.
 593 }
 594 
 595 JVMState* LibraryIntrinsic::generate(JVMState* jvms, Parse* parent_parser) {
 596   LibraryCallKit kit(jvms, this);
 597   Compile* C = kit.C;
 598   int nodes = C->unique();
 599 #ifndef PRODUCT
 600   if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
 601     char buf[1000];
 602     const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
 603     tty->print_cr("Intrinsic %s", str);
 604   }
 605 #endif
 606   ciMethod* callee = kit.callee();
 607   const int bci    = kit.bci();
 608 
 609   // Try to inline the intrinsic.
 610   if (kit.try_to_inline()) {
 611     if (C->print_intrinsics() || C->print_inlining()) {
 612       C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
 613     }
 614     C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
 615     if (C->log()) {




  52  public:
  53  private:
  54   bool             _is_virtual;
  55   bool             _is_predicted;
  56   bool             _does_virtual_dispatch;
  57   vmIntrinsics::ID _intrinsic_id;
  58 
  59  public:
  60   LibraryIntrinsic(ciMethod* m, bool is_virtual, bool is_predicted, bool does_virtual_dispatch, vmIntrinsics::ID id)
  61     : InlineCallGenerator(m),
  62       _is_virtual(is_virtual),
  63       _is_predicted(is_predicted),
  64       _does_virtual_dispatch(does_virtual_dispatch),
  65       _intrinsic_id(id)
  66   {
  67   }
  68   virtual bool is_intrinsic() const { return true; }
  69   virtual bool is_virtual()   const { return _is_virtual; }
  70   virtual bool is_predicted()   const { return _is_predicted; }
  71   virtual bool does_virtual_dispatch()   const { return _does_virtual_dispatch; }
  72   virtual JVMState* generate(JVMState* jvms);
  73   virtual Node* generate_predicate(JVMState* jvms);
  74   vmIntrinsics::ID intrinsic_id() const { return _intrinsic_id; }
  75 };
  76 
  77 
  78 // Local helper class for LibraryIntrinsic:
  79 class LibraryCallKit : public GraphKit {
  80  private:
  81   LibraryIntrinsic* _intrinsic;     // the library intrinsic being called
  82   Node*             _result;        // the result node, if any
  83   int               _reexecute_sp;  // the stack pointer when bytecode needs to be reexecuted
  84 
  85   const TypeOopPtr* sharpen_unsafe_type(Compile::AliasType* alias_type, const TypePtr *adr_type, bool is_native_ptr = false);
  86 
  87  public:
  88   LibraryCallKit(JVMState* jvms, LibraryIntrinsic* intrinsic)
  89     : GraphKit(jvms),
  90       _intrinsic(intrinsic),
  91       _result(NULL)
  92   {


 575   if (m->holder()->name() == ciSymbol::java_lang_Math() ||
 576       m->holder()->name() == ciSymbol::java_lang_Float() ||
 577       m->holder()->name() == ciSymbol::java_lang_Double()) {
 578     if (!InlineMathNatives)  return NULL;
 579   }
 580 
 581   // -XX:-InlineUnsafeOps disables natives from the Unsafe class.
 582   if (m->holder()->name() == ciSymbol::sun_misc_Unsafe()) {
 583     if (!InlineUnsafeOps)  return NULL;
 584   }
 585 
 586   return new LibraryIntrinsic(m, is_virtual, is_predicted, does_virtual_dispatch, (vmIntrinsics::ID) id);
 587 }
 588 
 589 //----------------------register_library_intrinsics-----------------------
 590 // Initialize this file's data structures, for each Compile instance.
 591 void Compile::register_library_intrinsics() {
 592   // Nothing to do here.
 593 }
 594 
 595 JVMState* LibraryIntrinsic::generate(JVMState* jvms) {
 596   LibraryCallKit kit(jvms, this);
 597   Compile* C = kit.C;
 598   int nodes = C->unique();
 599 #ifndef PRODUCT
 600   if ((C->print_intrinsics() || C->print_inlining()) && Verbose) {
 601     char buf[1000];
 602     const char* str = vmIntrinsics::short_name_as_C_string(intrinsic_id(), buf, sizeof(buf));
 603     tty->print_cr("Intrinsic %s", str);
 604   }
 605 #endif
 606   ciMethod* callee = kit.callee();
 607   const int bci    = kit.bci();
 608 
 609   // Try to inline the intrinsic.
 610   if (kit.try_to_inline()) {
 611     if (C->print_intrinsics() || C->print_inlining()) {
 612       C->print_inlining(callee, jvms->depth() - 1, bci, is_virtual() ? "(intrinsic, virtual)" : "(intrinsic)");
 613     }
 614     C->gather_intrinsic_statistics(intrinsic_id(), is_virtual(), Compile::_intrinsic_worked);
 615     if (C->log()) {


src/share/vm/opto/library_call.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File