< prev index next >
src/hotspot/share/opto/valuetypenode.cpp
Print this page
*** 252,271 ****
Node* vt = worklist.at(i);
vt->as_ValueType()->make_scalar_in_safepoints(root, gvn);
}
}
! void ValueTypeBaseNode::initialize(GraphKit* kit, MultiNode* multi, ciValueKlass* vk, int base_offset, int base_input, bool in) {
assert(base_offset >= 0, "offset in value type must be positive");
PhaseGVN& gvn = kit->gvn();
for (uint i = 0; i < field_count(); i++) {
ciType* ft = field_type(i);
int offset = base_offset + field_offset(i);
if (field_is_flattened(i)) {
// Flattened value type field
ValueTypeNode* vt = ValueTypeNode::make_uninitialized(gvn, ft->as_value_klass());
! vt->initialize(kit, multi, vk, offset - value_klass()->first_field_offset(), base_input, in);
set_field_value(i, gvn.transform(vt));
} else {
int j = 0; int extra = 0;
for (; j < vk->nof_nonstatic_fields(); j++) {
ciField* f = vk->nonstatic_field_at(j);
--- 252,273 ----
Node* vt = worklist.at(i);
vt->as_ValueType()->make_scalar_in_safepoints(root, gvn);
}
}
! void ValueTypeBaseNode::initialize(GraphKit* kit, MultiNode* multi, ciValueKlass* vk, int base_offset, uint& base_input, bool in) {
assert(base_offset >= 0, "offset in value type must be positive");
+ assert(base_input >= TypeFunc::Parms, "invalid base input");
PhaseGVN& gvn = kit->gvn();
for (uint i = 0; i < field_count(); i++) {
ciType* ft = field_type(i);
int offset = base_offset + field_offset(i);
if (field_is_flattened(i)) {
// Flattened value type field
ValueTypeNode* vt = ValueTypeNode::make_uninitialized(gvn, ft->as_value_klass());
! uint base = base_input;
! vt->initialize(kit, multi, vk, offset - value_klass()->first_field_offset(), base, in);
set_field_value(i, gvn.transform(vt));
} else {
int j = 0; int extra = 0;
for (; j < vk->nof_nonstatic_fields(); j++) {
ciField* f = vk->nonstatic_field_at(j);
*** 278,307 ****
extra++;
}
}
assert(j != vk->nof_nonstatic_fields(), "must find");
Node* parm = NULL;
if (multi->is_Start()) {
assert(in, "return from start?");
! parm = gvn.transform(new ParmNode(multi->as_Start(), base_input + j + extra));
} else {
if (in) {
! parm = multi->as_Call()->in(base_input + j + extra);
} else {
! parm = gvn.transform(new ProjNode(multi->as_Call(), base_input + j + extra));
}
}
! if (ft->is_valuetype()) {
! // Non-flattened value type field
! assert(!gvn.type(parm)->maybe_null(), "should never be null");
parm = ValueTypeNode::make_from_oop(kit, parm, ft->as_value_klass());
}
set_field_value(i, parm);
// Record all these guys for later GVN.
gvn.record_for_igvn(parm);
}
}
}
const TypePtr* ValueTypeBaseNode::field_adr_type(Node* base, int offset, ciInstanceKlass* holder, PhaseGVN& gvn) const {
const TypeAryPtr* ary_type = gvn.type(base)->isa_aryptr();
const TypePtr* adr_type = NULL;
--- 280,323 ----
extra++;
}
}
assert(j != vk->nof_nonstatic_fields(), "must find");
Node* parm = NULL;
+ int index = base_input + j + extra;
+
+ ciMethod* method = multi->is_Start()? kit->C->method() : multi->as_CallStaticJava()->method();
+ SigEntry res_entry = method->get_Method()->get_res_entry();
+ if (res_entry._offset != -1 && (index - TypeFunc::Parms) >= res_entry._offset) {
+ // Skip reserved entry
+ index += type2size[res_entry._bt];
+ }
if (multi->is_Start()) {
assert(in, "return from start?");
! parm = gvn.transform(new ParmNode(multi->as_Start(), index));
} else {
if (in) {
! parm = multi->as_Call()->in(index);
} else {
! parm = gvn.transform(new ProjNode(multi->as_Call(), index));
}
}
!
! if (field_is_flattenable(i)) {
! // Non-flattened but flattenable value type
! if (ft->as_value_klass()->is_scalarizable()) {
parm = ValueTypeNode::make_from_oop(kit, parm, ft->as_value_klass());
+ } else {
+ parm = kit->null2default(parm, ft->as_value_klass());
+ }
}
+
set_field_value(i, parm);
// Record all these guys for later GVN.
gvn.record_for_igvn(parm);
}
}
+ base_input += vk->value_arg_slots();
}
const TypePtr* ValueTypeBaseNode::field_adr_type(Node* base, int offset, ciInstanceKlass* holder, PhaseGVN& gvn) const {
const TypeAryPtr* ary_type = gvn.type(base)->isa_aryptr();
const TypePtr* adr_type = NULL;
*** 600,610 ****
vt->load(kit, obj, ptr, holder, holder_offset);
assert(vt->is_loaded(&kit->gvn()) != obj, "holder oop should not be used as flattened value type oop");
return kit->gvn().transform(vt)->as_ValueType();
}
! ValueTypeNode* ValueTypeNode::make_from_multi(GraphKit* kit, MultiNode* multi, ciValueKlass* vk, int base_input, bool in) {
ValueTypeNode* vt = ValueTypeNode::make_uninitialized(kit->gvn(), vk);
vt->initialize(kit, multi, vk, 0, base_input, in);
return kit->gvn().transform(vt)->as_ValueType();
}
--- 616,626 ----
vt->load(kit, obj, ptr, holder, holder_offset);
assert(vt->is_loaded(&kit->gvn()) != obj, "holder oop should not be used as flattened value type oop");
return kit->gvn().transform(vt)->as_ValueType();
}
! ValueTypeNode* ValueTypeNode::make_from_multi(GraphKit* kit, MultiNode* multi, ciValueKlass* vk, uint& base_input, bool in) {
ValueTypeNode* vt = ValueTypeNode::make_uninitialized(kit->gvn(), vk);
vt->initialize(kit, multi, vk, 0, base_input, in);
return kit->gvn().transform(vt)->as_ValueType();
}
*** 684,698 ****
intptr_t bits = tk->get_con();
set_nth_bit(bits, 0);
return gvn.makecon(TypeRawPtr::make((address)bits));
}
- void ValueTypeNode::pass_klass(Node* n, uint pos, const GraphKit& kit) {
- n->init_req(pos, tagged_klass(kit.gvn()));
- }
-
uint ValueTypeNode::pass_fields(Node* n, int base_input, GraphKit& kit, bool assert_allocated, ciValueKlass* base_vk, int base_offset) {
ciValueKlass* vk = value_klass();
if (base_vk == NULL) {
base_vk = vk;
}
uint edges = 0;
--- 700,711 ----
intptr_t bits = tk->get_con();
set_nth_bit(bits, 0);
return gvn.makecon(TypeRawPtr::make((address)bits));
}
uint ValueTypeNode::pass_fields(Node* n, int base_input, GraphKit& kit, bool assert_allocated, ciValueKlass* base_vk, int base_offset) {
+ assert(base_input >= TypeFunc::Parms, "invalid base input");
ciValueKlass* vk = value_klass();
if (base_vk == NULL) {
base_vk = vk;
}
uint edges = 0;
*** 719,735 ****
// non-flattened value type field
ValueTypeNode* vt = arg->as_ValueType();
assert(!assert_allocated || vt->is_allocated(&kit.gvn()), "value type field should be allocated");
arg = vt->allocate(&kit)->get_oop();
}
! n->init_req(base_input + j + extra, arg);
edges++;
BasicType bt = field_type(i)->basic_type();
if (bt == T_LONG || bt == T_DOUBLE) {
! n->init_req(base_input + j + extra + 1, kit.top());
edges++;
}
}
}
return edges;
}
--- 732,764 ----
// non-flattened value type field
ValueTypeNode* vt = arg->as_ValueType();
assert(!assert_allocated || vt->is_allocated(&kit.gvn()), "value type field should be allocated");
arg = vt->allocate(&kit)->get_oop();
}
!
! int index = base_input + j + extra;
! n->init_req(index++, arg);
edges++;
BasicType bt = field_type(i)->basic_type();
if (bt == T_LONG || bt == T_DOUBLE) {
! n->init_req(index++, kit.top());
edges++;
}
+ if (n->isa_CallJava()) {
+ Method* m = n->as_CallJava()->method()->get_Method();
+ SigEntry res_entry = m->get_res_entry();
+ if ((index - TypeFunc::Parms) == res_entry._offset) {
+ // Skip reserved entry
+ int size = type2size[res_entry._bt];
+ n->init_req(index++, kit.top());
+ if (size == 2) {
+ n->init_req(index++, kit.top());
+ }
+ base_input += size;
+ edges += size;
+ }
+ }
}
}
return edges;
}
< prev index next >