< prev index next >

src/share/vm/opto/valuetypenode.cpp

Print this page




 597   kit->set_i_o(kit->gvn().transform(io));
 598   kit->set_all_memory(kit->gvn().transform(mem));
 599   kit->record_for_igvn(region);
 600   kit->record_for_igvn(oop);
 601   kit->record_for_igvn(io);
 602   kit->record_for_igvn(mem);
 603 
 604   // Use cloned ValueTypeNode to propagate oop from now on
 605   Node* res_oop = kit->gvn().transform(oop);
 606   ValueTypeNode* vt = clone()->as_ValueType();
 607   vt->set_oop(res_oop);
 608   kit->replace_in_map(this, kit->gvn().transform(vt));
 609   return res_oop;
 610 }
 611 
 612 bool ValueTypeNode::is_allocated(PhaseGVN* phase) const {
 613   const Type* oop_type = phase->type(get_oop());
 614   return oop_type->meet(TypePtr::NULL_PTR) != oop_type;
 615 }
 616 
 617 void ValueTypeNode::pass_klass(Node* n, uint pos, const GraphKit& kit) {
 618   ciValueKlass* vk = value_klass();
 619   const TypeKlassPtr* tk = TypeKlassPtr::make(vk);
 620   intptr_t bits = tk->get_con();
 621   set_nth_bit(bits, 0);
 622   Node* klass_tagged = kit.MakeConX(bits);
 623   n->init_req(pos, klass_tagged);



 624 }
 625 
 626 uint ValueTypeNode::pass_fields(Node* n, int base_input, const GraphKit& kit, ciValueKlass* base_vk, int base_offset) {
 627   ciValueKlass* vk = value_klass();
 628   if (base_vk == NULL) {
 629     base_vk = vk;
 630   }
 631   uint edges = 0;
 632   for (uint i = 0; i < field_count(); i++) {
 633     ciType* f_type = field_type(i);
 634     int offset = base_offset + field_offset(i) - (base_offset > 0 ? vk->first_field_offset() : 0);
 635     Node* arg = field_value(i);
 636     if (f_type->is_valuetype()) {
 637       ciValueKlass* embedded_vk = f_type->as_value_klass();
 638       edges += arg->as_ValueType()->pass_fields(n, base_input, kit, base_vk, offset);
 639     } else {
 640       int j = 0; int extra = 0;
 641       for (; j < base_vk->nof_nonstatic_fields(); j++) {
 642         ciField* f = base_vk->nonstatic_field_at(j);
 643         if (offset == f->offset()) {




 597   kit->set_i_o(kit->gvn().transform(io));
 598   kit->set_all_memory(kit->gvn().transform(mem));
 599   kit->record_for_igvn(region);
 600   kit->record_for_igvn(oop);
 601   kit->record_for_igvn(io);
 602   kit->record_for_igvn(mem);
 603 
 604   // Use cloned ValueTypeNode to propagate oop from now on
 605   Node* res_oop = kit->gvn().transform(oop);
 606   ValueTypeNode* vt = clone()->as_ValueType();
 607   vt->set_oop(res_oop);
 608   kit->replace_in_map(this, kit->gvn().transform(vt));
 609   return res_oop;
 610 }
 611 
 612 bool ValueTypeNode::is_allocated(PhaseGVN* phase) const {
 613   const Type* oop_type = phase->type(get_oop());
 614   return oop_type->meet(TypePtr::NULL_PTR) != oop_type;
 615 }
 616 
 617 Node* ValueTypeNode::tagged_klass(PhaseGVN& gvn) {
 618   ciValueKlass* vk = value_klass();
 619   const TypeKlassPtr* tk = TypeKlassPtr::make(vk);
 620   intptr_t bits = tk->get_con();
 621   set_nth_bit(bits, 0);
 622   return gvn.makecon(TypeRawPtr::make((address)bits));
 623 }
 624 
 625 void ValueTypeNode::pass_klass(Node* n, uint pos, const GraphKit& kit) {
 626   n->init_req(pos, tagged_klass(kit.gvn()));
 627 }
 628 
 629 uint ValueTypeNode::pass_fields(Node* n, int base_input, const GraphKit& kit, ciValueKlass* base_vk, int base_offset) {
 630   ciValueKlass* vk = value_klass();
 631   if (base_vk == NULL) {
 632     base_vk = vk;
 633   }
 634   uint edges = 0;
 635   for (uint i = 0; i < field_count(); i++) {
 636     ciType* f_type = field_type(i);
 637     int offset = base_offset + field_offset(i) - (base_offset > 0 ? vk->first_field_offset() : 0);
 638     Node* arg = field_value(i);
 639     if (f_type->is_valuetype()) {
 640       ciValueKlass* embedded_vk = f_type->as_value_klass();
 641       edges += arg->as_ValueType()->pass_fields(n, base_input, kit, base_vk, offset);
 642     } else {
 643       int j = 0; int extra = 0;
 644       for (; j < base_vk->nof_nonstatic_fields(); j++) {
 645         ciField* f = base_vk->nonstatic_field_at(j);
 646         if (offset == f->offset()) {


< prev index next >