src/hotspot/share/opto/loopnode.cpp
changeset 52925 9c18c9d839d3
parent 52711 f480ad035c73
child 53766 7e4a9e912759
equal deleted inserted replaced
52924:420ff459906f 52925:9c18c9d839d3
  3966       Node* s = mem->fast_out(i);
  3966       Node* s = mem->fast_out(i);
  3967       worklist.push(s);
  3967       worklist.push(s);
  3968     }
  3968     }
  3969     while(worklist.size() != 0 && LCA != early) {
  3969     while(worklist.size() != 0 && LCA != early) {
  3970       Node* s = worklist.pop();
  3970       Node* s = worklist.pop();
  3971       if (s->is_Load() || s->Opcode() == Op_SafePoint ||
  3971       if (s->is_Load() || s->is_ShenandoahBarrier() || s->Opcode() == Op_SafePoint ||
  3972           (s->is_CallStaticJava() && s->as_CallStaticJava()->uncommon_trap_request() != 0)) {
  3972           (s->is_CallStaticJava() && s->as_CallStaticJava()->uncommon_trap_request() != 0)) {
  3973         continue;
  3973         continue;
  3974       } else if (s->is_MergeMem()) {
  3974       } else if (s->is_MergeMem()) {
  3975         for (DUIterator_Fast imax, i = s->fast_outs(imax); i < imax; i++) {
  3975         for (DUIterator_Fast imax, i = s->fast_outs(imax); i < imax; i++) {
  3976           Node* s1 = s->fast_out(i);
  3976           Node* s1 = s->fast_out(i);
  4183 
  4183 
  4184 
  4184 
  4185 //------------------------------build_loop_late_post---------------------------
  4185 //------------------------------build_loop_late_post---------------------------
  4186 // Put Data nodes into some loop nest, by setting the _nodes[]->loop mapping.
  4186 // Put Data nodes into some loop nest, by setting the _nodes[]->loop mapping.
  4187 // Second pass finds latest legal placement, and ideal loop placement.
  4187 // Second pass finds latest legal placement, and ideal loop placement.
  4188 void PhaseIdealLoop::build_loop_late_post( Node *n ) {
  4188 void PhaseIdealLoop::build_loop_late_post(Node *n) {
       
  4189   BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2();
       
  4190 
       
  4191   if (bs->build_loop_late_post(this, n)) {
       
  4192     return;
       
  4193   }
       
  4194 
       
  4195   build_loop_late_post_work(n, true);
       
  4196 }
       
  4197 
       
  4198 void PhaseIdealLoop::build_loop_late_post_work(Node *n, bool pinned) {
  4189 
  4199 
  4190   if (n->req() == 2 && (n->Opcode() == Op_ConvI2L || n->Opcode() == Op_CastII) && !C->major_progress() && !_verify_only) {
  4200   if (n->req() == 2 && (n->Opcode() == Op_ConvI2L || n->Opcode() == Op_CastII) && !C->major_progress() && !_verify_only) {
  4191     _igvn._worklist.push(n);  // Maybe we'll normalize it, if no more loops.
  4201     _igvn._worklist.push(n);  // Maybe we'll normalize it, if no more loops.
  4192   }
  4202   }
  4193 
  4203 
  4204 
  4214 
  4205     // We'd like +VerifyLoopOptimizations to not believe that Mod's/Loads
  4215     // We'd like +VerifyLoopOptimizations to not believe that Mod's/Loads
  4206     // _must_ be pinned (they have to observe their control edge of course).
  4216     // _must_ be pinned (they have to observe their control edge of course).
  4207     // Unlike Stores (which modify an unallocable resource, the memory
  4217     // Unlike Stores (which modify an unallocable resource, the memory
  4208     // state), Mods/Loads can float around.  So free them up.
  4218     // state), Mods/Loads can float around.  So free them up.
  4209     bool pinned = true;
       
  4210     switch( n->Opcode() ) {
  4219     switch( n->Opcode() ) {
  4211     case Op_DivI:
  4220     case Op_DivI:
  4212     case Op_DivF:
  4221     case Op_DivF:
  4213     case Op_DivD:
  4222     case Op_DivD:
  4214     case Op_ModI:
  4223     case Op_ModI:
  4501         }
  4510         }
  4502       }
  4511       }
  4503     }
  4512     }
  4504   }
  4513   }
  4505 }
  4514 }
       
  4515 #endif
  4506 
  4516 
  4507 // Collect a R-P-O for the whole CFG.
  4517 // Collect a R-P-O for the whole CFG.
  4508 // Result list is in post-order (scan backwards for RPO)
  4518 // Result list is in post-order (scan backwards for RPO)
  4509 void PhaseIdealLoop::rpo( Node *start, Node_Stack &stk, VectorSet &visited, Node_List &rpo_list ) const {
  4519 void PhaseIdealLoop::rpo( Node *start, Node_Stack &stk, VectorSet &visited, Node_List &rpo_list ) const {
  4510   stk.push(start, 0);
  4520   stk.push(start, 0);
  4523       rpo_list.push(m);
  4533       rpo_list.push(m);
  4524       stk.pop();
  4534       stk.pop();
  4525     }
  4535     }
  4526   }
  4536   }
  4527 }
  4537 }
  4528 #endif
       
  4529 
  4538 
  4530 
  4539 
  4531 //=============================================================================
  4540 //=============================================================================
  4532 //------------------------------LoopTreeIterator-----------------------------------
  4541 //------------------------------LoopTreeIterator-----------------------------------
  4533 
  4542