@@ -4256,7 +4256,7 @@ bool LibraryCallKit::inline_native_subtype_check() {
42564256
42574257// ---------------------generate_array_guard_common------------------------
42584258Node* LibraryCallKit::generate_array_guard_common (Node* kls, RegionNode* region,
4259- bool obj_array, bool not_array) {
4259+ bool obj_array, bool not_array, Node** obj ) {
42604260
42614261 if (stopped ()) {
42624262 return nullptr ;
@@ -4298,7 +4298,14 @@ Node* LibraryCallKit::generate_array_guard_common(Node* kls, RegionNode* region,
42984298 // invert the test if we are looking for a non-array
42994299 if (not_array) btest = BoolTest (btest).negate ();
43004300 Node* bol = _gvn.transform (new BoolNode (cmp, btest));
4301- return generate_fair_guard (bol, region);
4301+ Node* ctrl = generate_fair_guard (bol, region);
4302+ Node* is_array_ctrl = not_array ? control () : ctrl;
4303+ if (obj != nullptr && is_array_ctrl != nullptr && is_array_ctrl != top ()) {
4304+ // Keep track of the fact that 'obj' is an array to prevent
4305+ // array specific accesses from floating above the guard.
4306+ *obj = _gvn.transform (new CastPPNode (is_array_ctrl, *obj, TypeAryPtr::BOTTOM));
4307+ }
4308+ return ctrl;
43024309}
43034310
43044311
@@ -4393,7 +4400,7 @@ bool LibraryCallKit::inline_native_getLength() {
43934400 if (stopped ()) return true ;
43944401
43954402 // Deoptimize if it is a non-array.
4396- Node* non_array = generate_non_array_guard (load_object_klass (array), nullptr );
4403+ Node* non_array = generate_non_array_guard (load_object_klass (array), nullptr , &array );
43974404
43984405 if (non_array != nullptr ) {
43994406 PreserveJVMState pjvms (this );
@@ -5253,12 +5260,13 @@ bool LibraryCallKit::inline_native_clone(bool is_virtual) {
52535260 record_for_igvn (result_reg);
52545261
52555262 Node* obj_klass = load_object_klass (obj);
5256- Node* array_ctl = generate_array_guard (obj_klass, (RegionNode*)nullptr );
5263+ Node* array_obj = obj;
5264+ Node* array_ctl = generate_array_guard (obj_klass, (RegionNode*)nullptr , &array_obj);
52575265 if (array_ctl != nullptr ) {
52585266 // It's an array.
52595267 PreserveJVMState pjvms (this );
52605268 set_control (array_ctl);
5261- Node* obj_length = load_array_length (obj );
5269+ Node* obj_length = load_array_length (array_obj );
52625270 Node* array_size = nullptr ; // Size of the array without object alignment padding.
52635271 Node* alloc_obj = new_array (obj_klass, obj_length, 0 , &array_size, /* deoptimize_on_exception=*/ true );
52645272
@@ -5272,7 +5280,7 @@ bool LibraryCallKit::inline_native_clone(bool is_virtual) {
52725280 set_control (is_obja);
52735281 // Generate a direct call to the right arraycopy function(s).
52745282 // Clones are always tightly coupled.
5275- ArrayCopyNode* ac = ArrayCopyNode::make (this , true , obj , intcon (0 ), alloc_obj, intcon (0 ), obj_length, true , false );
5283+ ArrayCopyNode* ac = ArrayCopyNode::make (this , true , array_obj , intcon (0 ), alloc_obj, intcon (0 ), obj_length, true , false );
52765284 ac->set_clone_oop_array ();
52775285 Node* n = _gvn.transform (ac);
52785286 assert (n == ac, " cannot disappear" );
@@ -5293,7 +5301,7 @@ bool LibraryCallKit::inline_native_clone(bool is_virtual) {
52935301 // the object.)
52945302
52955303 if (!stopped ()) {
5296- copy_to_clone (obj , alloc_obj, array_size, true );
5304+ copy_to_clone (array_obj , alloc_obj, array_size, true );
52975305
52985306 // Present the results of the copy.
52995307 result_reg->init_req (_array_path, control ());
@@ -5914,8 +5922,8 @@ bool LibraryCallKit::inline_arraycopy() {
59145922 record_for_igvn (slow_region);
59155923
59165924 // (1) src and dest are arrays.
5917- generate_non_array_guard (load_object_klass (src), slow_region);
5918- generate_non_array_guard (load_object_klass (dest), slow_region);
5925+ generate_non_array_guard (load_object_klass (src), slow_region, &src );
5926+ generate_non_array_guard (load_object_klass (dest), slow_region, &dest );
59195927
59205928 // (2) src and dest arrays must have elements of the same BasicType
59215929 // done at macro expansion or at Ideal transformation time
@@ -8531,7 +8539,7 @@ bool LibraryCallKit::inline_getObjectSize() {
85318539 PhiNode* result_val = new PhiNode (result_reg, TypeLong::LONG);
85328540 record_for_igvn (result_reg);
85338541
8534- Node* array_ctl = generate_array_guard (klass_node, nullptr );
8542+ Node* array_ctl = generate_array_guard (klass_node, nullptr , &obj );
85358543 if (array_ctl != nullptr ) {
85368544 // Array case: size is round(header + element_size*arraylength).
85378545 // Since arraylength is different for every array instance, we have to
0 commit comments