src/share/vm/opto/superword.cpp

changeset 9776
ce42ae95d4d6
parent 9768
eaae2ae06faf
child 9806
758c07667682
child 9977
e649f2136368
     1.1 --- a/src/share/vm/opto/superword.cpp	Fri Feb 27 11:41:42 2015 +0300
     1.2 +++ b/src/share/vm/opto/superword.cpp	Tue Oct 08 15:38:35 2019 +0200
     1.3 @@ -2208,15 +2208,25 @@
     1.4  
     1.5  //----------------------------get_pre_loop_end---------------------------
     1.6  // Find pre loop end from main loop.  Returns null if none.
     1.7 -CountedLoopEndNode* SuperWord::get_pre_loop_end(CountedLoopNode *cl) {
     1.8 -  Node *ctrl = cl->in(LoopNode::EntryControl);
     1.9 +CountedLoopEndNode* SuperWord::get_pre_loop_end(CountedLoopNode* cl) {
    1.10 +  Node* ctrl = cl->in(LoopNode::EntryControl);
    1.11    if (!ctrl->is_IfTrue() && !ctrl->is_IfFalse()) return NULL;
    1.12 -  Node *iffm = ctrl->in(0);
    1.13 +  Node* iffm = ctrl->in(0);
    1.14    if (!iffm->is_If()) return NULL;
    1.15 -  Node *p_f = iffm->in(0);
    1.16 +  Node* bolzm = iffm->in(1);
    1.17 +  if (!bolzm->is_Bool()) return NULL;
    1.18 +  Node* cmpzm = bolzm->in(1);
    1.19 +  if (!cmpzm->is_Cmp()) return NULL;
    1.20 +  Node* opqzm = cmpzm->in(2);
    1.21 +  // Can not optimize a loop if zero-trip Opaque1 node is optimized
    1.22 +  // away and then another round of loop opts attempted.
    1.23 +  if (opqzm->Opcode() != Op_Opaque1) {
    1.24 +    return NULL;
    1.25 +  }
    1.26 +  Node* p_f = iffm->in(0);
    1.27    if (!p_f->is_IfFalse()) return NULL;
    1.28    if (!p_f->in(0)->is_CountedLoopEnd()) return NULL;
    1.29 -  CountedLoopEndNode *pre_end = p_f->in(0)->as_CountedLoopEnd();
    1.30 +  CountedLoopEndNode* pre_end = p_f->in(0)->as_CountedLoopEnd();
    1.31    CountedLoopNode* loop_node = pre_end->loopnode();
    1.32    if (loop_node == NULL || !loop_node->is_pre_loop()) return NULL;
    1.33    return pre_end;

mercurial