1.1 --- a/src/share/vm/opto/superword.cpp Mon Sep 17 17:02:10 2012 -0700 1.2 +++ b/src/share/vm/opto/superword.cpp Mon Sep 17 19:39:07 2012 -0700 1.3 @@ -1350,11 +1350,14 @@ 1.4 insert_extracts(_packset.at(i)); 1.5 } 1.6 1.7 + Compile* C = _phase->C; 1.8 + uint max_vlen_in_bytes = 0; 1.9 for (int i = 0; i < _block.length(); i++) { 1.10 Node* n = _block.at(i); 1.11 Node_List* p = my_pack(n); 1.12 if (p && n == executed_last(p)) { 1.13 uint vlen = p->size(); 1.14 + uint vlen_in_bytes = 0; 1.15 Node* vn = NULL; 1.16 Node* low_adr = p->at(0); 1.17 Node* first = executed_first(p); 1.18 @@ -1364,7 +1367,8 @@ 1.19 Node* mem = first->in(MemNode::Memory); 1.20 Node* adr = low_adr->in(MemNode::Address); 1.21 const TypePtr* atyp = n->adr_type(); 1.22 - vn = LoadVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n)); 1.23 + vn = LoadVectorNode::make(C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n)); 1.24 + vlen_in_bytes = vn->as_LoadVector()->memory_size(); 1.25 } else if (n->is_Store()) { 1.26 // Promote value to be stored to vector 1.27 Node* val = vector_opd(p, MemNode::ValueIn); 1.28 @@ -1372,7 +1376,8 @@ 1.29 Node* mem = first->in(MemNode::Memory); 1.30 Node* adr = low_adr->in(MemNode::Address); 1.31 const TypePtr* atyp = n->adr_type(); 1.32 - vn = StoreVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, val, vlen); 1.33 + vn = StoreVectorNode::make(C, opc, ctl, mem, adr, atyp, val, vlen); 1.34 + vlen_in_bytes = vn->as_StoreVector()->memory_size(); 1.35 } else if (n->req() == 3) { 1.36 // Promote operands to vector 1.37 Node* in1 = vector_opd(p, 1); 1.38 @@ -1383,7 +1388,8 @@ 1.39 in1 = in2; 1.40 in2 = tmp; 1.41 } 1.42 - vn = VectorNode::make(_phase->C, opc, in1, in2, vlen, velt_basic_type(n)); 1.43 + vn = VectorNode::make(C, opc, in1, in2, vlen, velt_basic_type(n)); 1.44 + vlen_in_bytes = vn->as_Vector()->length_in_bytes(); 1.45 } else { 1.46 ShouldNotReachHere(); 1.47 } 1.48 @@ -1395,6 +1401,10 @@ 1.49 _igvn.replace_node(pm, vn); 1.50 } 1.51 _igvn._worklist.push(vn); 1.52 + 1.53 + if (vlen_in_bytes > max_vlen_in_bytes) { 1.54 + max_vlen_in_bytes = vlen_in_bytes; 1.55 + } 1.56 #ifdef ASSERT 1.57 if (TraceNewVectors) { 1.58 tty->print("new Vector node: "); 1.59 @@ -1403,6 +1413,7 @@ 1.60 #endif 1.61 } 1.62 } 1.63 + C->set_max_vector_size(max_vlen_in_bytes); 1.64 } 1.65 1.66 //------------------------------vector_opd--------------------------- 1.67 @@ -1439,7 +1450,7 @@ 1.68 } 1.69 assert(opd->bottom_type()->isa_int(), "int type only"); 1.70 // Move non constant shift count into XMM register. 1.71 - cnt = new (_phase->C, 2) MoveI2FNode(cnt); 1.72 + cnt = new (C, 2) MoveI2FNode(cnt); 1.73 } 1.74 if (cnt != opd) { 1.75 _phase->_igvn.register_new_node_with_optimizer(cnt); 1.76 @@ -1480,10 +1491,10 @@ 1.77 _phase->_igvn.register_new_node_with_optimizer(pk); 1.78 _phase->set_ctrl(pk, _phase->get_ctrl(opd)); 1.79 #ifdef ASSERT 1.80 - if (TraceNewVectors) { 1.81 - tty->print("new Vector node: "); 1.82 - pk->dump(); 1.83 - } 1.84 + if (TraceNewVectors) { 1.85 + tty->print("new Vector node: "); 1.86 + pk->dump(); 1.87 + } 1.88 #endif 1.89 return pk; 1.90 }