src/share/vm/opto/stringopts.cpp

Print this page
rev 7657 : fix StringOpts


1490         const Type* type = kit.gvn().type(arg);
1491         assert(type != TypePtr::NULL_PTR, "missing check");
1492         if (!type->higher_equal(TypeInstPtr::NOTNULL)) {
1493           // Null check with uncommont trap since
1494           // StringBuilder(null) throws exception.
1495           // Use special uncommon trap instead of
1496           // calling normal do_null_check().
1497           Node* p = __ Bool(__ CmpP(arg, kit.null()), BoolTest::ne);
1498           IfNode* iff = kit.create_and_map_if(kit.control(), p, PROB_MIN, COUNT_UNKNOWN);
1499           overflow->add_req(__ IfFalse(iff));
1500           Node* notnull = __ IfTrue(iff);
1501           kit.set_control(notnull); // set control for the cast_not_null
1502           arg = kit.cast_not_null(arg, false);
1503           sc->set_argument(argi, arg);
1504         }
1505         assert(kit.gvn().type(arg)->higher_equal(TypeInstPtr::NOTNULL), "sanity");
1506         // Fallthrough to add string length.
1507       }
1508       case StringConcat::StringMode: {
1509         const Type* type = kit.gvn().type(arg);

1510         if (type == TypePtr::NULL_PTR) {
1511           // replace the argument with the null checked version
1512           arg = null_string;
1513           sc->set_argument(argi, arg);

1514         } else if (!type->higher_equal(TypeInstPtr::NOTNULL)) {
1515           // s = s != null ? s : "null";
1516           // length = length + (s.count - s.offset);
1517           RegionNode *r = new RegionNode(3);
1518           kit.gvn().set_type(r, Type::CONTROL);
1519           Node *phi = new PhiNode(r, type);
1520           kit.gvn().set_type(phi, phi->bottom_type());
1521           Node* p = __ Bool(__ CmpP(arg, kit.null()), BoolTest::ne);
1522           IfNode* iff = kit.create_and_map_if(kit.control(), p, PROB_MIN, COUNT_UNKNOWN);
1523           Node* notnull = __ IfTrue(iff);
1524           Node* isnull =  __ IfFalse(iff);
1525           kit.set_control(notnull); // set control for the cast_not_null
1526           r->init_req(1, notnull);
1527           phi->init_req(1, kit.cast_not_null(arg, false));
1528           r->init_req(2, isnull);
1529           phi->init_req(2, null_string);
1530           kit.set_control(r);
1531           C->record_for_igvn(r);
1532           C->record_for_igvn(phi);
1533           // replace the argument with the null checked version
1534           arg = phi;
1535           sc->set_argument(argi, arg);



1536         }
1537 
1538         Node* count = kit.load_String_length(kit.control(), arg);
1539 
1540         length = __ AddI(length, count);
1541         string_sizes->init_req(argi, NULL);
1542         break;
1543       }
1544       case StringConcat::CharMode: {
1545         // one character only
1546         length = __ AddI(length, __ intcon(1));
1547         break;
1548       }
1549       default:
1550         ShouldNotReachHere();
1551     }
1552     if (argi > 0) {
1553       // Check that the sum hasn't overflowed
1554       IfNode* iff = kit.create_and_map_if(kit.control(),
1555                                           __ Bool(__ CmpI(length, __ intcon(0)), BoolTest::lt),
1556                                           PROB_MIN, COUNT_UNKNOWN);
1557       kit.set_control(__ IfFalse(iff));
1558       overflow->set_req(argi, __ IfTrue(iff));
1559     }




1490         const Type* type = kit.gvn().type(arg);
1491         assert(type != TypePtr::NULL_PTR, "missing check");
1492         if (!type->higher_equal(TypeInstPtr::NOTNULL)) {
1493           // Null check with uncommont trap since
1494           // StringBuilder(null) throws exception.
1495           // Use special uncommon trap instead of
1496           // calling normal do_null_check().
1497           Node* p = __ Bool(__ CmpP(arg, kit.null()), BoolTest::ne);
1498           IfNode* iff = kit.create_and_map_if(kit.control(), p, PROB_MIN, COUNT_UNKNOWN);
1499           overflow->add_req(__ IfFalse(iff));
1500           Node* notnull = __ IfTrue(iff);
1501           kit.set_control(notnull); // set control for the cast_not_null
1502           arg = kit.cast_not_null(arg, false);
1503           sc->set_argument(argi, arg);
1504         }
1505         assert(kit.gvn().type(arg)->higher_equal(TypeInstPtr::NOTNULL), "sanity");
1506         // Fallthrough to add string length.
1507       }
1508       case StringConcat::StringMode: {
1509         const Type* type = kit.gvn().type(arg);
1510         Node* count = NULL;
1511         if (type == TypePtr::NULL_PTR) {
1512           // replace the argument with the null checked version
1513           arg = null_string;
1514           sc->set_argument(argi, arg);
1515           count = kit.load_String_length(kit.control(), arg);
1516         } else if (!type->higher_equal(TypeInstPtr::NOTNULL)) {
1517           // s = s != null ? s : "null";
1518           // length = length + (s.count - s.offset);
1519           RegionNode *r = new RegionNode(3);
1520           kit.gvn().set_type(r, Type::CONTROL);
1521           Node *phi = new PhiNode(r, type);
1522           kit.gvn().set_type(phi, phi->bottom_type());
1523           Node* p = __ Bool(__ CmpP(arg, kit.null()), BoolTest::ne);
1524           IfNode* iff = kit.create_and_map_if(kit.control(), p, PROB_MIN, COUNT_UNKNOWN);
1525           Node* notnull = __ IfTrue(iff);
1526           Node* isnull =  __ IfFalse(iff);
1527           kit.set_control(notnull); // set control for the cast_not_null
1528           r->init_req(1, notnull);
1529           phi->init_req(1, kit.cast_not_null(arg, false));
1530           r->init_req(2, isnull);
1531           phi->init_req(2, null_string);
1532           kit.set_control(r);
1533           C->record_for_igvn(r);
1534           C->record_for_igvn(phi);
1535           // replace the argument with the null checked version
1536           arg = phi;
1537           sc->set_argument(argi, arg);
1538           count = kit.load_String_length(kit.control(), arg);
1539         } else {
1540           count = kit.load_String_length(NULL, arg);
1541         }



1542         length = __ AddI(length, count);
1543         string_sizes->init_req(argi, NULL);
1544         break;
1545       }
1546       case StringConcat::CharMode: {
1547         // one character only
1548         length = __ AddI(length, __ intcon(1));
1549         break;
1550       }
1551       default:
1552         ShouldNotReachHere();
1553     }
1554     if (argi > 0) {
1555       // Check that the sum hasn't overflowed
1556       IfNode* iff = kit.create_and_map_if(kit.control(),
1557                                           __ Bool(__ CmpI(length, __ intcon(0)), BoolTest::lt),
1558                                           PROB_MIN, COUNT_UNKNOWN);
1559       kit.set_control(__ IfFalse(iff));
1560       overflow->set_req(argi, __ IfTrue(iff));
1561     }