Skip to content

Commit

Permalink
8331194: NPE in ArrayCreationTree.java with -XX:-UseCompressedOops
Browse files Browse the repository at this point in the history
Reviewed-by: kvn
Backport-of: 005fb67
  • Loading branch information
TobiHartmann committed Jul 17, 2024
1 parent 024b39c commit ec1782c
Show file tree
Hide file tree
Showing 4 changed files with 112 additions and 1 deletion.
4 changes: 4 additions & 0 deletions src/hotspot/share/opto/machnode.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -870,6 +870,10 @@ class MachSafePointNode : public MachReturnNode {
assert(verify_jvms(jvms), "jvms must match");
return in(_jvmadj + jvms->monitor_box_offset(idx));
}
Node* scalarized_obj(const JVMState* jvms, uint idx) const {
assert(verify_jvms(jvms), "jvms must match");
return in(_jvmadj + jvms->scloff() + idx);
}
void set_local(const JVMState* jvms, uint idx, Node *c) {
assert(verify_jvms(jvms), "jvms must match");
set_req(_jvmadj + jvms->locoff() + idx, c);
Expand Down
26 changes: 25 additions & 1 deletion src/hotspot/share/opto/output.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -974,6 +974,27 @@ bool PhaseOutput::contains_as_owner(GrowableArray<MonitorValue*> *monarray, Obje
return false;
}

// Determine if there is a scalar replaced object description represented by 'ov'.
bool PhaseOutput::contains_as_scalarized_obj(JVMState* jvms, MachSafePointNode* sfn,
GrowableArray<ScopeValue*>* objs,
ObjectValue* ov) const {
for (int i = 0; i < jvms->scl_size(); i++) {
Node* n = sfn->scalarized_obj(jvms, i);
// Other kinds of nodes that we may encounter here, for instance constants
// representing values of fields of objects scalarized, aren't relevant for
// us, since they don't map to ObjectValue.
if (!n->is_SafePointScalarObject()) {
continue;
}

ObjectValue* other = (ObjectValue*) sv_for_node_id(objs, n->_idx);
if (ov == other) {
return true;
}
}
return false;
}

//--------------------------Process_OopMap_Node--------------------------------
void PhaseOutput::Process_OopMap_Node(MachNode *mach, int current_offset) {
// Handle special safepoint nodes for synchronization
Expand Down Expand Up @@ -1137,7 +1158,10 @@ void PhaseOutput::Process_OopMap_Node(MachNode *mach, int current_offset) {

for (int j = 0; j< merge->possible_objects()->length(); j++) {
ObjectValue* ov = merge->possible_objects()->at(j)->as_ObjectValue();
bool is_root = locarray->contains(ov) || exparray->contains(ov) || contains_as_owner(monarray, ov);
bool is_root = locarray->contains(ov) ||
exparray->contains(ov) ||
contains_as_owner(monarray, ov) ||
contains_as_scalarized_obj(jvms, sfn, objs, ov);
ov->set_root(is_root);
}
}
Expand Down
3 changes: 3 additions & 0 deletions src/hotspot/share/opto/output.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,9 @@ class PhaseOutput : public Phase {

bool starts_bundle(const Node *n) const;
bool contains_as_owner(GrowableArray<MonitorValue*> *monarray, ObjectValue *ov) const;
bool contains_as_scalarized_obj(JVMState* jvms, MachSafePointNode* sfn,
GrowableArray<ScopeValue*>* objs,
ObjectValue* ov) const;

// Dump formatted assembly
#if defined(SUPPORT_OPTO_ASSEMBLY)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* Copyright (c) 2024, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/

/*
* @test
* @bug 8331194
* @summary Check that Reduce Allocation Merges doesn't crash when an input
* of the Phi is not the _current_ output of the Phi but said input
* needs to be rematerialized because it's used regardless of the
* Phi output.
* @run main/othervm -XX:CompileCommand=dontinline,*TestReduceAllocationAndNestedScalarized*::test
* -XX:CompileCommand=compileonly,*TestReduceAllocationAndNestedScalarized*::test
* -XX:CompileCommand=compileonly,*Picture*::*init*
* -XX:CompileCommand=compileonly,*Point*::*init*
* -XX:CompileCommand=exclude,*Unloaded*::*
* -XX:+IgnoreUnrecognizedVMOptions
* -XX:-TieredCompilation
* -XX:-UseCompressedOops
* -Xcomp
* -server
* compiler.escapeAnalysis.TestReduceAllocationAndNestedScalarized
* @run main compiler.escapeAnalysis.TestReduceAllocationAndNestedScalarized
*/

package compiler.escapeAnalysis;

public class TestReduceAllocationAndNestedScalarized {
static class Picture {
public Point first;
public Point second;
}

static class Point {
int x;
}

static class Unloaded {
}

static int test(boolean cond) {
Picture p = new Picture();
p.first = new Point();
Point p2 = p.first;

if (cond) p2 = new Point();

p.second = p2;

new Unloaded();

return p.first.x;
}

public static void main(String[] args) {
Picture pic = new Picture();
Point pnt = new Point();
int res = test(true);
System.out.println("Result is: " + res);
}
}

3 comments on commit ec1782c

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JesperIRL
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/tag jdk-23+32

@openjdk
Copy link

@openjdk openjdk bot commented on ec1782c Jul 18, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@JesperIRL The tag jdk-23+32 was successfully created.

Please sign in to comment.