< prev index next >

src/share/vm/opto/graphKit.cpp

Print this page

        

@@ -3588,14 +3588,14 @@
   // (T_BYTE has the weakest alignment and size restrictions...)
   if (layout_is_con) {
     int       hsize  = Klass::layout_helper_header_size(layout_con);
     int       eshift = Klass::layout_helper_log2_element_size(layout_con);
     BasicType etype  = Klass::layout_helper_element_type(layout_con);
+    bool is_value_array = Klass::layout_helper_is_valueArray(layout_con);
     if ((round_mask & ~right_n_bits(eshift)) == 0)
       round_mask = 0;  // strength-reduce it if it goes away completely
-    // TODO re-enabled assert
-  //  assert((hsize & right_n_bits(eshift)) == 0, "hsize is pre-rounded");
+    assert(is_value_array || (hsize & right_n_bits(eshift)) == 0, "hsize is pre-rounded");
     assert(header_size_min <= hsize, "generic minimum is smallest");
     header_size_min = hsize;
     header_size = intcon(hsize + round_mask);
   } else {
     Node* hss   = intcon(Klass::_lh_header_size_shift);

@@ -3717,17 +3717,14 @@
     }
   }
 
   const TypeAryPtr* ary_ptr = ary_type->isa_aryptr();
   ciKlass* elem_klass = ary_ptr != NULL ? ary_ptr->klass()->as_array_klass()->element_klass() : NULL;
-  //if (layout_is_con && Klass::layout_helper_element_type(layout_con) == T_VALUETYPE) {
   if (elem_klass != NULL && elem_klass->is_valuetype()) {
     ciValueKlass* vk = elem_klass->as_value_klass();
-    if (vk->flatten_array()) {
-      // TODO
-    } else {
-      // TODO explain this and add asserts
+    if (!vk->flatten_array()) {
+      // Non-flattened value type arrays need to be initialized with default value type oops
       initialize_value_type_array(javaoop, length, elem_klass->as_value_klass(), nargs);
       InitializeNode* init = alloc->initialization();
       init->set_complete_with_arraycopy();
     }
   }

@@ -3780,11 +3777,11 @@
     record_for_igvn(mem);
     set_control(loop);
     set_all_memory(mem);
     // Initialize array element
     Node* adr = array_element_address(array, index, T_OBJECT);
-    const TypeOopPtr* elemtype = TypeValueTypePtr::make(TypePtr::NotNull, vk); // ary_type->is_aryptr()->elem()->make_oopptr();
+    const TypeOopPtr* elemtype = TypeValueTypePtr::make(TypePtr::NotNull, vk);
     Node* store = store_oop_to_array(control(), array, adr, TypeAryPtr::OOPS, oop, elemtype, T_OBJECT, MemNode::release);
 
     IfNode* iff = create_and_map_if(control(), Bool(CmpI(index, length), BoolTest::lt), PROB_FAIR, COUNT_UNKNOWN);
     loop->init_req(2, IfTrue(iff));
     mem->init_req(2, merged_memory());

@@ -3796,10 +3793,18 @@
   }
   // Set merged control, IO and memory
   set_control(res_ctl);
   set_i_o(res_io);
   merge_memory(loop_map->merged_memory(), res_ctl, 2);
+
+  // Transform new memory Phis.
+  for (MergeMemStream mms(merged_memory()); mms.next_non_empty();) {
+    Node* phi = mms.memory();
+    if (phi->is_Phi() && phi->in(0) == res_ctl) {
+      mms.set_memory(gvn().transform(phi));
+    }
+  }
 }
 
 // The following "Ideal_foo" functions are placed here because they recognize
 // the graph shapes created by the functions immediately above.
 
< prev index next >