< prev index next >

src/share/vm/opto/graphKit.cpp

Print this page

        

*** 1706,1723 **** //-------------------------set_arguments_for_java_call------------------------- // Arguments (pre-popped from the stack) are taken from the JVMS. void GraphKit::set_arguments_for_java_call(CallJavaNode* call) { // Add the call arguments: uint nargs = call->method()->arg_size(); ! for (uint i = 0; i < nargs; i++) { Node* arg = argument(i); if (arg->is_ValueType()) { // Pass value type argument via oop to callee arg = arg->as_ValueType()->store_to_memory(this); } call->init_req(i + TypeFunc::Parms, arg); } } //---------------------------set_edges_for_java_call--------------------------- // Connect a newly created call into the current JVMS. // A return value node (if any) is returned from set_edges_for_java_call. --- 1706,1735 ---- //-------------------------set_arguments_for_java_call------------------------- // Arguments (pre-popped from the stack) are taken from the JVMS. void GraphKit::set_arguments_for_java_call(CallJavaNode* call) { // Add the call arguments: uint nargs = call->method()->arg_size(); ! for (uint i = 0, idx = 0; i < nargs; i++) { Node* arg = argument(i); + if (ValueTypePassFieldsAsArgs) { + if (arg->is_ValueType()) { + ValueTypeNode* vt = arg->as_ValueType(); + // We don't pass value type arguments by reference but instead + // pass each field of the value type + idx += vt->set_arguments_for_java_call(call, idx + TypeFunc::Parms, *this); + } else { + call->init_req(idx + TypeFunc::Parms, arg); + idx++; + } + } else { if (arg->is_ValueType()) { // Pass value type argument via oop to callee arg = arg->as_ValueType()->store_to_memory(this); } call->init_req(i + TypeFunc::Parms, arg); } + } } //---------------------------set_edges_for_java_call--------------------------- // Connect a newly created call into the current JVMS. // A return value node (if any) is returned from set_edges_for_java_call.
*** 2116,2128 **** void GraphKit::round_double_arguments(ciMethod* dest_method) { // (Note: TypeFunc::make has a cache that makes this fast.) const TypeFunc* tf = TypeFunc::make(dest_method); ! int nargs = tf->domain()->cnt() - TypeFunc::Parms; for (int j = 0; j < nargs; j++) { ! const Type *targ = tf->domain()->field_at(j + TypeFunc::Parms); if( targ->basic_type() == T_DOUBLE ) { // If any parameters are doubles, they must be rounded before // the call, dstore_rounding does gvn.transform Node *arg = argument(j); arg = dstore_rounding(arg); --- 2128,2140 ---- void GraphKit::round_double_arguments(ciMethod* dest_method) { // (Note: TypeFunc::make has a cache that makes this fast.) const TypeFunc* tf = TypeFunc::make(dest_method); ! int nargs = tf->domain_sig()->cnt() - TypeFunc::Parms; for (int j = 0; j < nargs; j++) { ! const Type *targ = tf->domain_sig()->field_at(j + TypeFunc::Parms); if( targ->basic_type() == T_DOUBLE ) { // If any parameters are doubles, they must be rounded before // the call, dstore_rounding does gvn.transform Node *arg = argument(j); arg = dstore_rounding(arg);
*** 2220,2233 **** void GraphKit::record_profiled_arguments_for_speculation(ciMethod* dest_method, Bytecodes::Code bc) { if (!UseTypeSpeculation) { return; } const TypeFunc* tf = TypeFunc::make(dest_method); ! int nargs = tf->domain()->cnt() - TypeFunc::Parms; int skip = Bytecodes::has_receiver(bc) ? 1 : 0; for (int j = skip, i = 0; j < nargs && i < TypeProfileArgsLimit; j++) { ! const Type *targ = tf->domain()->field_at(j + TypeFunc::Parms); if (targ->basic_type() == T_OBJECT || targ->basic_type() == T_ARRAY) { bool maybe_null = true; ciKlass* better_type = NULL; if (method()->argument_profiled_type(bci(), i, better_type, maybe_null)) { record_profile_for_speculation(argument(j), better_type, maybe_null); --- 2232,2245 ---- void GraphKit::record_profiled_arguments_for_speculation(ciMethod* dest_method, Bytecodes::Code bc) { if (!UseTypeSpeculation) { return; } const TypeFunc* tf = TypeFunc::make(dest_method); ! int nargs = tf->domain_sig()->cnt() - TypeFunc::Parms; int skip = Bytecodes::has_receiver(bc) ? 1 : 0; for (int j = skip, i = 0; j < nargs && i < TypeProfileArgsLimit; j++) { ! const Type *targ = tf->domain_sig()->field_at(j + TypeFunc::Parms); if (targ->basic_type() == T_OBJECT || targ->basic_type() == T_ARRAY) { bool maybe_null = true; ciKlass* better_type = NULL; if (method()->argument_profiled_type(bci(), i, better_type, maybe_null)) { record_profile_for_speculation(argument(j), better_type, maybe_null);
< prev index next >