src/share/vm/opto/ifg.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
8065618 Cdiff src/share/vm/opto/ifg.cpp
src/share/vm/opto/ifg.cpp
Print this page
*** 525,534 ****
--- 525,550 ----
*/
bool PhaseChaitin::remove_node_if_not_used(Block* b, uint location, Node* n, uint lid, IndexSet* liveout) {
Node* def = n->in(0);
if (!n->is_Proj() ||
(_lrg_map.live_range_id(def) && !liveout->member(_lrg_map.live_range_id(def)))) {
+ 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) {
+ return false;
+ }
+ }
+ }
b->remove_node(location);
LRG& lrg = lrgs(lid);
if (lrg._def == n) {
lrg._def = 0;
}
src/share/vm/opto/ifg.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File