comparison src/share/vm/opto/superword.cpp @ 6045:dc682d9431f3

7160610: Unknown Native Code compilation issue Summary: When constructing input vector use type of vector's operation which use it since element's sizes should match. Reviewed-by: never, twisti
author kvn
date Mon, 07 May 2012 12:37:46 -0700
parents 6987871cfb9b
children 5e990493719e
comparison
equal deleted inserted replaced
6044:ec15e8f6e4f1 6045:dc682d9431f3
1219 if (same_opd) { 1219 if (same_opd) {
1220 if (opd->is_Vector() || opd->is_VectorLoad()) { 1220 if (opd->is_Vector() || opd->is_VectorLoad()) {
1221 return opd; // input is matching vector 1221 return opd; // input is matching vector
1222 } 1222 }
1223 assert(!opd->is_VectorStore(), "such vector is not expected here"); 1223 assert(!opd->is_VectorStore(), "such vector is not expected here");
1224 // Convert scalar input to vector. Use p0's type because it's container 1224 // Convert scalar input to vector with the same number of elements as
1225 // maybe smaller than the operand's container. 1225 // p0's vector. Use p0's type because size of operand's container in
1226 const Type* opd_t = velt_type(!in_bb(opd) ? p0 : opd); 1226 // vector should match p0's size regardless operand's size.
1227 const Type* p0_t = velt_type(p0); 1227 const Type* p0_t = velt_type(p0);
1228 if (p0_t->higher_equal(opd_t)) opd_t = p0_t; 1228 VectorNode* vn = VectorNode::scalar2vector(_phase->C, opd, vlen, p0_t);
1229 VectorNode* vn = VectorNode::scalar2vector(_phase->C, opd, vlen, opd_t);
1230 1229
1231 _phase->_igvn.register_new_node_with_optimizer(vn); 1230 _phase->_igvn.register_new_node_with_optimizer(vn);
1232 _phase->set_ctrl(vn, _phase->get_ctrl(opd)); 1231 _phase->set_ctrl(vn, _phase->get_ctrl(opd));
1233 return vn; 1232 return vn;
1234 } 1233 }
1235 1234
1236 // Insert pack operation 1235 // Insert pack operation
1237 const Type* opd_t = velt_type(!in_bb(opd) ? p0 : opd); 1236 const Type* p0_t = velt_type(p0);
1238 PackNode* pk = PackNode::make(_phase->C, opd, opd_t); 1237 PackNode* pk = PackNode::make(_phase->C, opd, p0_t);
1238 DEBUG_ONLY( const BasicType opd_bt = opd->bottom_type()->basic_type(); )
1239 1239
1240 for (uint i = 1; i < vlen; i++) { 1240 for (uint i = 1; i < vlen; i++) {
1241 Node* pi = p->at(i); 1241 Node* pi = p->at(i);
1242 Node* in = pi->in(opd_idx); 1242 Node* in = pi->in(opd_idx);
1243 assert(my_pack(in) == NULL, "Should already have been unpacked"); 1243 assert(my_pack(in) == NULL, "Should already have been unpacked");
1244 assert(opd_t == velt_type(!in_bb(in) ? pi : in), "all same type"); 1244 assert(opd_bt == in->bottom_type()->basic_type(), "all same type");
1245 pk->add_opd(in); 1245 pk->add_opd(in);
1246 } 1246 }
1247 _phase->_igvn.register_new_node_with_optimizer(pk); 1247 _phase->_igvn.register_new_node_with_optimizer(pk);
1248 _phase->set_ctrl(pk, _phase->get_ctrl(opd)); 1248 _phase->set_ctrl(pk, _phase->get_ctrl(opd));
1249 return pk; 1249 return pk;