Mercurial > hg > truffle
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; |