comparison src/share/vm/opto/superword.cpp @ 23055:c1c199dde5c9

8077504: Unsafe load can loose control dependency and cause crash Summary: Node::depends_only_on_test() should return false for Unsafe loads Reviewed-by: kvn, adinn
author roland
date Wed, 03 Jun 2015 14:22:57 +0200
parents 95dbbc0431d9
children dd9cc155639c 535618ab1c04
comparison
equal deleted inserted replaced
23054:55d07ec5bde4 23055:c1c199dde5c9
1429 break; // dependent memory 1429 break; // dependent memory
1430 } 1430 }
1431 } 1431 }
1432 Node* adr = low_adr->in(MemNode::Address); 1432 Node* adr = low_adr->in(MemNode::Address);
1433 const TypePtr* atyp = n->adr_type(); 1433 const TypePtr* atyp = n->adr_type();
1434 vn = LoadVectorNode::make(C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n)); 1434 vn = LoadVectorNode::make(C, opc, ctl, mem, adr, atyp, vlen, velt_basic_type(n), control_dependency(p));
1435 vlen_in_bytes = vn->as_LoadVector()->memory_size(); 1435 vlen_in_bytes = vn->as_LoadVector()->memory_size();
1436 } else if (n->is_Store()) { 1436 } else if (n->is_Store()) {
1437 // Promote value to be stored to vector 1437 // Promote value to be stored to vector
1438 Node* val = vector_opd(p, MemNode::ValueIn); 1438 Node* val = vector_opd(p, MemNode::ValueIn);
1439 Node* ctl = n->in(MemNode::Control); 1439 Node* ctl = n->in(MemNode::Control);
2026 n_rpo = s_rpo; 2026 n_rpo = s_rpo;
2027 } 2027 }
2028 } 2028 }
2029 return n; 2029 return n;
2030 } 2030 }
2031
2032 LoadNode::ControlDependency SuperWord::control_dependency(Node_List* p) {
2033 LoadNode::ControlDependency dep = LoadNode::DependsOnlyOnTest;
2034 for (uint i = 0; i < p->size(); i++) {
2035 Node* n = p->at(i);
2036 assert(n->is_Load(), "only meaningful for loads");
2037 if (!n->depends_only_on_test()) {
2038 dep = LoadNode::Pinned;
2039 }
2040 }
2041 return dep;
2042 }
2043
2031 2044
2032 //----------------------------align_initial_loop_index--------------------------- 2045 //----------------------------align_initial_loop_index---------------------------
2033 // Adjust pre-loop limit so that in main loop, a load/store reference 2046 // Adjust pre-loop limit so that in main loop, a load/store reference
2034 // to align_to_ref will be a position zero in the vector. 2047 // to align_to_ref will be a position zero in the vector.
2035 // (iv + k) mod vector_align == 0 2048 // (iv + k) mod vector_align == 0