132 |
132 |
133 if (kit.C->log() != NULL) { |
133 if (kit.C->log() != NULL) { |
134 kit.C->log()->elem("direct_call bci='%d'", jvms->bci()); |
134 kit.C->log()->elem("direct_call bci='%d'", jvms->bci()); |
135 } |
135 } |
136 |
136 |
137 CallStaticJavaNode *call = new (kit.C, tf()->domain()->cnt()) CallStaticJavaNode(tf(), target, method(), kit.bci()); |
137 CallStaticJavaNode *call = new (kit.C) CallStaticJavaNode(tf(), target, method(), kit.bci()); |
138 _call_node = call; // Save the call node in case we need it later |
138 _call_node = call; // Save the call node in case we need it later |
139 if (!is_static) { |
139 if (!is_static) { |
140 // Make an explicit receiver null_check as part of this call. |
140 // Make an explicit receiver null_check as part of this call. |
141 // Since we share a map with the caller, his JVMS gets adjusted. |
141 // Since we share a map with the caller, his JVMS gets adjusted. |
142 kit.null_check_receiver(method()); |
142 kit.null_check_receiver(method()); |
219 assert(!method()->is_private(), "virtual call should not be to private"); |
219 assert(!method()->is_private(), "virtual call should not be to private"); |
220 assert(_vtable_index == Method::invalid_vtable_index || !UseInlineCaches, |
220 assert(_vtable_index == Method::invalid_vtable_index || !UseInlineCaches, |
221 "no vtable calls if +UseInlineCaches "); |
221 "no vtable calls if +UseInlineCaches "); |
222 address target = SharedRuntime::get_resolve_virtual_call_stub(); |
222 address target = SharedRuntime::get_resolve_virtual_call_stub(); |
223 // Normal inline cache used for call |
223 // Normal inline cache used for call |
224 CallDynamicJavaNode *call = new (kit.C, tf()->domain()->cnt()) CallDynamicJavaNode(tf(), target, method(), _vtable_index, kit.bci()); |
224 CallDynamicJavaNode *call = new (kit.C) CallDynamicJavaNode(tf(), target, method(), _vtable_index, kit.bci()); |
225 kit.set_arguments_for_java_call(call); |
225 kit.set_arguments_for_java_call(call); |
226 kit.set_edges_for_java_call(call); |
226 kit.set_edges_for_java_call(call); |
227 Node* ret = kit.set_results_for_java_call(call); |
227 Node* ret = kit.set_results_for_java_call(call); |
228 kit.push_node(method()->return_type()->basic_type(), ret); |
228 kit.push_node(method()->return_type()->basic_type(), ret); |
229 |
229 |
298 |
298 |
299 // Make a clone of the JVMState that appropriate to use for driving a parse |
299 // Make a clone of the JVMState that appropriate to use for driving a parse |
300 Compile* C = Compile::current(); |
300 Compile* C = Compile::current(); |
301 JVMState* jvms = call->jvms()->clone_shallow(C); |
301 JVMState* jvms = call->jvms()->clone_shallow(C); |
302 uint size = call->req(); |
302 uint size = call->req(); |
303 SafePointNode* map = new (C, size) SafePointNode(size, jvms); |
303 SafePointNode* map = new (C) SafePointNode(size, jvms); |
304 for (uint i1 = 0; i1 < size; i1++) { |
304 for (uint i1 = 0; i1 < size; i1++) { |
305 map->init_req(i1, call->in(i1)); |
305 map->init_req(i1, call->in(i1)); |
306 } |
306 } |
307 |
307 |
308 // Make sure the state is a MergeMem for parsing. |
308 // Make sure the state is a MergeMem for parsing. |
549 return kit.transfer_exceptions_into_jvms(); |
549 return kit.transfer_exceptions_into_jvms(); |
550 } |
550 } |
551 |
551 |
552 // Finish the diamond. |
552 // Finish the diamond. |
553 kit.C->set_has_split_ifs(true); // Has chance for split-if optimization |
553 kit.C->set_has_split_ifs(true); // Has chance for split-if optimization |
554 RegionNode* region = new (kit.C, 3) RegionNode(3); |
554 RegionNode* region = new (kit.C) RegionNode(3); |
555 region->init_req(1, kit.control()); |
555 region->init_req(1, kit.control()); |
556 region->init_req(2, slow_map->control()); |
556 region->init_req(2, slow_map->control()); |
557 kit.set_control(gvn.transform(region)); |
557 kit.set_control(gvn.transform(region)); |
558 Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO); |
558 Node* iophi = PhiNode::make(region, kit.i_o(), Type::ABIO); |
559 iophi->set_req(2, slow_map->i_o()); |
559 iophi->set_req(2, slow_map->i_o()); |
634 if (!target->is_static()) { |
634 if (!target->is_static()) { |
635 Node* arg = kit.argument(0); |
635 Node* arg = kit.argument(0); |
636 const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr(); |
636 const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr(); |
637 const Type* sig_type = TypeOopPtr::make_from_klass(signature->accessing_klass()); |
637 const Type* sig_type = TypeOopPtr::make_from_klass(signature->accessing_klass()); |
638 if (arg_type != NULL && !arg_type->higher_equal(sig_type)) { |
638 if (arg_type != NULL && !arg_type->higher_equal(sig_type)) { |
639 Node* cast_obj = gvn.transform(new (C, 2) CheckCastPPNode(kit.control(), arg, sig_type)); |
639 Node* cast_obj = gvn.transform(new (C) CheckCastPPNode(kit.control(), arg, sig_type)); |
640 kit.set_argument(0, cast_obj); |
640 kit.set_argument(0, cast_obj); |
641 } |
641 } |
642 } |
642 } |
643 // Cast reference arguments to its type. |
643 // Cast reference arguments to its type. |
644 for (int i = 0; i < signature->count(); i++) { |
644 for (int i = 0; i < signature->count(); i++) { |
646 if (t->is_klass()) { |
646 if (t->is_klass()) { |
647 Node* arg = kit.argument(receiver_skip + i); |
647 Node* arg = kit.argument(receiver_skip + i); |
648 const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr(); |
648 const TypeOopPtr* arg_type = arg->bottom_type()->isa_oopptr(); |
649 const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass()); |
649 const Type* sig_type = TypeOopPtr::make_from_klass(t->as_klass()); |
650 if (arg_type != NULL && !arg_type->higher_equal(sig_type)) { |
650 if (arg_type != NULL && !arg_type->higher_equal(sig_type)) { |
651 Node* cast_obj = gvn.transform(new (C, 2) CheckCastPPNode(kit.control(), arg, sig_type)); |
651 Node* cast_obj = gvn.transform(new (C) CheckCastPPNode(kit.control(), arg, sig_type)); |
652 kit.set_argument(receiver_skip + i, cast_obj); |
652 kit.set_argument(receiver_skip + i, cast_obj); |
653 } |
653 } |
654 } |
654 } |
655 } |
655 } |
656 const int vtable_index = Method::invalid_vtable_index; |
656 const int vtable_index = Method::invalid_vtable_index; |