Skip to content

Commit 714930e

Browse files
merykittyTobiHartmann
authored andcommitted
8355397: [lworld] Parse::array_load fails with "array can't be flat" assert
Reviewed-by: thartmann
1 parent 99de2e7 commit 714930e

File tree

16 files changed

+49
-31
lines changed

16 files changed

+49
-31
lines changed

src/hotspot/share/c1/c1_Instruction.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ bool Instruction::maybe_flat_array() {
140140
if (type->is_obj_array_klass()) {
141141
// Due to array covariance, the runtime type might be a flat array.
142142
ciKlass* element_klass = type->as_obj_array_klass()->element_klass();
143-
if (element_klass->can_be_inline_klass() && (!element_klass->is_inlinetype() || element_klass->as_inline_klass()->flat_in_array())) {
143+
if (element_klass->can_be_inline_klass() && (!element_klass->is_inlinetype() || element_klass->as_inline_klass()->maybe_flat_in_array())) {
144144
return true;
145145
}
146146
} else if (type->is_flat_array_klass()) {

src/hotspot/share/c1/c1_LIRGenerator.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1827,7 +1827,7 @@ bool LIRGenerator::needs_flat_array_store_check(StoreIndexed* x) {
18271827
ciType* type = x->value()->declared_type();
18281828
if (type != nullptr && type->is_klass()) {
18291829
ciKlass* klass = type->as_klass();
1830-
if (!klass->can_be_inline_klass() || (klass->is_inlinetype() && !klass->as_inline_klass()->flat_in_array())) {
1830+
if (!klass->can_be_inline_klass() || (klass->is_inlinetype() && !klass->as_inline_klass()->maybe_flat_in_array())) {
18311831
// This is known to be a non-flat object. If the array is a flat array,
18321832
// it will be caught by the code generated by array_store_check().
18331833
return false;

src/hotspot/share/ci/ciArrayKlass.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ ciArrayKlass* ciArrayKlass::make(ciType* element_type, bool flat, bool null_free
114114
EXCEPTION_CONTEXT;
115115
Klass* ak = nullptr;
116116
InlineKlass* vk = InlineKlass::cast(klass->get_Klass());
117-
if (flat && vk->flat_array()) {
117+
if (flat && vk->maybe_flat_in_array()) {
118118
LayoutKind lk;
119119
if (null_free) {
120120
if (vk->is_naturally_atomic()) {

src/hotspot/share/ci/ciInlineKlass.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ int ciInlineKlass::payload_offset() const {
3333
}
3434

3535
// Are arrays containing this inline type flat arrays?
36-
bool ciInlineKlass::flat_in_array() const {
37-
GUARDED_VM_ENTRY(return to_InlineKlass()->flat_array();)
36+
bool ciInlineKlass::maybe_flat_in_array() const {
37+
GUARDED_VM_ENTRY(return to_InlineKlass()->maybe_flat_in_array();)
3838
}
3939

4040
// Can this inline type be passed as multiple values?

src/hotspot/share/ci/ciInlineKlass.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class ciInlineKlass : public ciInstanceKlass {
6060
// Inline type fields
6161
int payload_offset() const;
6262

63-
bool flat_in_array() const;
63+
bool maybe_flat_in_array() const;
6464
bool can_be_passed_as_fields() const;
6565
bool can_be_returned_as_fields() const;
6666
bool is_empty();

src/hotspot/share/ci/ciMetadata.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class ciMetadata: public ciBaseObject {
6161
virtual bool is_obj_array_klass() const { return false; }
6262
virtual bool is_type_array_klass() const { return false; }
6363
virtual bool is_wrapper() const { return false; }
64-
virtual bool flat_in_array() const { return false; }
64+
virtual bool maybe_flat_in_array() const { return false; }
6565
virtual void dump_replay_data(outputStream* st) { /* do nothing */ }
6666

6767
ciMethod* as_method() {

src/hotspot/share/oops/inlineKlass.cpp

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -284,22 +284,14 @@ void InlineKlass::write_value_to_addr(oop src, void* dst, LayoutKind lk, bool de
284284

285285
// Arrays of...
286286

287-
bool InlineKlass::flat_array() {
287+
bool InlineKlass::maybe_flat_in_array() {
288288
if (!UseArrayFlattening) {
289289
return false;
290290
}
291291
// Too many embedded oops
292292
if ((FlatArrayElementMaxOops >= 0) && (nonstatic_oop_count() > FlatArrayElementMaxOops)) {
293293
return false;
294294
}
295-
// Declared atomic but not naturally atomic.
296-
if (must_be_atomic() && !is_naturally_atomic()) {
297-
return false;
298-
}
299-
// VM enforcing AlwaysAtomicAccess only...
300-
if (AlwaysAtomicAccesses && (!is_naturally_atomic())) {
301-
return false;
302-
}
303295
// No flat layout?
304296
if (!has_nullable_atomic_layout() && !has_atomic_layout() && !has_non_atomic_layout()) {
305297
return false;

src/hotspot/share/oops/inlineKlass.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ class InlineKlass: public InstanceKlass {
254254

255255
address payload_addr(oop o) const;
256256

257-
bool flat_array();
257+
bool maybe_flat_in_array();
258258

259259
bool contains_oops() const { return nonstatic_oop_map_count() > 0; }
260260
int nonstatic_oop_count();

src/hotspot/share/opto/graphKit.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3663,7 +3663,7 @@ Node* GraphKit::gen_checkcast(Node* obj, Node* superklass, Node* *failure_contro
36633663
record_for_igvn(region);
36643664

36653665
bool not_inline = !toop->can_be_inline_type();
3666-
bool not_flat_in_array = !UseArrayFlattening || not_inline || (toop->is_inlinetypeptr() && !toop->inline_klass()->flat_in_array());
3666+
bool not_flat_in_array = !UseArrayFlattening || not_inline || (toop->is_inlinetypeptr() && !toop->inline_klass()->maybe_flat_in_array());
36673667
if (EnableValhalla && (not_inline || not_flat_in_array)) {
36683668
// Check if obj has been loaded from an array
36693669
obj = obj->isa_DecodeN() ? obj->in(1) : obj;
@@ -4008,7 +4008,7 @@ Node* GraphKit::get_layout_helper(Node* klass_node, jint& constant_value) {
40084008
if (UseArrayFlattening && !xklass && ary_type != nullptr && !ary_type->is_null_free()) {
40094009
// Don't constant fold if the runtime type might be a flat array but the static type is not.
40104010
const TypeOopPtr* elem = ary_type->elem()->make_oopptr();
4011-
can_be_flat = ary_type->can_be_inline_array() && (!elem->is_inlinetypeptr() || elem->inline_klass()->flat_in_array());
4011+
can_be_flat = ary_type->can_be_inline_array() && (!elem->is_inlinetypeptr() || elem->inline_klass()->maybe_flat_in_array());
40124012
}
40134013
if (!can_be_flat && (xklass || (klass_t->isa_aryklassptr() && klass_t->is_aryklassptr()->elem() != Type::BOTTOM))) {
40144014
jint lhelper;

src/hotspot/share/opto/library_call.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4582,7 +4582,7 @@ bool LibraryCallKit::inline_newArray(bool null_free, bool atomic) {
45824582
ciType* t = tp->java_mirror_type();
45834583
if (t != nullptr && t->is_inlinetype()) {
45844584
ciInlineKlass* vk = t->as_inline_klass();
4585-
bool flat = vk->flat_in_array();
4585+
bool flat = vk->maybe_flat_in_array();
45864586
if (flat && atomic) {
45874587
// Only flat if we have a corresponding atomic layout
45884588
flat = null_free ? vk->has_atomic_layout() : vk->has_nullable_atomic_layout();

0 commit comments

Comments
 (0)