@@ -327,45 +327,48 @@ Node* Parse::expand_multianewarray(ciArrayKlass* array_klass, Node* *lengths, in
327327/* *
328328 * Initialize the graph, equivalent to the following Java code:
329329 *
330- * for (int index = 0; index < length1; index++)
331- * multi_array[index] = new array_klass[length2];
332- *
333- * The actual loop structure:
334- *
335- * if (length1 > 0) {
336- * int index = 0;
337- * do {
338- * multi_array[index] = new T[length2];
339- * index++;
340- * } while (index < length1);
341- * }
342- *
343- * The corresponding C2 IR graph:
344- *
345- * CmpI(length1, 0) -> Bool(gt) -> If
346- * IfFalse => skip_ctrl
347- * IfTrue =>
348- * CastII(length2, POS) -> length2
349- * LoopNode(IfTrue, back_edge)
350- * Phi(LoopNode, 0, next_index) -> index
351- * Phi(LoopNode, pre_mem, body_mem)
352- * Phi(LoopNode, pre_io, body_io)
353- * AllocateArray(klass_1, length2) -> array
354- * StoreP(array_element_address(multi_array, index), array)
355- * AddI(index, 1) -> next_index
356- * CmpI(next_index, length1) -> Bool(lt) -> If
357- * IfTrue => back_edge => LoopNode
358- * IfFalse => loop_exit
359- * Region(skip_ctrl, loop_exit)
360- * Phi(Region, pre_mem, body_mem)
361- * Phi(Region, pre_io, body_io)
330+ * multi_array = new T[length1][];
331+ * for (int index = 0; index < length1; index++) {
332+ * multi_array[index] = new array_klass[length2];
333+ * }
362334 */
363- void Parse::init_array2d (Node* multi_array,
364- ciArrayKlass* array_klass,
365- Node* length1, Node* length2) {
335+ Node* Parse::multianewarray2 (ciArrayKlass* array_klass, Node* length1, Node* length2) {
336+
337+ assert (length1 != nullptr && length2 != nullptr , " " );
338+ Node* multi_array = new_array (makecon (TypeKlassPtr::make (array_klass, Type::trust_interfaces)), length1, false );
366339
367340 C->set_has_loops (true );
368341
342+ // The actual loop structure:
343+ //
344+ // if (length1 > 0) {
345+ // int index = 0;
346+ // do {
347+ // multi_array[index] = new T[length2];
348+ // index++;
349+ // } while (index < length1);
350+ // }
351+ //
352+ // The corresponding C2 IR graph:
353+ //
354+ // CmpI(length1, 0) -> Bool(gt) -> If
355+ // IfFalse => skip_ctrl
356+ // IfTrue =>
357+ // CastII(length2, POS) -> length2
358+ // LoopNode(IfTrue, back_edge)
359+ // Phi(LoopNode, 0, next_index) -> index
360+ // Phi(LoopNode, pre_mem, body_mem)
361+ // Phi(LoopNode, pre_io, body_io)
362+ // AllocateArray(klass_1, length2) -> array
363+ // StoreP(array_element_address(multi_array, index), array)
364+ // AddI(index, 1) -> next_index
365+ // CmpI(next_index, length1) -> Bool(lt) -> If
366+ // IfTrue => back_edge => LoopNode
367+ // IfFalse => loop_exit
368+ // Region(skip_ctrl, loop_exit)
369+ // Phi(Region, pre_mem, body_mem)
370+ // Phi(Region, pre_io, body_io)
371+
369372 Node* i_init = _gvn.intcon (0 );
370373 Node* cmp_init = _gvn.transform (new CmpINode (length1, i_init));
371374 Node* bool_init = _gvn.transform (new BoolNode (cmp_init, BoolTest::gt));
@@ -408,10 +411,11 @@ void Parse::init_array2d(Node* multi_array,
408411
409412 Node* array = _gvn.transform (new_array (klass_node, length2, false ));
410413
411- store_to_memory (control (),
414+ const TypeOopPtr* elemtype = _gvn.type (multi_array)->is_aryptr ()->elem ()->make_oopptr ();
415+ access_store_at (multi_array,
412416 array_element_address (multi_array, index, T_OBJECT),
413- array ,
414- T_OBJECT, MemNode::unordered, TypeAryPtr::OOPS, false , false , true );
417+ TypeAryPtr::OOPS ,
418+ array, elemtype, T_OBJECT, IN_HEAP | IS_ARRAY );
415419
416420 Node* new_i = _gvn.transform (new AddINode (index, _gvn.intcon (1 )));
417421 Node* cmp = _gvn.transform (new CmpINode (new_i, length1));
@@ -444,6 +448,8 @@ void Parse::init_array2d(Node* multi_array,
444448 set_control (exit_region);
445449 set_all_memory (exit_mem);
446450 set_i_o (exit_io);
451+
452+ return multi_array;
447453}
448454
449455void Parse::do_multianewarray () {
@@ -507,12 +513,7 @@ void Parse::do_multianewarray() {
507513 Node* obj = nullptr ;
508514 { PreserveReexecuteState preexecs (this );
509515 inc_sp (ndimensions);
510-
511- Node* length1 = length[0 ];
512- Node* length2 = length[1 ];
513- assert (length1 != nullptr && length2 != nullptr , " " );
514- obj = new_array (makecon (TypeKlassPtr::make (array_klass, Type::trust_interfaces)), length1, false );
515- init_array2d (obj, array_klass, length1, length2);
516+ obj = multianewarray2 (array_klass, length[0 ], length[1 ]);
516517 }
517518 push (obj);
518519 return ;
@@ -521,7 +522,7 @@ void Parse::do_multianewarray() {
521522 address fun = nullptr ;
522523 switch (ndimensions) {
523524 case 1 : ShouldNotReachHere (); break ;
524- case 2 : fun = OptoRuntime::multianewarray2_Java (); break ;
525+ case 2 : ShouldNotReachHere (); break ;
525526 case 3 : fun = OptoRuntime::multianewarray3_Java (); break ;
526527 case 4 : fun = OptoRuntime::multianewarray4_Java (); break ;
527528 case 5 : fun = OptoRuntime::multianewarray5_Java (); break ;
0 commit comments