changeset 56609:63a62cc10a0a

8224580: Matcher can cause oop field/array element to be reloaded Reviewed-by: neliasso, rkennke, dlong
author roland
date Tue, 21 May 2019 09:08:01 +0200
parents ce8bab2c4185
children ec621f7f95f2
files src/hotspot/share/opto/matcher.cpp
diffstat 1 files changed, 6 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/src/hotspot/share/opto/matcher.cpp	Wed Jun 05 12:02:01 2019 +0100
+++ b/src/hotspot/share/opto/matcher.cpp	Tue May 21 09:08:01 2019 +0200
@@ -2066,6 +2066,12 @@
         // Node is shared and has no reason to clone.  Flag it as shared.
         // This causes it to match into a register for the sharing.
         set_shared(n);       // Flag as shared and
+        if (n->is_DecodeNarrowPtr()) {
+          // Oop field/array element loads must be shared but since
+          // they are shared through a DecodeN they may appear to have
+          // a single use so force sharing here.
+          set_shared(n->in(1));
+        }
         mstack.pop();        // remove node from stack
         continue;
       }
@@ -2098,13 +2104,6 @@
           continue; // for(int i = ...)
         }
 
-        if( mop == Op_AddP && m->in(AddPNode::Base)->is_DecodeNarrowPtr()) {
-          // Bases used in addresses must be shared but since
-          // they are shared through a DecodeN they may appear
-          // to have a single use so force sharing here.
-          set_shared(m->in(AddPNode::Base)->in(1));
-        }
-
         // if 'n' and 'm' are part of a graph for BMI instruction, clone this node.
 #ifdef X86
         if (UseBMI1Instructions && is_bmi_pattern(n, m)) {