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