1.1 --- a/src/share/vm/opto/superword.cpp Tue Sep 25 10:41:15 2012 -0700 1.2 +++ b/src/share/vm/opto/superword.cpp Tue Sep 25 15:48:17 2012 -0700 1.3 @@ -1088,23 +1088,22 @@ 1.4 uint start, end; 1.5 VectorNode::vector_operands(p0, &start, &end); 1.6 1.7 - // Return false if some input is not vector and inside block 1.8 + // Return false if some inputs are not vectors or vectors with different 1.9 + // size or alignment. 1.10 + // Also, for now, return false if not scalar promotion case when inputs are 1.11 + // the same. Later, implement PackNode and allow differing, non-vector inputs 1.12 + // (maybe just the ones from outside the block.) 1.13 for (uint i = start; i < end; i++) { 1.14 - if (!is_vector_use(p0, i)) { 1.15 - // For now, return false if not scalar promotion case (inputs are the same.) 1.16 - // Later, implement PackNode and allow differing, non-vector inputs 1.17 - // (maybe just the ones from outside the block.) 1.18 - if (!same_inputs(p, i)) { 1.19 - return false; 1.20 - } 1.21 - } 1.22 + if (!is_vector_use(p0, i)) 1.23 + return false; 1.24 } 1.25 if (VectorNode::is_shift(p0)) { 1.26 - // For now, return false if shift count is vector because 1.27 - // hw does not support it. 1.28 - if (is_vector_use(p0, 2)) 1.29 + // For now, return false if shift count is vector or not scalar promotion 1.30 + // case (different shift counts) because it is not supported yet. 1.31 + Node* cnt = p0->in(2); 1.32 + Node_List* cnt_pk = my_pack(cnt); 1.33 + if (cnt_pk != NULL) 1.34 return false; 1.35 - // For the same reason return false if different shift counts. 1.36 if (!same_inputs(p, 2)) 1.37 return false; 1.38 } 1.39 @@ -1402,7 +1401,7 @@ 1.40 ShouldNotReachHere(); 1.41 } 1.42 assert(vn != NULL, "sanity"); 1.43 - _phase->_igvn.register_new_node_with_optimizer(vn); 1.44 + _igvn.register_new_node_with_optimizer(vn); 1.45 _phase->set_ctrl(vn, _phase->get_ctrl(p->at(0))); 1.46 for (uint j = 0; j < p->size(); j++) { 1.47 Node* pm = p->at(j); 1.48 @@ -1451,9 +1450,9 @@ 1.49 } else { 1.50 if (t == NULL || t->_lo < 0 || t->_hi > (int)mask) { 1.51 cnt = ConNode::make(C, TypeInt::make(mask)); 1.52 - _phase->_igvn.register_new_node_with_optimizer(cnt); 1.53 + _igvn.register_new_node_with_optimizer(cnt); 1.54 cnt = new (C, 3) AndINode(opd, cnt); 1.55 - _phase->_igvn.register_new_node_with_optimizer(cnt); 1.56 + _igvn.register_new_node_with_optimizer(cnt); 1.57 _phase->set_ctrl(cnt, _phase->get_ctrl(opd)); 1.58 } 1.59 assert(opd->bottom_type()->isa_int(), "int type only"); 1.60 @@ -1461,7 +1460,7 @@ 1.61 cnt = new (C, 2) MoveI2FNode(cnt); 1.62 } 1.63 if (cnt != opd) { 1.64 - _phase->_igvn.register_new_node_with_optimizer(cnt); 1.65 + _igvn.register_new_node_with_optimizer(cnt); 1.66 _phase->set_ctrl(cnt, _phase->get_ctrl(opd)); 1.67 } 1.68 return cnt; 1.69 @@ -1473,7 +1472,7 @@ 1.70 const Type* p0_t = velt_type(p0); 1.71 VectorNode* vn = VectorNode::scalar2vector(_phase->C, opd, vlen, p0_t); 1.72 1.73 - _phase->_igvn.register_new_node_with_optimizer(vn); 1.74 + _igvn.register_new_node_with_optimizer(vn); 1.75 _phase->set_ctrl(vn, _phase->get_ctrl(opd)); 1.76 #ifdef ASSERT 1.77 if (TraceNewVectors) { 1.78 @@ -1496,7 +1495,7 @@ 1.79 assert(opd_bt == in->bottom_type()->basic_type(), "all same type"); 1.80 pk->add_opd(in); 1.81 } 1.82 - _phase->_igvn.register_new_node_with_optimizer(pk); 1.83 + _igvn.register_new_node_with_optimizer(pk); 1.84 _phase->set_ctrl(pk, _phase->get_ctrl(opd)); 1.85 #ifdef ASSERT 1.86 if (TraceNewVectors) { 1.87 @@ -1543,7 +1542,7 @@ 1.88 int def_pos = alignment(def) / data_size(def); 1.89 1.90 Node* ex = ExtractNode::make(_phase->C, def, def_pos, velt_basic_type(def)); 1.91 - _phase->_igvn.register_new_node_with_optimizer(ex); 1.92 + _igvn.register_new_node_with_optimizer(ex); 1.93 _phase->set_ctrl(ex, _phase->get_ctrl(def)); 1.94 _igvn.replace_input_of(use, idx, ex); 1.95 _igvn._worklist.push(def); 1.96 @@ -2023,33 +2022,33 @@ 1.97 // incorporate any extra invariant piece producing (offset +/- invar) >>> log2(elt) 1.98 Node* log2_elt = _igvn.intcon(exact_log2(elt_size)); 1.99 Node* aref = new (_phase->C, 3) URShiftINode(align_to_ref_p.invar(), log2_elt); 1.100 - _phase->_igvn.register_new_node_with_optimizer(aref); 1.101 + _igvn.register_new_node_with_optimizer(aref); 1.102 _phase->set_ctrl(aref, pre_ctrl); 1.103 if (align_to_ref_p.negate_invar()) { 1.104 e = new (_phase->C, 3) SubINode(e, aref); 1.105 } else { 1.106 e = new (_phase->C, 3) AddINode(e, aref); 1.107 } 1.108 - _phase->_igvn.register_new_node_with_optimizer(e); 1.109 + _igvn.register_new_node_with_optimizer(e); 1.110 _phase->set_ctrl(e, pre_ctrl); 1.111 } 1.112 if (vw > ObjectAlignmentInBytes) { 1.113 // incorporate base e +/- base && Mask >>> log2(elt) 1.114 Node* xbase = new(_phase->C, 2) CastP2XNode(NULL, align_to_ref_p.base()); 1.115 - _phase->_igvn.register_new_node_with_optimizer(xbase); 1.116 + _igvn.register_new_node_with_optimizer(xbase); 1.117 #ifdef _LP64 1.118 xbase = new (_phase->C, 2) ConvL2INode(xbase); 1.119 - _phase->_igvn.register_new_node_with_optimizer(xbase); 1.120 + _igvn.register_new_node_with_optimizer(xbase); 1.121 #endif 1.122 Node* mask = _igvn.intcon(vw-1); 1.123 Node* masked_xbase = new (_phase->C, 3) AndINode(xbase, mask); 1.124 - _phase->_igvn.register_new_node_with_optimizer(masked_xbase); 1.125 + _igvn.register_new_node_with_optimizer(masked_xbase); 1.126 Node* log2_elt = _igvn.intcon(exact_log2(elt_size)); 1.127 Node* bref = new (_phase->C, 3) URShiftINode(masked_xbase, log2_elt); 1.128 - _phase->_igvn.register_new_node_with_optimizer(bref); 1.129 + _igvn.register_new_node_with_optimizer(bref); 1.130 _phase->set_ctrl(bref, pre_ctrl); 1.131 e = new (_phase->C, 3) AddINode(e, bref); 1.132 - _phase->_igvn.register_new_node_with_optimizer(e); 1.133 + _igvn.register_new_node_with_optimizer(e); 1.134 _phase->set_ctrl(e, pre_ctrl); 1.135 } 1.136 1.137 @@ -2059,20 +2058,20 @@ 1.138 } else { 1.139 e = new (_phase->C, 3) AddINode(e, lim0); 1.140 } 1.141 - _phase->_igvn.register_new_node_with_optimizer(e); 1.142 + _igvn.register_new_node_with_optimizer(e); 1.143 _phase->set_ctrl(e, pre_ctrl); 1.144 1.145 if (stride * scale > 0) { 1.146 // compute V - (e +/- lim0) 1.147 Node* va = _igvn.intcon(v_align); 1.148 e = new (_phase->C, 3) SubINode(va, e); 1.149 - _phase->_igvn.register_new_node_with_optimizer(e); 1.150 + _igvn.register_new_node_with_optimizer(e); 1.151 _phase->set_ctrl(e, pre_ctrl); 1.152 } 1.153 // compute N = (exp) % V 1.154 Node* va_msk = _igvn.intcon(v_align - 1); 1.155 Node* N = new (_phase->C, 3) AndINode(e, va_msk); 1.156 - _phase->_igvn.register_new_node_with_optimizer(N); 1.157 + _igvn.register_new_node_with_optimizer(N); 1.158 _phase->set_ctrl(N, pre_ctrl); 1.159 1.160 // substitute back into (1), so that new limit 1.161 @@ -2083,12 +2082,12 @@ 1.162 } else { 1.163 lim = new (_phase->C, 3) AddINode(lim0, N); 1.164 } 1.165 - _phase->_igvn.register_new_node_with_optimizer(lim); 1.166 + _igvn.register_new_node_with_optimizer(lim); 1.167 _phase->set_ctrl(lim, pre_ctrl); 1.168 Node* constrained = 1.169 (stride > 0) ? (Node*) new (_phase->C,3) MinINode(lim, orig_limit) 1.170 : (Node*) new (_phase->C,3) MaxINode(lim, orig_limit); 1.171 - _phase->_igvn.register_new_node_with_optimizer(constrained); 1.172 + _igvn.register_new_node_with_optimizer(constrained); 1.173 _phase->set_ctrl(constrained, pre_ctrl); 1.174 _igvn.hash_delete(pre_opaq); 1.175 pre_opaq->set_req(1, constrained);