< prev index next >

src/hotspot/share/opto/matcher.cpp

Print this page

        

@@ -1,7 +1,7 @@
 /*
- * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2018, Oracle and/or its affiliates. All rights reserved.
  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  *
  * This code is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License version 2 only, as
  * published by the Free Software Foundation.

@@ -42,10 +42,13 @@
 #include "runtime/sharedRuntime.hpp"
 #include "utilities/align.hpp"
 #if INCLUDE_ZGC
 #include "gc/z/zBarrierSetRuntime.hpp"
 #endif // INCLUDE_ZGC
+#if INCLUDE_SHENANDOAHGC
+#include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
+#endif
 
 OptoReg::Name OptoReg::c_frame_pointer;
 
 const RegMask *Matcher::idealreg2regmask[_last_machine_leaf];
 RegMask Matcher::mreg2regmask[_last_Mach_Reg];

@@ -1000,10 +1003,13 @@
             // Calls match special.  They match alone with no children.
             // Their children, the incoming arguments, match normally.
             m = n->is_SafePoint() ? match_sfpt(n->as_SafePoint()):match_tree(n);
             if (C->failing())  return NULL;
             if (m == NULL) { Matcher::soft_match_failure(); return NULL; }
+            if (n->is_MemBar()) {
+              m->as_MachMemBar()->set_adr_type(n->adr_type());
+            }
           } else {                  // Nothing the matcher cares about
             if (n->is_Proj() && n->in(0) != NULL && n->in(0)->is_Multi()) {       // Projections?
               // Convert to machine-dependent projection
               m = n->in(0)->as_Multi()->match( n->as_Proj(), this );
 #ifdef ASSERT

@@ -2152,10 +2158,19 @@
         break;
       case Op_ClearArray:
       case Op_SafePoint:
         mem_op = true;
         break;
+#if INCLUDE_SHENANDOAHGC
+      case Op_ShenandoahReadBarrier:
+        if (n->in(ShenandoahBarrierNode::ValueIn)->is_DecodeNarrowPtr()) {
+          set_shared(n->in(ShenandoahBarrierNode::ValueIn)->in(1));
+        }
+        mem_op = true;
+        set_shared(n);
+        break;
+#endif
 #if INCLUDE_ZGC
       case Op_CallLeaf:
         if (UseZGC) {
           if (n->as_Call()->entry_point() == ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr() ||
               n->as_Call()->entry_point() == ZBarrierSetRuntime::load_barrier_on_weak_oop_field_preloaded_addr()) {
< prev index next >