< prev index next >

src/hotspot/share/opto/memnode.cpp

Print this page




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()) {


< prev index next >