JDK-8374582: add guard opaque node support

This commit is contained in:
Damon Fenacci 2026-01-09 17:51:20 +01:00
parent 3c6722d949
commit 1b983f8773
2 changed files with 19 additions and 8 deletions

View File

@ -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);

View File

@ -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);