src/share/vm/opto/ifg.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
8065618_7u Cdiff src/share/vm/opto/ifg.cpp
src/share/vm/opto/ifg.cpp
Print this page
rev 5451 : 8065618: C2 RA incorrectly removes kill projections
Summary: Don't remove KILL projections if their "defining" nodes have SCMemProj projection (memory side effects).
Reviewed-by: iveresov, roland
rev 5452 : 8066649: 8u backport for 8065618 is incorrect
Summary: The new code in 8u backport should guard the execution of the following code instead of return.
Reviewed-by: iveresov
*** 569,588 ****
--- 569,608 ----
if( !liveout.member(r) && n->Opcode() != Op_SafePoint ) {
Node *def = n->in(0);
if( !n->is_Proj() ||
// Could also be a flags-projection of a dead ADD or such.
(n2lidx(def) && !liveout.member(n2lidx(def)) ) ) {
+ bool remove = true;
+ if (n->is_MachProj()) {
+ // Don't remove KILL projections if their "defining" nodes have
+ // memory effects (have SCMemProj projection node) -
+ // they are not dead even when their result is not used.
+ // For example, compareAndSwapL (and other CAS) and EncodeISOArray nodes.
+ // The method add_input_to_liveout() keeps such nodes alive (put them on liveout list)
+ // when it sees SCMemProj node in a block. Unfortunately SCMemProj node could be placed
+ // in block in such order that KILL MachProj nodes are processed first.
+ uint cnt = def->outcnt();
+ for (uint i = 0; i < cnt; i++) {
+ Node* proj = def->raw_out(i);
+ if (proj->Opcode() == Op_SCMemProj) {
+ remove = false;
+ break;
+ }
+ }
+ }
+ if (remove) {
b->_nodes.remove(j - 1);
if( lrgs(r)._def == n ) lrgs(r)._def = 0;
n->disconnect_inputs(NULL, C);
_cfg._bbs.map(n->_idx,NULL);
n->replace_by(C->top());
// Since yanking a Node from block, high pressure moves up one
hrp_index[0]--;
hrp_index[1]--;
continue;
}
+ }
// Fat-projections kill many registers which cannot be used to
// hold live ranges.
if( lrgs(r)._fat_proj ) {
// Count the int-only registers
src/share/vm/opto/ifg.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File