diff -r 8d3cc6612bd1 -r 137868b7aa6f src/share/vm/opto/superword.cpp --- a/src/share/vm/opto/superword.cpp Mon Sep 17 17:02:10 2012 -0700 +++ b/src/share/vm/opto/superword.cpp Mon Sep 17 19:39:07 2012 -0700 @@ -1350,11 +1350,14 @@ insert_extracts(_packset.at(i)); } + Compile* C = _phase->C; + uint max_vlen_in_bytes = 0; for (int i = 0; i < _block.length(); i++) { Node* n = _block.at(i); Node_List* p = my_pack(n); if (p && n == executed_last(p)) { uint vlen = p->size(); + uint vlen_in_bytes = 0; Node* vn = NULL; Node* low_adr = p->at(0); Node* first = executed_first(p); @@ -1364,7 +1367,8 @@ Node* mem = first->in(MemNode::Memory); Node* adr = low_adr->in(MemNode::Address); const TypePtr* atyp = n->adr_type(); - vn = LoadVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n)); + vn = LoadVectorNode::make(C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n)); + vlen_in_bytes = vn->as_LoadVector()->memory_size(); } else if (n->is_Store()) { // Promote value to be stored to vector Node* val = vector_opd(p, MemNode::ValueIn); @@ -1372,7 +1376,8 @@ Node* mem = first->in(MemNode::Memory); Node* adr = low_adr->in(MemNode::Address); const TypePtr* atyp = n->adr_type(); - vn = StoreVectorNode::make(_phase->C, opc, ctl, mem, adr, atyp, val, vlen); + vn = StoreVectorNode::make(C, opc, ctl, mem, adr, atyp, val, vlen); + vlen_in_bytes = vn->as_StoreVector()->memory_size(); } else if (n->req() == 3) { // Promote operands to vector Node* in1 = vector_opd(p, 1); @@ -1383,7 +1388,8 @@ in1 = in2; in2 = tmp; } - vn = VectorNode::make(_phase->C, opc, in1, in2, vlen, velt_basic_type(n)); + vn = VectorNode::make(C, opc, in1, in2, vlen, velt_basic_type(n)); + vlen_in_bytes = vn->as_Vector()->length_in_bytes(); } else { ShouldNotReachHere(); } @@ -1395,6 +1401,10 @@ _igvn.replace_node(pm, vn); } _igvn._worklist.push(vn); + + if (vlen_in_bytes > max_vlen_in_bytes) { + max_vlen_in_bytes = vlen_in_bytes; + } #ifdef ASSERT if (TraceNewVectors) { tty->print("new Vector node: "); @@ -1403,6 +1413,7 @@ #endif } } + C->set_max_vector_size(max_vlen_in_bytes); } //------------------------------vector_opd--------------------------- @@ -1439,7 +1450,7 @@ } assert(opd->bottom_type()->isa_int(), "int type only"); // Move non constant shift count into XMM register. - cnt = new (_phase->C, 2) MoveI2FNode(cnt); + cnt = new (C, 2) MoveI2FNode(cnt); } if (cnt != opd) { _phase->_igvn.register_new_node_with_optimizer(cnt); @@ -1480,10 +1491,10 @@ _phase->_igvn.register_new_node_with_optimizer(pk); _phase->set_ctrl(pk, _phase->get_ctrl(opd)); #ifdef ASSERT - if (TraceNewVectors) { - tty->print("new Vector node: "); - pk->dump(); - } + if (TraceNewVectors) { + tty->print("new Vector node: "); + pk->dump(); + } #endif return pk; }