< 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 >