Navigation Menu

Skip to content

Commit

Permalink
8285820: C2: LCM prioritizes locally dependent CreateEx nodes over pr…
Browse files Browse the repository at this point in the history
…ojections after 8270090

Backport-of: 89392fb15e9652b7b562b3511f79bda725c5499c
  • Loading branch information
GoeLin committed Jun 10, 2022
1 parent 2da3752 commit 667582d
Showing 1 changed file with 21 additions and 19 deletions.
40 changes: 21 additions & 19 deletions src/hotspot/share/opto/lcm.cpp
Expand Up @@ -489,9 +489,11 @@ void PhaseCFG::implicit_null_check(Block* block, Node *proj, Node *val, int allo

//------------------------------select-----------------------------------------
// Select a nice fellow from the worklist to schedule next. If there is only one
// choice, then use it. CreateEx nodes must start their blocks and are selected
// eagerly. After them, projections take top priority for correctness. Next
// after projections are constants and CheckCastPP nodes. There are a number of
// choice, then use it. CreateEx nodes that are initially ready must start their
// blocks and are given the highest priority, by being placed at the beginning
// of the worklist. Next after initially-ready CreateEx nodes are projections,
// which must follow their parents, and CreateEx nodes with local input
// dependencies. Next are constants and CheckCastPP nodes. There are a number of
// other special cases, for instructions that consume condition codes, et al.
// These are chosen immediately. Some instructions are required to immediately
// precede the last instruction in the block, and these are taken last. Of the
Expand Down Expand Up @@ -529,27 +531,21 @@ Node* PhaseCFG::select(
Node *n = worklist[i]; // Get Node on worklist

int iop = n->is_Mach() ? n->as_Mach()->ideal_Opcode() : 0;
if (iop == Op_CreateEx) {
// CreateEx must start the block (after Phi and Parm nodes which are
// pre-scheduled): select it right away.
if (iop == Op_CreateEx || n->is_Proj()) {
// CreateEx nodes that are initially ready must start the block (after Phi
// and Parm nodes which are pre-scheduled) and get top priority. This is
// currently enforced by placing them at the beginning of the initial
// worklist and selecting them eagerly here. After these, projections and
// other CreateEx nodes are selected with equal priority.
worklist.map(i,worklist.pop());
return n;
}

uint n_choice = 2;
if (n->is_Proj()) {
// Projections should follow their parents.
n_choice = 5;
} else if (n->Opcode() == Op_Con || iop == Op_CheckCastPP) {
if (n->Opcode() == Op_Con || iop == Op_CheckCastPP) {
// Constants and CheckCastPP nodes have higher priority than the rest of
// the nodes tested below.
n_choice = 4;
}

if (n_choice >= 4 && choice < n_choice) {
// n is a constant, a projection, or a CheckCastPP node: record as current
// winner, but keep looking for higher-priority nodes in the worklist.
choice = n_choice;
// the nodes tested below. Record as current winner, but keep looking for
// higher-priority nodes in the worklist.
choice = 4;
// Latency and score are only used to break ties among low-priority nodes.
latency = 0;
score = 0;
Expand All @@ -575,6 +571,8 @@ Node* PhaseCFG::select(
}
}

uint n_choice = 2;

// See if this instruction is consumed by a branch. If so, then (as the
// branch is the last instruction in the basic block) force it to the
// end of the basic block
Expand Down Expand Up @@ -1077,6 +1075,10 @@ bool PhaseCFG::schedule_local(Block* block, GrowableArray<int>& ready_cnt, Vecto
// of the phi to be scheduled first. The select() method breaks
// ties in scheduling by worklist order.
delay.push(m);
} else if (m->is_Mach() && m->as_Mach()->ideal_Opcode() == Op_CreateEx) {
// Place CreateEx nodes that are initially ready at the beginning of the
// worklist so they are selected first and scheduled at the block start.
worklist.insert(0, m);
} else {
worklist.push(m); // Then on to worklist!
}
Expand Down

1 comment on commit 667582d

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

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

Please sign in to comment.