< prev index next >

src/share/vm/opto/callGenerator.cpp

Print this page




 804   if (IncrementalInline && call_site_count > 0 &&
 805       (input_not_const || !C->inlining_incrementally() || C->over_inlining_cutoff())) {
 806     return CallGenerator::for_mh_late_inline(caller, callee, input_not_const);
 807   } else {
 808     // Out-of-line call.
 809     return CallGenerator::for_direct_call(callee);
 810   }
 811 }
 812 
 813 CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod* caller, ciMethod* callee, bool& input_not_const) {
 814   GraphKit kit(jvms);
 815   PhaseGVN& gvn = kit.gvn();
 816   Compile* C = kit.C;
 817   vmIntrinsics::ID iid = callee->intrinsic_id();
 818   input_not_const = true;
 819   switch (iid) {
 820   case vmIntrinsics::_invokeBasic:
 821     {
 822       // Get MethodHandle receiver:
 823       Node* receiver = kit.argument(0);
 824       if (receiver->Opcode() == Op_ConP) {
 825         input_not_const = false;
 826         const TypeOopPtr* oop_ptr = receiver->bottom_type()->is_oopptr();
 827         ciMethod* target = oop_ptr->const_oop()->as_method_handle()->get_vmtarget();
 828         const int vtable_index = Method::invalid_vtable_index;
 829         CallGenerator* cg = C->call_generator(target, vtable_index,
 830                                               false /* call_does_dispatch */,
 831                                               jvms,
 832                                               true /* allow_inline */,
 833                                               PROB_ALWAYS);
 834         return cg;
 835       } else {
 836         const char* msg = "receiver not constant";
 837         if (PrintInlining)  C->print_inlining(callee, jvms->depth() - 1, jvms->bci(), msg);
 838         C->log_inline_failure(msg);
 839       }
 840     }
 841     break;
 842 
 843   case vmIntrinsics::_linkToVirtual:
 844   case vmIntrinsics::_linkToStatic:
 845   case vmIntrinsics::_linkToSpecial:
 846   case vmIntrinsics::_linkToInterface:
 847     {
 848       // Get MemberName argument:
 849       Node* member_name = kit.argument(callee->arg_size() - 1);
 850       if (member_name->Opcode() == Op_ConP) {
 851         input_not_const = false;
 852         const TypeOopPtr* oop_ptr = member_name->bottom_type()->is_oopptr();
 853         ciMethod* target = oop_ptr->const_oop()->as_member_name()->get_vmtarget();
 854 
 855         // In lambda forms we erase signature types to avoid resolving issues
 856         // involving class loaders.  When we optimize a method handle invoke
 857         // to a direct call we must cast the receiver and arguments to its
 858         // actual types.
 859         ciSignature* signature = target->signature();
 860         const int receiver_skip = target->is_static() ? 0 : 1;
 861         // Cast receiver to its type.
 862         if (!target->is_static()) {
 863           Node* arg = kit.argument(0);
 864           const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr();
 865           const Type*       sig_type = TypeOopPtr::make_from_klass(signature->accessing_klass());
 866           if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
 867             Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
 868             kit.set_argument(0, cast_obj);
 869           }
 870         }




 804   if (IncrementalInline && call_site_count > 0 &&
 805       (input_not_const || !C->inlining_incrementally() || C->over_inlining_cutoff())) {
 806     return CallGenerator::for_mh_late_inline(caller, callee, input_not_const);
 807   } else {
 808     // Out-of-line call.
 809     return CallGenerator::for_direct_call(callee);
 810   }
 811 }
 812 
 813 CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod* caller, ciMethod* callee, bool& input_not_const) {
 814   GraphKit kit(jvms);
 815   PhaseGVN& gvn = kit.gvn();
 816   Compile* C = kit.C;
 817   vmIntrinsics::ID iid = callee->intrinsic_id();
 818   input_not_const = true;
 819   switch (iid) {
 820   case vmIntrinsics::_invokeBasic:
 821     {
 822       // Get MethodHandle receiver:
 823       Node* receiver = kit.argument(0);
 824       if (receiver->Opcode() == Opcodes::Op_ConP) {
 825         input_not_const = false;
 826         const TypeOopPtr* oop_ptr = receiver->bottom_type()->is_oopptr();
 827         ciMethod* target = oop_ptr->const_oop()->as_method_handle()->get_vmtarget();
 828         const int vtable_index = Method::invalid_vtable_index;
 829         CallGenerator* cg = C->call_generator(target, vtable_index,
 830                                               false /* call_does_dispatch */,
 831                                               jvms,
 832                                               true /* allow_inline */,
 833                                               PROB_ALWAYS);
 834         return cg;
 835       } else {
 836         const char* msg = "receiver not constant";
 837         if (PrintInlining)  C->print_inlining(callee, jvms->depth() - 1, jvms->bci(), msg);
 838         C->log_inline_failure(msg);
 839       }
 840     }
 841     break;
 842 
 843   case vmIntrinsics::_linkToVirtual:
 844   case vmIntrinsics::_linkToStatic:
 845   case vmIntrinsics::_linkToSpecial:
 846   case vmIntrinsics::_linkToInterface:
 847     {
 848       // Get MemberName argument:
 849       Node* member_name = kit.argument(callee->arg_size() - 1);
 850       if (member_name->Opcode() == Opcodes::Op_ConP) {
 851         input_not_const = false;
 852         const TypeOopPtr* oop_ptr = member_name->bottom_type()->is_oopptr();
 853         ciMethod* target = oop_ptr->const_oop()->as_member_name()->get_vmtarget();
 854 
 855         // In lambda forms we erase signature types to avoid resolving issues
 856         // involving class loaders.  When we optimize a method handle invoke
 857         // to a direct call we must cast the receiver and arguments to its
 858         // actual types.
 859         ciSignature* signature = target->signature();
 860         const int receiver_skip = target->is_static() ? 0 : 1;
 861         // Cast receiver to its type.
 862         if (!target->is_static()) {
 863           Node* arg = kit.argument(0);
 864           const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr();
 865           const Type*       sig_type = TypeOopPtr::make_from_klass(signature->accessing_klass());
 866           if (arg_type != NULL && !arg_type->higher_equal(sig_type)) {
 867             Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
 868             kit.set_argument(0, cast_obj);
 869           }
 870         }


< prev index next >