< prev index next >
src/share/vm/opto/superword.cpp
Print this page
*** 1686,1696 ****
Node *n = lp()->fast_out(i);
if (in_bb(n) && (n->is_Phi() && n->bottom_type() == Type::MEMORY)) {
Node* n_tail = n->in(LoopNode::LoopBackControl);
if (n_tail != n->in(LoopNode::EntryControl)) {
if (!n_tail->is_Mem()) {
! assert(n_tail->is_Mem(), err_msg_res("unexpected node for memory slice: %s", n_tail->Name()));
return false; // Bailout
}
_mem_slice_head.push(n);
_mem_slice_tail.push(n_tail);
}
--- 1686,1696 ----
Node *n = lp()->fast_out(i);
if (in_bb(n) && (n->is_Phi() && n->bottom_type() == Type::MEMORY)) {
Node* n_tail = n->in(LoopNode::LoopBackControl);
if (n_tail != n->in(LoopNode::EntryControl)) {
if (!n_tail->is_Mem()) {
! assert(n_tail->is_Mem() || n_tail == n, err_msg_res("unexpected node for memory slice: %s", n_tail->Name()));
return false; // Bailout
}
_mem_slice_head.push(n);
_mem_slice_tail.push(n_tail);
}
*** 2315,2324 ****
--- 2315,2345 ----
//unsafe reference could not be aligned appropriately without runtime checking
if (base == NULL || base->bottom_type() == Type::TOP) {
assert(!valid(), "unsafe access");
return;
}
+ if (UseShenandoahGC) {
+ // Detect a Shenandoah write barrier between the pre and main loop
+ // (which could break loop alignment code)
+ CountedLoopNode *main_head = slp->lp()->as_CountedLoop();
+ if (main_head->is_main_loop()) {
+ Node* c = main_head->in(LoopNode::EntryControl)->in(0)->in(0)->in(0);
+ if (!c->is_CountedLoopEnd()) {
+ // in case of a reserve copy
+ c = c->in(0)->in(0);
+ assert(c->is_CountedLoopEnd(), "where's the pre loop?");
+ }
+ CountedLoopEndNode* pre_end = c->as_CountedLoopEnd();
+ CountedLoopNode* pre_loop = pre_end->loopnode();
+ assert(pre_loop->is_pre_loop(), "where's the pre loop?");
+
+ Node* base_c = phase()->get_ctrl(base);
+ if (!phase()->is_dominator(base_c, pre_loop)) {
+ return;
+ }
+ }
+ }
for (int i = 0; i < 3; i++) {
if (!scaled_iv_plus_offset(adr->in(AddPNode::Offset))) {
assert(!valid(), "too complex");
return;
}
< prev index next >