src/share/vm/opto/vectornode.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/share/vm/opto

src/share/vm/opto/vectornode.cpp

Print this page
rev 7391 : 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


 386       return new (C) PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
 387     case T_CHAR:
 388     case T_SHORT:
 389       return new (C) PackINode(n1, n2, TypeVect::make(T_INT, 2));
 390     case T_INT:
 391       return new (C) PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
 392     case T_LONG:
 393       return new (C) Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
 394     case T_FLOAT:
 395       return new (C) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
 396     case T_DOUBLE:
 397       return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
 398     }
 399     fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
 400   }
 401   return NULL;
 402 }
 403 
 404 // Return the vector version of a scalar load node.
 405 LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
 406                                      Node* adr, const TypePtr* atyp, uint vlen, BasicType bt) {

 407   const TypeVect* vt = TypeVect::make(bt, vlen);
 408   return new (C) LoadVectorNode(ctl, mem, adr, atyp, vt);
 409 }
 410 
 411 // Return the vector version of a scalar store node.
 412 StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
 413                                        Node* adr, const TypePtr* atyp, Node* val,
 414                                        uint vlen) {
 415   return new (C) StoreVectorNode(ctl, mem, adr, atyp, val);
 416 }
 417 
 418 // Extract a scalar element of vector.
 419 Node* ExtractNode::make(Compile* C, Node* v, uint position, BasicType bt) {
 420   assert((int)position < Matcher::max_vector_size(bt), "pos in range");
 421   ConINode* pos = ConINode::make(C, (int)position);
 422   switch (bt) {
 423   case T_BOOLEAN:
 424     return new (C) ExtractUBNode(v, pos);
 425   case T_BYTE:
 426     return new (C) ExtractBNode(v, pos);
 427   case T_CHAR:
 428     return new (C) ExtractCNode(v, pos);


 386       return new (C) PackSNode(n1, n2, TypeVect::make(T_SHORT, 2));
 387     case T_CHAR:
 388     case T_SHORT:
 389       return new (C) PackINode(n1, n2, TypeVect::make(T_INT, 2));
 390     case T_INT:
 391       return new (C) PackLNode(n1, n2, TypeVect::make(T_LONG, 2));
 392     case T_LONG:
 393       return new (C) Pack2LNode(n1, n2, TypeVect::make(T_LONG, 2));
 394     case T_FLOAT:
 395       return new (C) PackDNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
 396     case T_DOUBLE:
 397       return new (C) Pack2DNode(n1, n2, TypeVect::make(T_DOUBLE, 2));
 398     }
 399     fatal(err_msg_res("Type '%s' is not supported for vectors", type2name(bt)));
 400   }
 401   return NULL;
 402 }
 403 
 404 // Return the vector version of a scalar load node.
 405 LoadVectorNode* LoadVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
 406                                      Node* adr, const TypePtr* atyp, uint vlen, BasicType bt,
 407                                      ControlDependency control_dependency) {
 408   const TypeVect* vt = TypeVect::make(bt, vlen);
 409   return new (C) LoadVectorNode(ctl, mem, adr, atyp, vt, control_dependency);
 410 }
 411 
 412 // Return the vector version of a scalar store node.
 413 StoreVectorNode* StoreVectorNode::make(Compile* C, int opc, Node* ctl, Node* mem,
 414                                        Node* adr, const TypePtr* atyp, Node* val,
 415                                        uint vlen) {
 416   return new (C) StoreVectorNode(ctl, mem, adr, atyp, val);
 417 }
 418 
 419 // Extract a scalar element of vector.
 420 Node* ExtractNode::make(Compile* C, Node* v, uint position, BasicType bt) {
 421   assert((int)position < Matcher::max_vector_size(bt), "pos in range");
 422   ConINode* pos = ConINode::make(C, (int)position);
 423   switch (bt) {
 424   case T_BOOLEAN:
 425     return new (C) ExtractUBNode(v, pos);
 426   case T_BYTE:
 427     return new (C) ExtractBNode(v, pos);
 428   case T_CHAR:
 429     return new (C) ExtractCNode(v, pos);
src/share/vm/opto/vectornode.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File