--- old/src/share/vm/opto/phaseX.cpp 2015-10-08 22:15:54.540139873 +0200 +++ new/src/share/vm/opto/phaseX.cpp 2015-10-08 22:15:54.489141091 +0200 @@ -34,6 +34,7 @@ #include "opto/phaseX.hpp" #include "opto/regalloc.hpp" #include "opto/rootnode.hpp" +#include "opto/shenandoahSupport.hpp" //============================================================================= #define NODE_HASH_MINIMUM_SIZE 255 @@ -565,6 +566,38 @@ #endif +bool PhaseTransform::eqv(const Node* n1, const Node* n2) const { + if (UseShenandoahGC) { + + if (n1 == n2) return true; + + if (n1 == NULL || n2 == NULL) return false; + + if (n1->is_AddP() && n2->is_AddP()) { + Node* addp1 = n1->as_AddP(); + Node* base1 = addp1->in(AddPNode::Base); + Node* addr1 = addp1->in(AddPNode::Address); + Node* offs1 = addp1->in(AddPNode::Offset); + + Node* addp2 = n2->as_AddP(); + Node* base2 = addp2->in(AddPNode::Base); + Node* addr2 = addp2->in(AddPNode::Address); + Node* offs2 = addp2->in(AddPNode::Offset); + + if (base1 == addr1 && base2 == addr2) { + + addr1 = ShenandoahBarrierNode::skip_through_barrier(addr1); + addr2 = ShenandoahBarrierNode::skip_through_barrier(addr2); + + if (addr1 == addr2 && offs1 == offs2) return true; + } + + } + return false; + } else { + return n1 == n2; + } +} //============================================================================= //------------------------------PhaseValues------------------------------------ @@ -1190,6 +1223,9 @@ NOT_PRODUCT(set_progress();) Node* con = makecon(t); // Make a constant add_users_to_worklist(k); + if (k->Opcode() == Op_ShenandoahWriteBarrier) { + assert(con->is_top(), "can only replace barrier with top"); + } subsume_node(k, con); // Everybody using k now uses con return con; }