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 } 557 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 if (arg->outcnt() == 1) { 538 // _control is the list of StringBuilder calls nodes which 539 // will be eliminated by this String concatenation optimization. 540 // Integer::toString() call is not part of StringBuilder calls 541 // chain. It's node could be eliminated only if it's result 542 // is used only by this chain. 543 // An other 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 chain's nodes are collected. 546 // 547 // Note, it is fine to not eliminate Integer::toString() call 548 // node. It will be inlined later and it's code will fold if 549 // it's result is not used. 550 assert(arg->unique_out() == cnode, "sanity"); 551 sc->add_control(csj); 552 } 553 sc->push_int(csj->in(TypeFunc::Parms)); 554 continue; 555 } 556 } 557 sc->push_string(arg); 558 } 559 continue; 560 } else { 561 // some unhandled signature 562 #ifndef PRODUCT 563 if (PrintOptimizeStringConcat) { 564 tty->print("giving up because encountered unexpected signature "); 565 cnode->tf()->dump(); tty->cr(); 566 cnode->in(TypeFunc::Parms + 1)->dump(); 567 } 568 #endif 569 break; 570 } 571 } 572 return NULL; |