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---------------------------