changeset 20686:dc763d49b82d

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
author kvn
date Tue, 02 Dec 2014 12:08:41 -0800
parents 0b86bdf28e07
children a8ebd6f1b030
files src/share/vm/opto/ifg.cpp
diffstat 1 files changed, 16 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/share/vm/opto/ifg.cpp	Tue Dec 02 18:09:39 2014 +0000
+++ b/src/share/vm/opto/ifg.cpp	Tue Dec 02 12:08:41 2014 -0800
@@ -541,6 +541,22 @@
           if( !n->is_Proj() ||
               // Could also be a flags-projection of a dead ADD or such.
               (_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;
+                }
+              }
+            }
             block->remove_node(j - 1);
             if (lrgs(r)._def == n) {
               lrgs(r)._def = 0;