hotspot/src/share/vm/opto/callGenerator.cpp
changeset 14828 bb9dffedf46c
parent 14621 fd9265ab0f67
child 15113 823590505eb4
equal deleted inserted replaced
14827:8aa0a51a7137 14828:bb9dffedf46c
   272 
   272 
   273   // Convert the CallStaticJava into an inline
   273   // Convert the CallStaticJava into an inline
   274   virtual void do_late_inline();
   274   virtual void do_late_inline();
   275 
   275 
   276   virtual JVMState* generate(JVMState* jvms) {
   276   virtual JVMState* generate(JVMState* jvms) {
       
   277     Compile *C = Compile::current();
       
   278     C->print_inlining_skip(this);
       
   279 
   277     // Record that this call site should be revisited once the main
   280     // Record that this call site should be revisited once the main
   278     // parse is finished.
   281     // parse is finished.
   279     Compile::current()->add_late_inline(this);
   282     Compile::current()->add_late_inline(this);
   280 
   283 
   281     // Emit the CallStaticJava and request separate projections so
   284     // Emit the CallStaticJava and request separate projections so
   282     // that the late inlining logic can distinguish between fall
   285     // that the late inlining logic can distinguish between fall
   283     // through and exceptional uses of the memory and io projections
   286     // through and exceptional uses of the memory and io projections
   284     // as is done for allocations and macro expansion.
   287     // as is done for allocations and macro expansion.
   285     return DirectCallGenerator::generate(jvms);
   288     return DirectCallGenerator::generate(jvms);
   286   }
   289   }
   287 
       
   288 };
   290 };
   289 
   291 
   290 
   292 
   291 void LateInlineCallGenerator::do_late_inline() {
   293 void LateInlineCallGenerator::do_late_inline() {
   292   // Can't inline it
   294   // Can't inline it
   305     map->init_req(i1, call->in(i1));
   307     map->init_req(i1, call->in(i1));
   306   }
   308   }
   307 
   309 
   308   // Make sure the state is a MergeMem for parsing.
   310   // Make sure the state is a MergeMem for parsing.
   309   if (!map->in(TypeFunc::Memory)->is_MergeMem()) {
   311   if (!map->in(TypeFunc::Memory)->is_MergeMem()) {
   310     map->set_req(TypeFunc::Memory, MergeMemNode::make(C, map->in(TypeFunc::Memory)));
   312     Node* mem = MergeMemNode::make(C, map->in(TypeFunc::Memory));
       
   313     C->initial_gvn()->set_type_bottom(mem);
       
   314     map->set_req(TypeFunc::Memory, mem);
   311   }
   315   }
   312 
   316 
   313   // Make enough space for the expression stack and transfer the incoming arguments
   317   // Make enough space for the expression stack and transfer the incoming arguments
   314   int nargs    = method()->arg_size();
   318   int nargs    = method()->arg_size();
   315   jvms->set_map(map);
   319   jvms->set_map(map);
   317   if (nargs > 0) {
   321   if (nargs > 0) {
   318     for (int i1 = 0; i1 < nargs; i1++) {
   322     for (int i1 = 0; i1 < nargs; i1++) {
   319       map->set_req(i1 + jvms->argoff(), call->in(TypeFunc::Parms + i1));
   323       map->set_req(i1 + jvms->argoff(), call->in(TypeFunc::Parms + i1));
   320     }
   324     }
   321   }
   325   }
       
   326 
       
   327   C->print_inlining_insert(this);
   322 
   328 
   323   CompileLog* log = C->log();
   329   CompileLog* log = C->log();
   324   if (log != NULL) {
   330   if (log != NULL) {
   325     log->head("late_inline method='%d'", log->identify(method()));
   331     log->head("late_inline method='%d'", log->identify(method()));
   326     JVMState* p = jvms;
   332     JVMState* p = jvms;
   606         const int vtable_index = Method::invalid_vtable_index;
   612         const int vtable_index = Method::invalid_vtable_index;
   607         CallGenerator* cg = C->call_generator(target, vtable_index, false, jvms, true, PROB_ALWAYS);
   613         CallGenerator* cg = C->call_generator(target, vtable_index, false, jvms, true, PROB_ALWAYS);
   608         if (cg != NULL && cg->is_inline())
   614         if (cg != NULL && cg->is_inline())
   609           return cg;
   615           return cg;
   610       } else {
   616       } else {
   611         if (PrintInlining)  CompileTask::print_inlining(callee, jvms->depth() - 1, jvms->bci(), "receiver not constant");
   617         if (PrintInlining)  C->print_inlining(callee, jvms->depth() - 1, jvms->bci(), "receiver not constant");
   612       }
   618       }
   613     }
   619     }
   614     break;
   620     break;
   615 
   621 
   616   case vmIntrinsics::_linkToVirtual:
   622   case vmIntrinsics::_linkToVirtual: