Mercurial > hg > graal-jvmci-8
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 |