< prev index next >

src/hotspot/share/opto/callGenerator.cpp

Print this page




 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();


< prev index next >