910 if (IncrementalInline && (AlwaysIncrementalInline ||
911 (call_site_count > 0 && (input_not_const || !C->inlining_incrementally() || C->over_inlining_cutoff())))) {
912 return CallGenerator::for_mh_late_inline(caller, callee, input_not_const);
913 } else {
914 // Out-of-line call.
915 return CallGenerator::for_direct_call(callee);
916 }
917 }
918
919 static void cast_argument(int nargs, int arg_nb, ciType* t, GraphKit& kit) {
920 PhaseGVN& gvn = kit.gvn();
921 Node* arg = kit.argument(arg_nb);
922 const Type* arg_type = arg->bottom_type();
923 const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass());
924 if (arg_type->isa_oopptr() && !arg_type->higher_equal(sig_type)) {
925 arg = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
926 kit.set_argument(arg_nb, arg);
927 }
928 if (sig_type->is_valuetypeptr() && !arg->is_ValueType()) {
929 kit.inc_sp(nargs); // restore arguments
930 arg = ValueTypeNode::make_from_oop(&kit, arg, t->as_value_klass(), /* buffer_check */ false, /* null2default */ false);
931 kit.dec_sp(nargs);
932 kit.set_argument(arg_nb, arg);
933 }
934 }
935
936 CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod* caller, ciMethod* callee, bool& input_not_const, bool delayed_forbidden) {
937 GraphKit kit(jvms);
938 PhaseGVN& gvn = kit.gvn();
939 Compile* C = kit.C;
940 vmIntrinsics::ID iid = callee->intrinsic_id();
941 input_not_const = true;
942 switch (iid) {
943 case vmIntrinsics::_invokeBasic:
944 {
945 // Get MethodHandle receiver:
946 Node* receiver = kit.argument(0);
947 if (receiver->Opcode() == Op_ConP) {
948 input_not_const = false;
949 const TypeOopPtr* oop_ptr = receiver->bottom_type()->is_oopptr();
950 ciMethod* target = oop_ptr->const_oop()->as_method_handle()->get_vmtarget();
|
910 if (IncrementalInline && (AlwaysIncrementalInline ||
911 (call_site_count > 0 && (input_not_const || !C->inlining_incrementally() || C->over_inlining_cutoff())))) {
912 return CallGenerator::for_mh_late_inline(caller, callee, input_not_const);
913 } else {
914 // Out-of-line call.
915 return CallGenerator::for_direct_call(callee);
916 }
917 }
918
919 static void cast_argument(int nargs, int arg_nb, ciType* t, GraphKit& kit) {
920 PhaseGVN& gvn = kit.gvn();
921 Node* arg = kit.argument(arg_nb);
922 const Type* arg_type = arg->bottom_type();
923 const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass());
924 if (arg_type->isa_oopptr() && !arg_type->higher_equal(sig_type)) {
925 arg = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type));
926 kit.set_argument(arg_nb, arg);
927 }
928 if (sig_type->is_valuetypeptr() && !arg->is_ValueType()) {
929 kit.inc_sp(nargs); // restore arguments
930 arg = ValueTypeNode::make_from_oop(&kit, arg, t->as_value_klass(), /* null2default */ false);
931 kit.dec_sp(nargs);
932 kit.set_argument(arg_nb, arg);
933 }
934 }
935
936 CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod* caller, ciMethod* callee, bool& input_not_const, bool delayed_forbidden) {
937 GraphKit kit(jvms);
938 PhaseGVN& gvn = kit.gvn();
939 Compile* C = kit.C;
940 vmIntrinsics::ID iid = callee->intrinsic_id();
941 input_not_const = true;
942 switch (iid) {
943 case vmIntrinsics::_invokeBasic:
944 {
945 // Get MethodHandle receiver:
946 Node* receiver = kit.argument(0);
947 if (receiver->Opcode() == Op_ConP) {
948 input_not_const = false;
949 const TypeOopPtr* oop_ptr = receiver->bottom_type()->is_oopptr();
950 ciMethod* target = oop_ptr->const_oop()->as_method_handle()->get_vmtarget();
|