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

src/share/vm/opto/matcher.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


 823 
 824   // Copy the register names over into the shared world
 825   for( i=OptoReg::Name(0); i<OptoReg::Name(_last_Mach_Reg); i = OptoReg::add(i,1) ) {
 826     // SharedInfo::regName[i] = regName[i];
 827     // Handy RegMasks per machine register
 828     mreg2regmask[i].Insert(i);
 829   }
 830 
 831   // Grab the Frame Pointer
 832   Node *fp  = ret->in(TypeFunc::FramePtr);
 833   Node *mem = ret->in(TypeFunc::Memory);
 834   const TypePtr* atp = TypePtr::BOTTOM;
 835   // Share frame pointer while making spill ops
 836   set_shared(fp);
 837 
 838   // Compute generic short-offset Loads
 839 #ifdef _LP64
 840   MachNode *spillCP = match_tree(new (C) LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
 841 #endif
 842   MachNode *spillI  = match_tree(new (C) LoadINode(NULL,mem,fp,atp,TypeInt::INT,MemNode::unordered));
 843   MachNode *spillL  = match_tree(new (C) LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered,false));
 844   MachNode *spillF  = match_tree(new (C) LoadFNode(NULL,mem,fp,atp,Type::FLOAT,MemNode::unordered));
 845   MachNode *spillD  = match_tree(new (C) LoadDNode(NULL,mem,fp,atp,Type::DOUBLE,MemNode::unordered));
 846   MachNode *spillP  = match_tree(new (C) LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
 847   assert(spillI != NULL && spillL != NULL && spillF != NULL &&
 848          spillD != NULL && spillP != NULL, "");
 849   // Get the ADLC notion of the right regmask, for each basic type.
 850 #ifdef _LP64
 851   idealreg2regmask[Op_RegN] = &spillCP->out_RegMask();
 852 #endif
 853   idealreg2regmask[Op_RegI] = &spillI->out_RegMask();
 854   idealreg2regmask[Op_RegL] = &spillL->out_RegMask();
 855   idealreg2regmask[Op_RegF] = &spillF->out_RegMask();
 856   idealreg2regmask[Op_RegD] = &spillD->out_RegMask();
 857   idealreg2regmask[Op_RegP] = &spillP->out_RegMask();
 858 
 859   // Vector regmasks.
 860   if (Matcher::vector_size_supported(T_BYTE,4)) {
 861     TypeVect::VECTS = TypeVect::make(T_BYTE, 4);
 862     MachNode *spillVectS = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS));
 863     idealreg2regmask[Op_VecS] = &spillVectS->out_RegMask();




 823 
 824   // Copy the register names over into the shared world
 825   for( i=OptoReg::Name(0); i<OptoReg::Name(_last_Mach_Reg); i = OptoReg::add(i,1) ) {
 826     // SharedInfo::regName[i] = regName[i];
 827     // Handy RegMasks per machine register
 828     mreg2regmask[i].Insert(i);
 829   }
 830 
 831   // Grab the Frame Pointer
 832   Node *fp  = ret->in(TypeFunc::FramePtr);
 833   Node *mem = ret->in(TypeFunc::Memory);
 834   const TypePtr* atp = TypePtr::BOTTOM;
 835   // Share frame pointer while making spill ops
 836   set_shared(fp);
 837 
 838   // Compute generic short-offset Loads
 839 #ifdef _LP64
 840   MachNode *spillCP = match_tree(new (C) LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
 841 #endif
 842   MachNode *spillI  = match_tree(new (C) LoadINode(NULL,mem,fp,atp,TypeInt::INT,MemNode::unordered));
 843   MachNode *spillL  = match_tree(new (C) LoadLNode(NULL,mem,fp,atp,TypeLong::LONG,MemNode::unordered, LoadNode::DependsOnlyOnTest,false));
 844   MachNode *spillF  = match_tree(new (C) LoadFNode(NULL,mem,fp,atp,Type::FLOAT,MemNode::unordered));
 845   MachNode *spillD  = match_tree(new (C) LoadDNode(NULL,mem,fp,atp,Type::DOUBLE,MemNode::unordered));
 846   MachNode *spillP  = match_tree(new (C) LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM,MemNode::unordered));
 847   assert(spillI != NULL && spillL != NULL && spillF != NULL &&
 848          spillD != NULL && spillP != NULL, "");
 849   // Get the ADLC notion of the right regmask, for each basic type.
 850 #ifdef _LP64
 851   idealreg2regmask[Op_RegN] = &spillCP->out_RegMask();
 852 #endif
 853   idealreg2regmask[Op_RegI] = &spillI->out_RegMask();
 854   idealreg2regmask[Op_RegL] = &spillL->out_RegMask();
 855   idealreg2regmask[Op_RegF] = &spillF->out_RegMask();
 856   idealreg2regmask[Op_RegD] = &spillD->out_RegMask();
 857   idealreg2regmask[Op_RegP] = &spillP->out_RegMask();
 858 
 859   // Vector regmasks.
 860   if (Matcher::vector_size_supported(T_BYTE,4)) {
 861     TypeVect::VECTS = TypeVect::make(T_BYTE, 4);
 862     MachNode *spillVectS = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS));
 863     idealreg2regmask[Op_VecS] = &spillVectS->out_RegMask();


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