From f36e847523819ea488b6fcf4a3c76382d62ec49e Mon Sep 17 00:00:00 2001 From: Vladimir Kozlov Date: Fri, 21 Nov 2014 17:17:41 -0800 Subject: [PATCH] 8065618: C2 RA incorrectly removes kill projections Don't remove KILL projections if their "defining" nodes have SCMemProj projection (memory side effects). Reviewed-by: iveresov --- hotspot/src/share/vm/opto/ifg.cpp | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/hotspot/src/share/vm/opto/ifg.cpp b/hotspot/src/share/vm/opto/ifg.cpp index 91b97f46777..61e13439637 100644 --- a/hotspot/src/share/vm/opto/ifg.cpp +++ b/hotspot/src/share/vm/opto/ifg.cpp @@ -527,6 +527,22 @@ bool PhaseChaitin::remove_node_if_not_used(Block* b, uint location, Node* n, uin 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) {