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 } |