< prev index next >
src/hotspot/share/opto/castnode.cpp
Print this page
*** 416,426 ****
in(1) != NULL && in(1)->is_Proj() &&
in(1)->in(0) != NULL && in(1)->in(0)->is_CallStaticJava() &&
in(1)->in(0)->as_CallStaticJava()->method() != NULL &&
in(1)->as_Proj()->_con == TypeFunc::Parms) {
const TypeValueTypePtr* cast_type = type()->is_valuetypeptr();
! ciValueKlass* vk = cast_type->value_type()->value_klass();
assert(!vk->is__Value(), "why cast to __Value?");
PhaseIterGVN* igvn = phase->is_IterGVN();
if (ValueTypeReturnedAsFields && vk->can_be_returned_as_fields()) {
igvn->set_delay_transform(true);
--- 416,426 ----
in(1) != NULL && in(1)->is_Proj() &&
in(1)->in(0) != NULL && in(1)->in(0)->is_CallStaticJava() &&
in(1)->in(0)->as_CallStaticJava()->method() != NULL &&
in(1)->as_Proj()->_con == TypeFunc::Parms) {
const TypeValueTypePtr* cast_type = type()->is_valuetypeptr();
! ciValueKlass* vk = cast_type->value_klass();
assert(!vk->is__Value(), "why cast to __Value?");
PhaseIterGVN* igvn = phase->is_IterGVN();
if (ValueTypeReturnedAsFields && vk->can_be_returned_as_fields()) {
igvn->set_delay_transform(true);
*** 492,502 ****
Node* ex_io_phi = new PhiNode(ex_region, Type::ABIO);
// True branch: result is a tagged klass pointer
// Allocate a value type (will add extra projections to the call)
kit.set_control(iftrue);
! Node* res = igvn->transform(ValueTypePtrNode::make(&kit, vk, call));
res = res->isa_ValueTypePtr()->allocate(&kit);
// Get exception state
GraphKit ekit(kit.transfer_exceptions_into_jvms(), igvn);
SafePointNode* ex_map = ekit.combine_and_pop_all_exception_states();
--- 492,502 ----
Node* ex_io_phi = new PhiNode(ex_region, Type::ABIO);
// True branch: result is a tagged klass pointer
// Allocate a value type (will add extra projections to the call)
kit.set_control(iftrue);
! Node* res = igvn->transform(ValueTypePtrNode::make_from_call(&kit, vk, call));
res = res->isa_ValueTypePtr()->allocate(&kit);
// Get exception state
GraphKit ekit(kit.transfer_exceptions_into_jvms(), igvn);
SafePointNode* ex_map = ekit.combine_and_pop_all_exception_states();
*** 519,529 ****
ConstraintCastNode* res_cast = clone()->as_ConstraintCast();
res_cast->set_req(0, kit.control());
res_cast->set_req(1, projs.resproj);
res_cast->set_type(cast_type->cast_to_ptr_type(TypePtr::NotNull));
Node* ctl = kit.control(); // Control may get updated below
! res = ValueTypePtrNode::make(*igvn, ctl, kit.merged_memory(), igvn->transform(res_cast));
region->init_req(2, ctl);
mem_phi->init_req(2, kit.reset_memory());
io_phi->init_req(2, kit.i_o());
res_phi->init_req(2, igvn->transform(res));
--- 519,529 ----
ConstraintCastNode* res_cast = clone()->as_ConstraintCast();
res_cast->set_req(0, kit.control());
res_cast->set_req(1, projs.resproj);
res_cast->set_type(cast_type->cast_to_ptr_type(TypePtr::NotNull));
Node* ctl = kit.control(); // Control may get updated below
! res = ValueTypePtrNode::make_from_oop(*igvn, ctl, kit.merged_memory(), igvn->transform(res_cast));
region->init_req(2, ctl);
mem_phi->init_req(2, kit.reset_memory());
io_phi->init_req(2, kit.i_o());
res_phi->init_req(2, igvn->transform(res));
*** 559,569 ****
call->extract_projections(&projs, true, true);
Node* ctl = projs.fallthrough_catchproj;
Node* mem = projs.fallthrough_memproj;
Node* ctl_hook = new Node(1);
igvn->replace_in_uses(ctl, ctl_hook);
! Node* vtptr = ValueTypePtrNode::make(*phase, ctl, mem, in(1));
// Attach users to updated control
igvn->replace_node(ctl_hook, ctl);
return vtptr;
}
}
--- 559,569 ----
call->extract_projections(&projs, true, true);
Node* ctl = projs.fallthrough_catchproj;
Node* mem = projs.fallthrough_memproj;
Node* ctl_hook = new Node(1);
igvn->replace_in_uses(ctl, ctl_hook);
! Node* vtptr = ValueTypePtrNode::make_from_oop(*phase, ctl, mem, in(1));
// Attach users to updated control
igvn->replace_node(ctl_hook, ctl);
return vtptr;
}
}
< prev index next >