aboutsummaryrefslogtreecommitdiff
path: root/src/share/vm/opto
diff options
context:
space:
mode:
authorkvn <none@none>2012-07-13 17:48:26 -0700
committerkvn <none@none>2012-07-13 17:48:26 -0700
commit6a5e9656ac88b786484d249f70f30ccbbff3ee93 (patch)
tree7adb97e52f2c4e0636c0806ce75f5cbc06c36d04 /src/share/vm/opto
parentc98763c8b899b3aabf53204b80489c7031492156 (diff)
7123926: Some CTW test crash: !_control.contains(ctrl)
Summary: Don't eliminate Integer::toString() call node during String concatenation optimization if it has several uses. Reviewed-by: twisti
Diffstat (limited to 'src/share/vm/opto')
-rw-r--r--src/share/vm/opto/stringopts.cpp12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/share/vm/opto/stringopts.cpp b/src/share/vm/opto/stringopts.cpp
index d606a7fda..803b13899 100644
--- a/src/share/vm/opto/stringopts.cpp
+++ b/src/share/vm/opto/stringopts.cpp
@@ -533,7 +533,17 @@ StringConcat* PhaseStringOpts::build_candidate(CallStaticJavaNode* call) {
if (arg->is_Proj() && arg->in(0)->is_CallStaticJava()) {
CallStaticJavaNode* csj = arg->in(0)->as_CallStaticJava();
if (csj->method() != NULL &&
- csj->method()->intrinsic_id() == vmIntrinsics::_Integer_toString) {
+ csj->method()->intrinsic_id() == vmIntrinsics::_Integer_toString &&
+ arg->outcnt() == 1) {
+ // _control is the list of StringBuilder calls nodes which
+ // will be replaced by new String code after this optimization.
+ // Integer::toString() call is not part of StringBuilder calls
+ // chain. It could be eliminated only if its result is used
+ // only by this SB calls chain.
+ // Another limitation: it should be used only once because
+ // it is unknown that it is used only by this SB calls chain
+ // until all related SB calls nodes are collected.
+ assert(arg->unique_out() == cnode, "sanity");
sc->add_control(csj);
sc->push_int(csj->in(TypeFunc::Parms));
continue;