diff --git a/src/hotspot/share/opto/library_call.cpp b/src/hotspot/share/opto/library_call.cpp index a057f66a989..d89db76e591 100644 --- a/src/hotspot/share/opto/library_call.cpp +++ b/src/hotspot/share/opto/library_call.cpp @@ -891,13 +891,16 @@ inline Node* LibraryCallKit::generate_fair_guard(Node* test, RegionNode* region) } inline Node* LibraryCallKit::generate_negative_guard(Node* index, RegionNode* region, - Node* *pos_index) { + Node* *pos_index, bool is_opaque) { if (stopped()) return nullptr; // already stopped if (_gvn.type(index)->higher_equal(TypeInt::POS)) // [0,maxint] return nullptr; // index is already adequately typed Node* cmp_lt = _gvn.transform(new CmpINode(index, intcon(0))); Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt)); + if (is_opaque) { + bol_lt = _gvn.transform(new OpaqueGuardNode(C, bol_lt, false)); + } Node* is_neg = generate_guard(bol_lt, region, PROB_MIN); if (is_neg != nullptr && pos_index != nullptr) { // Emulate effect of Parse::adjust_map_after_if. @@ -924,7 +927,8 @@ inline Node* LibraryCallKit::generate_negative_guard(Node* index, RegionNode* re inline Node* LibraryCallKit::generate_limit_guard(Node* offset, Node* subseq_length, Node* array_length, - RegionNode* region) { + RegionNode* region, + bool is_opaque) { if (stopped()) return nullptr; // already stopped bool zero_offset = _gvn.type(offset) == TypeInt::ZERO; @@ -935,6 +939,9 @@ inline Node* LibraryCallKit::generate_limit_guard(Node* offset, last = _gvn.transform(new AddINode(last, offset)); Node* cmp_lt = _gvn.transform(new CmpUNode(array_length, last)); Node* bol_lt = _gvn.transform(new BoolNode(cmp_lt, BoolTest::lt)); + if (is_opaque) { + bol_lt = _gvn.transform(new OpaqueGuardNode(C, bol_lt, true)); + } Node* is_over = generate_guard(bol_lt, region, PROB_MIN); return is_over; } @@ -944,7 +951,8 @@ void LibraryCallKit::generate_string_range_check(Node* array, Node* offset, Node* count, bool char_count, - bool halt_on_oob) { + bool halt_on_oob, + bool is_opaque) { if (stopped()) { return; // already stopped } @@ -956,8 +964,8 @@ void LibraryCallKit::generate_string_range_check(Node* array, } // Offset and count must not be negative - generate_negative_guard(offset, bailout); - generate_negative_guard(count, bailout); + generate_negative_guard(offset, bailout, nullptr, is_opaque); + generate_negative_guard(count, bailout, nullptr, is_opaque); // Offset + count must not exceed length of array generate_limit_guard(offset, count, load_array_length(array), bailout); diff --git a/src/hotspot/share/opto/library_call.hpp b/src/hotspot/share/opto/library_call.hpp index bfe29814dec..6153484696d 100644 --- a/src/hotspot/share/opto/library_call.hpp +++ b/src/hotspot/share/opto/library_call.hpp @@ -158,13 +158,16 @@ class LibraryCallKit : public GraphKit { Node* generate_fair_guard(Node* test, RegionNode* region); Node* generate_negative_guard(Node* index, RegionNode* region, // resulting CastII of index: - Node* *pos_index = nullptr); + Node* *pos_index = nullptr, + bool is_opaque = false); Node* generate_limit_guard(Node* offset, Node* subseq_length, Node* array_length, - RegionNode* region); + RegionNode* region, + bool is_opaque = false); void generate_string_range_check(Node* array, Node* offset, Node* length, bool char_count, - bool halt_on_oob = false); + bool halt_on_oob = false, + bool is_opaque = false); Node* current_thread_helper(Node* &tls_output, ByteSize handle_offset, bool is_immutable); Node* generate_current_thread(Node* &tls_output);