403 Node* eaddr = basic_plus_adr(array, offset);
404 store_oop_to_array(control(), array, eaddr, adr_type, elem, elemtype, T_OBJECT);
405 }
406 }
407 return array;
408 }
409
410 void Parse::do_multianewarray() {
411 int ndimensions = iter().get_dimensions();
412
413 // the m-dimensional array
414 bool will_link;
415 ciArrayKlass* array_klass = iter().get_klass(will_link)->as_array_klass();
416 assert(will_link, "multianewarray: typeflow responsibility");
417
418 // Note: Array classes are always initialized; no is_initialized check.
419
420 enum { MAX_DIMENSION = 5 };
421 if (ndimensions > MAX_DIMENSION || ndimensions <= 0) {
422 uncommon_trap(Deoptimization::Reason_unhandled,
423 Deoptimization::Action_none);
424 return;
425 }
426
427 kill_dead_locals();
428
429 // get the lengths from the stack (first dimension is on top)
430 Node* length[MAX_DIMENSION+1];
431 length[ndimensions] = NULL; // terminating null for make_runtime_call
432 int j;
433 for (j = ndimensions-1; j >= 0 ; j--) length[j] = pop();
434
435 // The original expression was of this form: new T[length0][length1]...
436 // It is often the case that the lengths are small (except the last).
437 // If that happens, use the fast 1-d creator a constant number of times.
438 const jint expand_limit = MIN2((juint)MultiArrayExpandLimit, (juint)100);
439 jint expand_count = 1; // count of allocations in the expansion
440 jint expand_fanout = 1; // running total fanout
441 for (j = 0; j < ndimensions-1; j++) {
442 jint dim_con = find_int_con(length[j], -1);
443 expand_fanout *= dim_con;
|
403 Node* eaddr = basic_plus_adr(array, offset);
404 store_oop_to_array(control(), array, eaddr, adr_type, elem, elemtype, T_OBJECT);
405 }
406 }
407 return array;
408 }
409
410 void Parse::do_multianewarray() {
411 int ndimensions = iter().get_dimensions();
412
413 // the m-dimensional array
414 bool will_link;
415 ciArrayKlass* array_klass = iter().get_klass(will_link)->as_array_klass();
416 assert(will_link, "multianewarray: typeflow responsibility");
417
418 // Note: Array classes are always initialized; no is_initialized check.
419
420 enum { MAX_DIMENSION = 5 };
421 if (ndimensions > MAX_DIMENSION || ndimensions <= 0) {
422 uncommon_trap(Deoptimization::Reason_unhandled,
423 Deoptimization::Action_maybe_recompile);
424 return;
425 }
426
427 kill_dead_locals();
428
429 // get the lengths from the stack (first dimension is on top)
430 Node* length[MAX_DIMENSION+1];
431 length[ndimensions] = NULL; // terminating null for make_runtime_call
432 int j;
433 for (j = ndimensions-1; j >= 0 ; j--) length[j] = pop();
434
435 // The original expression was of this form: new T[length0][length1]...
436 // It is often the case that the lengths are small (except the last).
437 // If that happens, use the fast 1-d creator a constant number of times.
438 const jint expand_limit = MIN2((juint)MultiArrayExpandLimit, (juint)100);
439 jint expand_count = 1; // count of allocations in the expansion
440 jint expand_fanout = 1; // running total fanout
441 for (j = 0; j < ndimensions-1; j++) {
442 jint dim_con = find_int_con(length[j], -1);
443 expand_fanout *= dim_con;
|