< prev index next >

src/share/vm/opto/valuetypenode.cpp

Print this page

        

@@ -41,14 +41,14 @@
   // Create a new ValueTypeNode with default values
   ValueTypeNode* vt = ValueTypeNode::make(gvn, vk);
   for (uint i = 0; i < vt->field_count(); ++i) {
     ciType* field_type = vt->field_type(i);
     Node* value = NULL;
-    if (field_type->is_primitive_type()) {
-      value = gvn.zerocon(field_type->basic_type());
-    } else {
+    if (field_type->is_valuetype()) {
       value = ValueTypeNode::make_default(gvn, field_type->as_value_klass());
+    } else {
+      value = gvn.zerocon(field_type->basic_type());
     }
     vt->set_field_value(i, value);
   }
   return gvn.transform(vt);
 }

@@ -108,11 +108,12 @@
         } else {
           ciField* field = holder->get_field_by_offset(offset, false);
           adr_type = gvn.C->alias_type(field)->adr_type();
         }
         Node* adr = gvn.transform(new AddPNode(base, ptr, gvn.MakeConX(offset)));
-        value = LoadNode::make(gvn, NULL, mem, adr, adr_type, Type::get_const_type(ftype), ftype->basic_type(), MemNode::unordered);
+        BasicType bt = type2field[ftype->basic_type()];
+        value = LoadNode::make(gvn, NULL, mem, adr, adr_type, Type::get_const_type(ftype), bt, MemNode::unordered);
       }
     }
     set_field_value(i, gvn.transform(value));
   }
 }

@@ -141,11 +142,20 @@
       } else {
         ciField* field = holder->get_field_by_offset(offset, false);
         adr_type = kit->C->alias_type(field)->adr_type();
       }
       Node* adr = kit->basic_plus_adr(base, ptr, offset);
-      kit->store_to_memory(kit->control(), adr, value, field_type(i)->basic_type(), adr_type, MemNode::unordered);
+      BasicType bt = type2field[field_type(i)->basic_type()];
+      if (is_java_primitive(bt)) {
+        kit->store_to_memory(kit->control(), adr, value, bt, adr_type, MemNode::unordered);
+      } else {
+        const TypeOopPtr* ft = TypeOopPtr::make_from_klass(field_type(i)->as_klass());
+        assert(adr->bottom_type()->is_ptr_to_narrowoop() == UseCompressedOops, "inconsistent");
+        // TODO What about "use_precise"?
+        kit->store_oop(kit->control(), base, adr, adr_type, value, ft, bt, false, MemNode::unordered);
+      }
+
     }
   }
 }
 
 Node* ValueTypeNode::store_to_memory(GraphKit* kit) {

@@ -168,26 +178,20 @@
   PhiNode* io  = new PhiNode(region, Type::ABIO);
   PhiNode* mem = new PhiNode(region, Type::MEMORY, TypePtr::BOTTOM);
 
   // Oop is non-NULL, use it
   region->init_req(1, kit->control());
-  // Fixme if we cast oop to not null we fail if the control path is not folded
-  // castnode.cpp:69: #  assert(ft == Type::TOP) failed: special case #3
-  //oop   ->init_req(1, not_null_oop);
-  oop   ->init_req(1, in_oop);
+  oop   ->init_req(1, not_null_oop);
   io    ->init_req(1, kit->i_o());
   mem   ->init_req(1, kit->merged_memory());
 
   // Oop is NULL, allocate value type
   kit->set_control(null_ctl);
   kit->kill_dead_locals();
   ciValueKlass* vk = value_klass();
   Node* klass_node = kit->makecon(TypeKlassPtr::make(vk));
   Node* alloc_oop  = kit->new_instance(klass_node);
-  AllocateNode* alloc = AllocateNode::Ideal_allocation(alloc_oop, &kit->gvn());
-  // TODO enable/fix this
-  // alloc->initialization()->set_complete_with_arraycopy();
   // Write field values to memory
   store_values(kit, alloc_oop, alloc_oop, vk);
   region->init_req(2, kit->control());
   oop   ->init_req(2, alloc_oop);
   io    ->init_req(2, kit->i_o());
< prev index next >