< prev index next >
src/share/vm/opto/parse1.cpp
Print this page
rev 10494 : more
rev 10496 : more
rev 10513 : fix incremental inlining with value types
@@ -788,20 +788,20 @@
}
}
// Helper function to create a ValueTypeNode from its fields passed as
// arguments. Fields are passed in order of increasing offsets.
-static Node* create_vt_node(StartNode* start, ciValueKlass* vk, ciValueKlass* base_vk, int base_offset, int base_input, Compile* C) {
+Node* Compile::create_vt_node(Node* n, ciValueKlass* vk, ciValueKlass* base_vk, int base_offset, int base_input) {
assert(base_offset >= 0, "offset in value type always positive");
- PhaseGVN& gvn = *C->initial_gvn();
+ PhaseGVN& gvn = *initial_gvn();
ValueTypeNode* vt = ValueTypeNode::make(gvn, vk);
for (uint i = 0; i < vt->field_count(); i++) {
ciType* field_type = vt->get_field_type(i);
int offset = base_offset + vt->get_field_offset(i) - (base_offset > 0 ? vk->first_field_offset() : 0);
if (field_type->is_valuetype()) {
ciValueKlass* embedded_vk = field_type->as_value_klass();
- Node* embedded_vt = create_vt_node(start, embedded_vk, base_vk, offset, base_input, C);
+ Node* embedded_vt = create_vt_node(n, embedded_vk, base_vk, offset, base_input);
vt->set_field_value(i, embedded_vt);
} else {
int j = 0; int extra = 0;
for (; j < base_vk->nof_nonstatic_fields(); j++) {
ciField* f = base_vk->nonstatic_field_at(j);
@@ -813,14 +813,20 @@
if (bt == T_LONG || bt == T_DOUBLE) {
extra++;
}
}
assert(j != base_vk->nof_nonstatic_fields(), "must find");
- Node* parm = gvn.transform(new ParmNode(start, base_input + j + extra));
+ Node* parm = NULL;
+ if (n->is_Start()) {
+ parm = gvn.transform(new ParmNode(n->as_Start(), base_input + j + extra));
+ } else {
+ assert(n->is_Call(), "nothing else here");
+ parm = n->in(base_input + j + extra);
+ }
vt->set_field_value(i, parm);
// Record all these guys for later GVN.
- C->record_for_igvn(parm);
+ record_for_igvn(parm);
}
}
return gvn.transform(vt);
}
@@ -860,21 +866,13 @@
// argument per field of the value type. Build ValueTypeNodes
// from the value type arguments.
const Type* t = tf->domain_sig()->field_at(i);
if (t->isa_valuetypeptr()) {
ciValueKlass* vk = t->is_valuetypeptr()->value_type()->value_klass();
- Node* vt = create_vt_node(start, vk, vk, 0, j, C);
+ Node* vt = create_vt_node(start, vk, vk, 0, j);
map->init_req(i, gvn.transform(vt));
- int extra = 0;
- for (int k = 0; k < vk->nof_nonstatic_fields(); k++) {
- ciField* f = vk->nonstatic_field_at(k);
- BasicType bt = f->type()->basic_type();
- if (bt == T_LONG || bt == T_DOUBLE) {
- extra++;
- }
- }
- j += extra + vk->nof_nonstatic_fields();
+ j += vk->value_arg_slots();
} else {
Node* parm = gvn.transform(new ParmNode(start, j));
map->init_req(i, parm);
// Record all these guys for later GVN.
record_for_igvn(parm);
< prev index next >