< prev index next >
src/share/vm/opto/phaseX.cpp
Print this page
*** 32,41 ****
--- 32,42 ----
#include "opto/machnode.hpp"
#include "opto/opcodes.hpp"
#include "opto/phaseX.hpp"
#include "opto/regalloc.hpp"
#include "opto/rootnode.hpp"
+ #include "opto/shenandoahSupport.hpp"
//=============================================================================
#define NODE_HASH_MINIMUM_SIZE 255
//------------------------------NodeHash---------------------------------------
NodeHash::NodeHash(uint est_max_size) :
*** 563,572 ****
--- 564,605 ----
}
}
#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------------------------------------
// Set minimum table size to "255"
PhaseValues::PhaseValues( Arena *arena, uint est_max_size ) : PhaseTransform(arena, GVN), _table(arena, est_max_size) {
*** 1188,1197 ****
--- 1221,1233 ----
// If 'k' computes a constant, replace it with a constant
if (t->singleton() && !k->is_Con()) {
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;
}
// Now check for Identities
< prev index next >