3157 3158 void MemBarNode::set_store_pair(MemBarNode* leading, MemBarNode* trailing) { 3159 trailing->_kind = TrailingStore; 3160 leading->_kind = LeadingStore; 3161 #ifdef ASSERT 3162 trailing->_pair_idx = leading->_idx; 3163 leading->_pair_idx = leading->_idx; 3164 #endif 3165 } 3166 3167 void MemBarNode::set_load_store_pair(MemBarNode* leading, MemBarNode* trailing) { 3168 trailing->_kind = TrailingLoadStore; 3169 leading->_kind = LeadingLoadStore; 3170 #ifdef ASSERT 3171 trailing->_pair_idx = leading->_idx; 3172 leading->_pair_idx = leading->_idx; 3173 #endif 3174 } 3175 3176 MemBarNode* MemBarNode::trailing_membar() const { 3177 Node* trailing = (Node*)this; 3178 VectorSet seen(Thread::current()->resource_area()); 3179 while (!trailing->is_MemBar() || !trailing->as_MemBar()->trailing()) { 3180 if (seen.test_set(trailing->_idx)) { 3181 // Dying subgraph? 3182 return NULL; 3183 } 3184 for (DUIterator_Fast jmax, j = trailing->fast_outs(jmax); j < jmax; j++) { 3185 Node* next = trailing->fast_out(j); 3186 if (next != trailing && next->is_CFG()) { 3187 trailing = next; 3188 break; 3189 } 3190 } 3191 } 3192 MemBarNode* mb = trailing->as_MemBar(); 3193 assert((mb->_kind == TrailingStore && _kind == LeadingStore) || 3194 (mb->_kind == TrailingLoadStore && _kind == LeadingLoadStore), "bad trailing membar"); 3195 assert(mb->_pair_idx == _pair_idx, "bad trailing membar"); 3196 return mb; 3197 } 3198 3199 MemBarNode* MemBarNode::leading_membar() const { 3200 VectorSet seen(Thread::current()->resource_area()); 3201 Node* leading = in(0); 3202 while (leading != NULL && (!leading->is_MemBar() || !leading->as_MemBar()->leading())) { 3203 if (seen.test_set(leading->_idx)) { 3204 // Dying subgraph? 3205 return NULL; 3206 } 3207 if (leading->is_Region()) { 3208 leading = leading->in(1); 3209 } else { 3210 leading = leading->in(0); 3211 } 3212 } 3213 #ifdef ASSERT 3214 Unique_Node_List wq; 3215 wq.push((Node*)this); 3216 uint found = 0; 3217 for (uint i = 0; i < wq.size(); i++) { 3218 Node* n = wq.at(i); 3219 if (n->is_Region()) { 3220 for (uint j = 1; j < n->req(); j++) { 3221 Node* in = n->in(j); 3222 if (in != NULL && !in->is_top()) { 3223 wq.push(in); 3224 } 3225 } 3226 } else { 3227 if (n->is_MemBar() && n->as_MemBar()->leading()) { | 3157 3158 void MemBarNode::set_store_pair(MemBarNode* leading, MemBarNode* trailing) { 3159 trailing->_kind = TrailingStore; 3160 leading->_kind = LeadingStore; 3161 #ifdef ASSERT 3162 trailing->_pair_idx = leading->_idx; 3163 leading->_pair_idx = leading->_idx; 3164 #endif 3165 } 3166 3167 void MemBarNode::set_load_store_pair(MemBarNode* leading, MemBarNode* trailing) { 3168 trailing->_kind = TrailingLoadStore; 3169 leading->_kind = LeadingLoadStore; 3170 #ifdef ASSERT 3171 trailing->_pair_idx = leading->_idx; 3172 leading->_pair_idx = leading->_idx; 3173 #endif 3174 } 3175 3176 MemBarNode* MemBarNode::trailing_membar() const { 3177 ResourceMark rm; 3178 Node* trailing = (Node*)this; 3179 VectorSet seen(Thread::current()->resource_area()); 3180 Node_Stack multis(0); 3181 do { 3182 Node* c = trailing; 3183 uint i = 0; 3184 do { 3185 trailing = NULL; 3186 for (; i < c->outcnt(); i++) { 3187 Node* next = c->raw_out(i); 3188 if (next != c && next->is_CFG()) { 3189 if (c->is_MultiBranch()) { 3190 if (multis.node() == c) { 3191 multis.set_index(i+1); 3192 } else { 3193 multis.push(c, i+1); 3194 } 3195 } 3196 trailing = next; 3197 break; 3198 } 3199 } 3200 if (trailing != NULL && !seen.test_set(trailing->_idx)) { 3201 break; 3202 } 3203 while (multis.size() > 0) { 3204 c = multis.node(); 3205 i = multis.index(); 3206 if (i < c->req()) { 3207 break; 3208 } 3209 multis.pop(); 3210 } 3211 } while (multis.size() > 0); 3212 } while (!trailing->is_MemBar() || !trailing->as_MemBar()->trailing()); 3213 3214 MemBarNode* mb = trailing->as_MemBar(); 3215 assert((mb->_kind == TrailingStore && _kind == LeadingStore) || 3216 (mb->_kind == TrailingLoadStore && _kind == LeadingLoadStore), "bad trailing membar"); 3217 assert(mb->_pair_idx == _pair_idx, "bad trailing membar"); 3218 return mb; 3219 } 3220 3221 MemBarNode* MemBarNode::leading_membar() const { 3222 ResourceMark rm; 3223 VectorSet seen(Thread::current()->resource_area()); 3224 Node_Stack regions(0); 3225 Node* leading = in(0); 3226 while (leading != NULL && (!leading->is_MemBar() || !leading->as_MemBar()->leading())) { 3227 while (leading == NULL || leading->is_top() || seen.test_set(leading->_idx)) { 3228 leading = NULL; 3229 while (regions.size() > 0) { 3230 Node* r = regions.node(); 3231 uint i = regions.index(); 3232 if (i < r->req()) { 3233 leading = r->in(i); 3234 regions.set_index(i+1); 3235 } else { 3236 regions.pop(); 3237 } 3238 } 3239 if (leading == NULL) { 3240 assert(regions.size() == 0, "all paths should have been tried"); 3241 return NULL; 3242 } 3243 } 3244 if (leading->is_Region()) { 3245 regions.push(leading, 2); 3246 leading = leading->in(1); 3247 } else { 3248 leading = leading->in(0); 3249 } 3250 } 3251 #ifdef ASSERT 3252 Unique_Node_List wq; 3253 wq.push((Node*)this); 3254 uint found = 0; 3255 for (uint i = 0; i < wq.size(); i++) { 3256 Node* n = wq.at(i); 3257 if (n->is_Region()) { 3258 for (uint j = 1; j < n->req(); j++) { 3259 Node* in = n->in(j); 3260 if (in != NULL && !in->is_top()) { 3261 wq.push(in); 3262 } 3263 } 3264 } else { 3265 if (n->is_MemBar() && n->as_MemBar()->leading()) { |