516 return NULL;
517 }
518 } else if (cnode->method() == NULL) {
519 break;
520 } else if (!cnode->method()->is_static() &&
521 cnode->method()->holder() == m->holder() &&
522 cnode->method()->name() == ciSymbol::append_name() &&
523 (cnode->method()->signature()->as_symbol() == string_sig ||
524 cnode->method()->signature()->as_symbol() == char_sig ||
525 cnode->method()->signature()->as_symbol() == int_sig)) {
526 sc->add_control(cnode);
527 Node* arg = cnode->in(TypeFunc::Parms + 1);
528 if (cnode->method()->signature()->as_symbol() == int_sig) {
529 sc->push_int(arg);
530 } else if (cnode->method()->signature()->as_symbol() == char_sig) {
531 sc->push_char(arg);
532 } else {
533 if (arg->is_Proj() && arg->in(0)->is_CallStaticJava()) {
534 CallStaticJavaNode* csj = arg->in(0)->as_CallStaticJava();
535 if (csj->method() != NULL &&
536 csj->method()->intrinsic_id() == vmIntrinsics::_Integer_toString) {
537 sc->add_control(csj);
538 sc->push_int(csj->in(TypeFunc::Parms));
539 continue;
540 }
541 }
542 sc->push_string(arg);
543 }
544 continue;
545 } else {
546 // some unhandled signature
547 #ifndef PRODUCT
548 if (PrintOptimizeStringConcat) {
549 tty->print("giving up because encountered unexpected signature ");
550 cnode->tf()->dump(); tty->cr();
551 cnode->in(TypeFunc::Parms + 1)->dump();
552 }
553 #endif
554 break;
555 }
556 }
|
516 return NULL;
517 }
518 } else if (cnode->method() == NULL) {
519 break;
520 } else if (!cnode->method()->is_static() &&
521 cnode->method()->holder() == m->holder() &&
522 cnode->method()->name() == ciSymbol::append_name() &&
523 (cnode->method()->signature()->as_symbol() == string_sig ||
524 cnode->method()->signature()->as_symbol() == char_sig ||
525 cnode->method()->signature()->as_symbol() == int_sig)) {
526 sc->add_control(cnode);
527 Node* arg = cnode->in(TypeFunc::Parms + 1);
528 if (cnode->method()->signature()->as_symbol() == int_sig) {
529 sc->push_int(arg);
530 } else if (cnode->method()->signature()->as_symbol() == char_sig) {
531 sc->push_char(arg);
532 } else {
533 if (arg->is_Proj() && arg->in(0)->is_CallStaticJava()) {
534 CallStaticJavaNode* csj = arg->in(0)->as_CallStaticJava();
535 if (csj->method() != NULL &&
536 csj->method()->intrinsic_id() == vmIntrinsics::_Integer_toString &&
537 arg->outcnt() == 1) {
538 // _control is the list of StringBuilder calls nodes which
539 // will be replaced by new String code after this optimization.
540 // Integer::toString() call is not part of StringBuilder calls
541 // chain. It could be eliminated only if its result is used
542 // only by this SB calls chain.
543 // Another limitation: it should be used only once because
544 // it is unknown that it is used only by this SB calls chain
545 // until all related SB calls nodes are collected.
546 assert(arg->unique_out() == cnode, "sanity");
547 sc->add_control(csj);
548 sc->push_int(csj->in(TypeFunc::Parms));
549 continue;
550 }
551 }
552 sc->push_string(arg);
553 }
554 continue;
555 } else {
556 // some unhandled signature
557 #ifndef PRODUCT
558 if (PrintOptimizeStringConcat) {
559 tty->print("giving up because encountered unexpected signature ");
560 cnode->tf()->dump(); tty->cr();
561 cnode->in(TypeFunc::Parms + 1)->dump();
562 }
563 #endif
564 break;
565 }
566 }
|