diff -r 00bd985f3dec -r 1a0499fd252e src/hotspot/share/opto/superword.cpp --- a/src/hotspot/share/opto/superword.cpp Tue Dec 05 21:26:11 2017 +0530 +++ b/src/hotspot/share/opto/superword.cpp Tue Dec 05 09:49:23 2017 -0800 @@ -58,7 +58,7 @@ _mem_slice_tail(arena(), 8, 0, NULL), // memory slice tails _node_info(arena(), 8, 0, SWNodeInfo::initial), // info needed per node _clone_map(phase->C->clone_map()), // map of nodes created in cloning - _cmovev_kit(_arena, this), // map to facilitate CMoveVD creation + _cmovev_kit(_arena, this), // map to facilitate CMoveV creation _align_to_ref(NULL), // memory reference to align vectors to _disjoint_ptrs(arena(), 8, 0, OrderedPair::initial), // runtime disambiguated pointer pairs _dg(_arena), // dependence graph @@ -511,8 +511,7 @@ combine_packs(); construct_my_pack_map(); - - if (_do_vector_loop) { + if (UseVectorCmov) { merge_packs_to_cmovd(); } @@ -1249,8 +1248,8 @@ //------------------------------data_size--------------------------- int SuperWord::data_size(Node* s) { - Node* use = NULL; //test if the node is a candidate for CMoveVD optimization, then return the size of CMov - if (_do_vector_loop) { + Node* use = NULL; //test if the node is a candidate for CMoveV optimization, then return the size of CMov + if (UseVectorCmov) { use = _cmovev_kit.is_Bool_candidate(s); if (use != NULL) { return data_size(use); @@ -1260,6 +1259,7 @@ return data_size(use); } } + int bsize = type2aelembytes(velt_basic_type(s)); assert(bsize != 0, "valid size"); return bsize; @@ -1718,6 +1718,9 @@ if (!cmovd->is_CMove()) { return NULL; } + if (cmovd->Opcode() != Op_CMoveF && cmovd->Opcode() != Op_CMoveD) { + return NULL; + } if (pack(cmovd) != NULL) { // already in the cmov pack return NULL; } @@ -2377,7 +2380,13 @@ } BasicType bt = velt_basic_type(n); const TypeVect* vt = TypeVect::make(bt, vlen); - vn = new CMoveVDNode(cc, src1, src2, vt); + assert(bt == T_FLOAT || bt == T_DOUBLE, "Only vectorization for FP cmovs is supported"); + if (bt == T_FLOAT) { + vn = new CMoveVFNode(cc, src1, src2, vt); + } else { + assert(bt == T_DOUBLE, "Expected double"); + vn = new CMoveVDNode(cc, src1, src2, vt); + } NOT_PRODUCT(if(is_trace_cmov()) {tty->print("SWPointer::output: created new CMove node %d: ", vn->_idx); vn->dump();}) } else if (opc == Op_FmaD || opc == Op_FmaF) { // Promote operands to vector