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




 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   }


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