src/share/vm/opto/superword.cpp

changeset 4620
ad736b4683b4
parent 4207
410afdc6a07c
child 6198
55fb97c4c58d
     1.1 --- a/src/share/vm/opto/superword.cpp	Mon Feb 18 15:08:39 2013 -0800
     1.2 +++ b/src/share/vm/opto/superword.cpp	Mon Feb 18 16:47:15 2013 -0800
     1.3 @@ -143,7 +143,8 @@
     1.4  
     1.5    // Ready the block
     1.6  
     1.7 -  construct_bb();
     1.8 +  if (!construct_bb())
     1.9 +    return; // Exit if no interesting nodes or complex graph.
    1.10  
    1.11    dependence_graph();
    1.12  
    1.13 @@ -615,6 +616,7 @@
    1.14      if (n == stop) break;
    1.15      preds.push(n);
    1.16      prev = n;
    1.17 +    assert(n->is_Mem(), err_msg_res("unexpected node %s", n->Name()));
    1.18      n = n->in(MemNode::Memory);
    1.19    }
    1.20  }
    1.21 @@ -1578,7 +1580,7 @@
    1.22  
    1.23  //------------------------------construct_bb---------------------------
    1.24  // Construct reverse postorder list of block members
    1.25 -void SuperWord::construct_bb() {
    1.26 +bool SuperWord::construct_bb() {
    1.27    Node* entry = bb();
    1.28  
    1.29    assert(_stk.length() == 0,            "stk is empty");
    1.30 @@ -1596,6 +1598,12 @@
    1.31      Node *n = lpt()->_body.at(i);
    1.32      set_bb_idx(n, i); // Create a temporary map
    1.33      if (in_bb(n)) {
    1.34 +      if (n->is_LoadStore() || n->is_MergeMem() ||
    1.35 +          (n->is_Proj() && !n->as_Proj()->is_CFG())) {
    1.36 +        // Bailout if the loop has LoadStore, MergeMem or data Proj
    1.37 +        // nodes. Superword optimization does not work with them.
    1.38 +        return false;
    1.39 +      }
    1.40        bb_ct++;
    1.41        if (!n->is_CFG()) {
    1.42          bool found = false;
    1.43 @@ -1620,6 +1628,10 @@
    1.44      if (in_bb(n) && (n->is_Phi() && n->bottom_type() == Type::MEMORY)) {
    1.45        Node* n_tail  = n->in(LoopNode::LoopBackControl);
    1.46        if (n_tail != n->in(LoopNode::EntryControl)) {
    1.47 +        if (!n_tail->is_Mem()) {
    1.48 +          assert(n_tail->is_Mem(), err_msg_res("unexpected node for memory slice: %s", n_tail->Name()));
    1.49 +          return false; // Bailout
    1.50 +        }
    1.51          _mem_slice_head.push(n);
    1.52          _mem_slice_tail.push(n_tail);
    1.53        }
    1.54 @@ -1695,6 +1707,7 @@
    1.55    }
    1.56  #endif
    1.57    assert(rpo_idx == -1 && bb_ct == _block.length(), "all block members found");
    1.58 +  return (_mem_slice_head.length() > 0) || (_data_entry.length() > 0);
    1.59  }
    1.60  
    1.61  //------------------------------initialize_bb---------------------------

mercurial