src/share/vm/opto/stringopts.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 7123926 Sdiff src/share/vm/opto

src/share/vm/opto/stringopts.cpp

Print this page




 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;


src/share/vm/opto/stringopts.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File