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