< prev index next >

src/share/vm/opto/mulnode.cpp

Print this page

        

@@ -28,10 +28,14 @@
 #include "opto/connode.hpp"
 #include "opto/memnode.hpp"
 #include "opto/mulnode.hpp"
 #include "opto/phaseX.hpp"
 #include "opto/subnode.hpp"
+#include "utilities/macros.hpp"
+#if INCLUDE_ALL_GCS
+#include "gc_implementation/shenandoah/c2/shenandoahSupport.hpp"
+#endif
 
 // Portions of code courtesy of Clifford Click
 
 
 //=============================================================================

@@ -471,10 +475,19 @@
   if( !t2 || !t2->is_con() ) return MulNode::Ideal(phase, can_reshape);
   const int mask = t2->get_con();
   Node *load = in(1);
   uint lop = load->Opcode();
 
+#if INCLUDE_ALL_GCS
+  if (UseShenandoahGC && ShenandoahBarrierC2Support::is_gc_state_load(load)) {
+    // Do not touch the load+mask, we would match the whole sequence exactly.
+    // Converting the load to LoadUB/LoadUS would mismatch and waste a register
+    // on the barrier fastpath.
+    return NULL;
+  }
+#endif
+
   // Masking bits off of a Character?  Hi bits are already zero.
   if( lop == Op_LoadUS &&
       (mask & 0xFFFF0000) )     // Can we make a smaller mask?
     return new (phase->C) AndINode(load,phase->intcon(mask&0xFFFF));
 
< prev index next >