< prev index next >

src/hotspot/share/opto/memnode.cpp

Print this page

        

*** 3172,3212 **** leading->_pair_idx = leading->_idx; #endif } MemBarNode* MemBarNode::trailing_membar() const { Node* trailing = (Node*)this; VectorSet seen(Thread::current()->resource_area()); ! while (!trailing->is_MemBar() || !trailing->as_MemBar()->trailing()) { ! if (seen.test_set(trailing->_idx)) { ! // Dying subgraph? ! return NULL; } - for (DUIterator_Fast jmax, j = trailing->fast_outs(jmax); j < jmax; j++) { - Node* next = trailing->fast_out(j); - if (next != trailing && next->is_CFG()) { trailing = next; break; } } } MemBarNode* mb = trailing->as_MemBar(); assert((mb->_kind == TrailingStore && _kind == LeadingStore) || (mb->_kind == TrailingLoadStore && _kind == LeadingLoadStore), "bad trailing membar"); assert(mb->_pair_idx == _pair_idx, "bad trailing membar"); return mb; } MemBarNode* MemBarNode::leading_membar() const { VectorSet seen(Thread::current()->resource_area()); Node* leading = in(0); while (leading != NULL && (!leading->is_MemBar() || !leading->as_MemBar()->leading())) { ! if (seen.test_set(leading->_idx)) { ! // Dying subgraph? return NULL; } if (leading->is_Region()) { leading = leading->in(1); } else { leading = leading->in(0); } } --- 3172,3250 ---- leading->_pair_idx = leading->_idx; #endif } MemBarNode* MemBarNode::trailing_membar() const { + ResourceMark rm; Node* trailing = (Node*)this; VectorSet seen(Thread::current()->resource_area()); ! Node_Stack multis(0); ! do { ! Node* c = trailing; ! uint i = 0; ! do { ! trailing = NULL; ! for (; i < c->outcnt(); i++) { ! Node* next = c->raw_out(i); ! if (next != c && next->is_CFG()) { ! if (c->is_MultiBranch()) { ! if (multis.node() == c) { ! multis.set_index(i+1); ! } else { ! multis.push(c, i+1); ! } } trailing = next; break; } } + if (trailing != NULL && !seen.test_set(trailing->_idx)) { + break; + } + while (multis.size() > 0) { + c = multis.node(); + i = multis.index(); + if (i < c->req()) { + break; + } + multis.pop(); } + } while (multis.size() > 0); + } while (!trailing->is_MemBar() || !trailing->as_MemBar()->trailing()); + MemBarNode* mb = trailing->as_MemBar(); assert((mb->_kind == TrailingStore && _kind == LeadingStore) || (mb->_kind == TrailingLoadStore && _kind == LeadingLoadStore), "bad trailing membar"); assert(mb->_pair_idx == _pair_idx, "bad trailing membar"); return mb; } MemBarNode* MemBarNode::leading_membar() const { + ResourceMark rm; VectorSet seen(Thread::current()->resource_area()); + Node_Stack regions(0); Node* leading = in(0); while (leading != NULL && (!leading->is_MemBar() || !leading->as_MemBar()->leading())) { ! while (leading == NULL || leading->is_top() || seen.test_set(leading->_idx)) { ! leading = NULL; ! while (regions.size() > 0) { ! Node* r = regions.node(); ! uint i = regions.index(); ! if (i < r->req()) { ! leading = r->in(i); ! regions.set_index(i+1); ! } else { ! regions.pop(); ! } ! } ! if (leading == NULL) { ! assert(regions.size() == 0, "all paths should have been tried"); return NULL; } + } if (leading->is_Region()) { + regions.push(leading, 2); leading = leading->in(1); } else { leading = leading->in(0); } }
< prev index next >