< prev index next >

src/share/vm/opto/callGenerator.cpp

Print this page

        

*** 886,895 **** --- 886,916 ---- // Out-of-line call. return CallGenerator::for_direct_call(callee); } } + static void cast_argument(int arg_nb, ciType* t, GraphKit& kit) { + PhaseGVN& gvn = kit.gvn(); + Node* arg = kit.argument(arg_nb); + const Type* arg_type = arg->bottom_type(); + const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass()); + if (t->is_valuetype()) { + assert(!(arg_type->isa_valuetype() && t == kit.C->env()->___Value_klass()), "need to a pointer to the value type"); + if (arg_type->isa_valuetypeptr() && t != kit.C->env()->___Value_klass()) { + const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass()); + Node* cast = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type)); + Node* vt = ValueTypeNode::make(gvn, kit.merged_memory(), cast); + kit.set_argument(arg_nb, vt); + } + } else { + if (arg_type->isa_oopptr() && !arg_type->higher_equal(sig_type)) { + Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type)); + kit.set_argument(arg_nb, cast_obj); + } + } + } + CallGenerator* CallGenerator::for_method_handle_inline(JVMState* jvms, ciMethod* caller, ciMethod* callee, bool& input_not_const, bool delayed_forbidden) { GraphKit kit(jvms); PhaseGVN& gvn = kit.gvn(); Compile* C = kit.C; vmIntrinsics::ID iid = callee->intrinsic_id();
*** 951,979 **** // actual types. ciSignature* signature = target->signature(); const int receiver_skip = target->is_static() ? 0 : 1; // Cast receiver to its type. if (!target->is_static()) { ! Node* arg = kit.argument(0); ! const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr(); ! const Type* sig_type = TypeOopPtr::make_from_klass(signature->accessing_klass()); ! if (arg_type != NULL && !arg_type->higher_equal(sig_type)) { ! Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type)); ! kit.set_argument(0, cast_obj); ! } } // Cast reference arguments to its type. for (int i = 0, j = 0; i < signature->count(); i++) { ciType* t = signature->type_at(i); if (t->is_klass()) { ! Node* arg = kit.argument(receiver_skip + j); ! const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr(); ! const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass()); ! if (arg_type != NULL && !arg_type->higher_equal(sig_type)) { ! Node* cast_obj = gvn.transform(new CheckCastPPNode(kit.control(), arg, sig_type)); ! kit.set_argument(receiver_skip + j, cast_obj); ! } } j += t->size(); // long and double take two slots } // Try to get the most accurate receiver type --- 972,988 ---- // actual types. ciSignature* signature = target->signature(); const int receiver_skip = target->is_static() ? 0 : 1; // Cast receiver to its type. if (!target->is_static()) { ! cast_argument(0, signature->accessing_klass(), kit); } // Cast reference arguments to its type. for (int i = 0, j = 0; i < signature->count(); i++) { ciType* t = signature->type_at(i); if (t->is_klass()) { ! cast_argument(receiver_skip + j, t, kit); } j += t->size(); // long and double take two slots } // Try to get the most accurate receiver type
< prev index next >