mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 03:58:21 +00:00
JDK-8374582: add guard opaque node support
This commit is contained in:
parent
3c6722d949
commit
1b983f8773
@ -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);
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user