hotspot/src/share/vm/opto/matcher.cpp
changeset 13895 f6dfe4123709
parent 13886 8d82c4dfa722
child 13969 d2a189b83b87
equal deleted inserted replaced
13894:068a8efe7203 13895:f6dfe4123709
   725         ret_rms      [      ret_edge_cnt].Insert(OptoReg::Name(i+1));
   725         ret_rms      [      ret_edge_cnt].Insert(OptoReg::Name(i+1));
   726         reth_rms     [     reth_edge_cnt].Insert(OptoReg::Name(i+1));
   726         reth_rms     [     reth_edge_cnt].Insert(OptoReg::Name(i+1));
   727         tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1));
   727         tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1));
   728         tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1));
   728         tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1));
   729         halt_rms     [     halt_edge_cnt].Insert(OptoReg::Name(i+1));
   729         halt_rms     [     halt_edge_cnt].Insert(OptoReg::Name(i+1));
   730         mproj = new (C, 1) MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegD );
   730         mproj = new (C) MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegD );
   731         proj_cnt += 2;          // Skip 2 for doubles
   731         proj_cnt += 2;          // Skip 2 for doubles
   732       }
   732       }
   733       else if( (i&1) == 1 &&    // Else check for high half of double
   733       else if( (i&1) == 1 &&    // Else check for high half of double
   734                _register_save_type[i-1] == Op_RegF &&
   734                _register_save_type[i-1] == Op_RegF &&
   735                _register_save_type[i  ] == Op_RegF &&
   735                _register_save_type[i  ] == Op_RegF &&
   751         ret_rms      [      ret_edge_cnt].Insert(OptoReg::Name(i+1));
   751         ret_rms      [      ret_edge_cnt].Insert(OptoReg::Name(i+1));
   752         reth_rms     [     reth_edge_cnt].Insert(OptoReg::Name(i+1));
   752         reth_rms     [     reth_edge_cnt].Insert(OptoReg::Name(i+1));
   753         tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1));
   753         tail_call_rms[tail_call_edge_cnt].Insert(OptoReg::Name(i+1));
   754         tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1));
   754         tail_jump_rms[tail_jump_edge_cnt].Insert(OptoReg::Name(i+1));
   755         halt_rms     [     halt_edge_cnt].Insert(OptoReg::Name(i+1));
   755         halt_rms     [     halt_edge_cnt].Insert(OptoReg::Name(i+1));
   756         mproj = new (C, 1) MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegL );
   756         mproj = new (C) MachProjNode( start, proj_cnt, ret_rms[ret_edge_cnt], Op_RegL );
   757         proj_cnt += 2;          // Skip 2 for longs
   757         proj_cnt += 2;          // Skip 2 for longs
   758       }
   758       }
   759       else if( (i&1) == 1 &&    // Else check for high half of long
   759       else if( (i&1) == 1 &&    // Else check for high half of long
   760                _register_save_type[i-1] == Op_RegI &&
   760                _register_save_type[i-1] == Op_RegI &&
   761                _register_save_type[i  ] == Op_RegI &&
   761                _register_save_type[i  ] == Op_RegI &&
   766         tail_jump_rms[tail_jump_edge_cnt] = RegMask::Empty;
   766         tail_jump_rms[tail_jump_edge_cnt] = RegMask::Empty;
   767         halt_rms     [     halt_edge_cnt] = RegMask::Empty;
   767         halt_rms     [     halt_edge_cnt] = RegMask::Empty;
   768         mproj = C->top();
   768         mproj = C->top();
   769       } else {
   769       } else {
   770         // Make a projection for it off the Start
   770         // Make a projection for it off the Start
   771         mproj = new (C, 1) MachProjNode( start, proj_cnt++, ret_rms[ret_edge_cnt], _register_save_type[i] );
   771         mproj = new (C) MachProjNode( start, proj_cnt++, ret_rms[ret_edge_cnt], _register_save_type[i] );
   772       }
   772       }
   773 
   773 
   774       ret_edge_cnt ++;
   774       ret_edge_cnt ++;
   775       reth_edge_cnt ++;
   775       reth_edge_cnt ++;
   776       tail_call_edge_cnt ++;
   776       tail_call_edge_cnt ++;
   819   // Share frame pointer while making spill ops
   819   // Share frame pointer while making spill ops
   820   set_shared(fp);
   820   set_shared(fp);
   821 
   821 
   822   // Compute generic short-offset Loads
   822   // Compute generic short-offset Loads
   823 #ifdef _LP64
   823 #ifdef _LP64
   824   MachNode *spillCP = match_tree(new (C, 3) LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM));
   824   MachNode *spillCP = match_tree(new (C) LoadNNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM));
   825 #endif
   825 #endif
   826   MachNode *spillI  = match_tree(new (C, 3) LoadINode(NULL,mem,fp,atp));
   826   MachNode *spillI  = match_tree(new (C) LoadINode(NULL,mem,fp,atp));
   827   MachNode *spillL  = match_tree(new (C, 3) LoadLNode(NULL,mem,fp,atp));
   827   MachNode *spillL  = match_tree(new (C) LoadLNode(NULL,mem,fp,atp));
   828   MachNode *spillF  = match_tree(new (C, 3) LoadFNode(NULL,mem,fp,atp));
   828   MachNode *spillF  = match_tree(new (C) LoadFNode(NULL,mem,fp,atp));
   829   MachNode *spillD  = match_tree(new (C, 3) LoadDNode(NULL,mem,fp,atp));
   829   MachNode *spillD  = match_tree(new (C) LoadDNode(NULL,mem,fp,atp));
   830   MachNode *spillP  = match_tree(new (C, 3) LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM));
   830   MachNode *spillP  = match_tree(new (C) LoadPNode(NULL,mem,fp,atp,TypeInstPtr::BOTTOM));
   831   assert(spillI != NULL && spillL != NULL && spillF != NULL &&
   831   assert(spillI != NULL && spillL != NULL && spillF != NULL &&
   832          spillD != NULL && spillP != NULL, "");
   832          spillD != NULL && spillP != NULL, "");
   833 
   833 
   834   // Get the ADLC notion of the right regmask, for each basic type.
   834   // Get the ADLC notion of the right regmask, for each basic type.
   835 #ifdef _LP64
   835 #ifdef _LP64
   842   idealreg2regmask[Op_RegP] = &spillP->out_RegMask();
   842   idealreg2regmask[Op_RegP] = &spillP->out_RegMask();
   843 
   843 
   844   // Vector regmasks.
   844   // Vector regmasks.
   845   if (Matcher::vector_size_supported(T_BYTE,4)) {
   845   if (Matcher::vector_size_supported(T_BYTE,4)) {
   846     TypeVect::VECTS = TypeVect::make(T_BYTE, 4);
   846     TypeVect::VECTS = TypeVect::make(T_BYTE, 4);
   847     MachNode *spillVectS = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS));
   847     MachNode *spillVectS = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTS));
   848     idealreg2regmask[Op_VecS] = &spillVectS->out_RegMask();
   848     idealreg2regmask[Op_VecS] = &spillVectS->out_RegMask();
   849   }
   849   }
   850   if (Matcher::vector_size_supported(T_FLOAT,2)) {
   850   if (Matcher::vector_size_supported(T_FLOAT,2)) {
   851     MachNode *spillVectD = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD));
   851     MachNode *spillVectD = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTD));
   852     idealreg2regmask[Op_VecD] = &spillVectD->out_RegMask();
   852     idealreg2regmask[Op_VecD] = &spillVectD->out_RegMask();
   853   }
   853   }
   854   if (Matcher::vector_size_supported(T_FLOAT,4)) {
   854   if (Matcher::vector_size_supported(T_FLOAT,4)) {
   855     MachNode *spillVectX = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX));
   855     MachNode *spillVectX = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTX));
   856     idealreg2regmask[Op_VecX] = &spillVectX->out_RegMask();
   856     idealreg2regmask[Op_VecX] = &spillVectX->out_RegMask();
   857   }
   857   }
   858   if (Matcher::vector_size_supported(T_FLOAT,8)) {
   858   if (Matcher::vector_size_supported(T_FLOAT,8)) {
   859     MachNode *spillVectY = match_tree(new (C, 3) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY));
   859     MachNode *spillVectY = match_tree(new (C) LoadVectorNode(NULL,mem,fp,atp,TypeVect::VECTY));
   860     idealreg2regmask[Op_VecY] = &spillVectY->out_RegMask();
   860     idealreg2regmask[Op_VecY] = &spillVectY->out_RegMask();
   861   }
   861   }
   862 }
   862 }
   863 
   863 
   864 #ifdef ASSERT
   864 #ifdef ASSERT
  1301     // any legacy C-killed slots.  Use Fat-Projections to do the killing.
  1301     // any legacy C-killed slots.  Use Fat-Projections to do the killing.
  1302     // Since the max-per-method covers the max-per-call-site and debug info
  1302     // Since the max-per-method covers the max-per-call-site and debug info
  1303     // is excluded on the max-per-method basis, debug info cannot land in
  1303     // is excluded on the max-per-method basis, debug info cannot land in
  1304     // this killed area.
  1304     // this killed area.
  1305     uint r_cnt = mcall->tf()->range()->cnt();
  1305     uint r_cnt = mcall->tf()->range()->cnt();
  1306     MachProjNode *proj = new (C, 1) MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj );
  1306     MachProjNode *proj = new (C) MachProjNode( mcall, r_cnt+10000, RegMask::Empty, MachProjNode::fat_proj );
  1307     if (!RegMask::can_represent_arg(OptoReg::Name(out_arg_limit_per_call-1))) {
  1307     if (!RegMask::can_represent_arg(OptoReg::Name(out_arg_limit_per_call-1))) {
  1308       C->record_method_not_compilable_all_tiers("unsupported outgoing calling sequence");
  1308       C->record_method_not_compilable_all_tiers("unsupported outgoing calling sequence");
  1309     } else {
  1309     } else {
  1310       for (int i = begin_out_arg_area; i < out_arg_limit_per_call; i++)
  1310       for (int i = begin_out_arg_area; i < out_arg_limit_per_call; i++)
  1311         proj->_rout.Insert(OptoReg::Name(i));
  1311         proj->_rout.Insert(OptoReg::Name(i));
  2133       case Op_CompareAndSwapL:
  2133       case Op_CompareAndSwapL:
  2134       case Op_CompareAndSwapP:
  2134       case Op_CompareAndSwapP:
  2135       case Op_CompareAndSwapN: {   // Convert trinary to binary-tree
  2135       case Op_CompareAndSwapN: {   // Convert trinary to binary-tree
  2136         Node *newval = n->in(MemNode::ValueIn );
  2136         Node *newval = n->in(MemNode::ValueIn );
  2137         Node *oldval  = n->in(LoadStoreConditionalNode::ExpectedIn);
  2137         Node *oldval  = n->in(LoadStoreConditionalNode::ExpectedIn);
  2138         Node *pair = new (C, 3) BinaryNode( oldval, newval );
  2138         Node *pair = new (C) BinaryNode( oldval, newval );
  2139         n->set_req(MemNode::ValueIn,pair);
  2139         n->set_req(MemNode::ValueIn,pair);
  2140         n->del_req(LoadStoreConditionalNode::ExpectedIn);
  2140         n->del_req(LoadStoreConditionalNode::ExpectedIn);
  2141         break;
  2141         break;
  2142       }
  2142       }
  2143       case Op_CMoveD:              // Convert trinary to binary-tree
  2143       case Op_CMoveD:              // Convert trinary to binary-tree
  2148       case Op_CMoveP: {
  2148       case Op_CMoveP: {
  2149         // Restructure into a binary tree for Matching.  It's possible that
  2149         // Restructure into a binary tree for Matching.  It's possible that
  2150         // we could move this code up next to the graph reshaping for IfNodes
  2150         // we could move this code up next to the graph reshaping for IfNodes
  2151         // or vice-versa, but I do not want to debug this for Ladybird.
  2151         // or vice-versa, but I do not want to debug this for Ladybird.
  2152         // 10/2/2000 CNC.
  2152         // 10/2/2000 CNC.
  2153         Node *pair1 = new (C, 3) BinaryNode(n->in(1),n->in(1)->in(1));
  2153         Node *pair1 = new (C) BinaryNode(n->in(1),n->in(1)->in(1));
  2154         n->set_req(1,pair1);
  2154         n->set_req(1,pair1);
  2155         Node *pair2 = new (C, 3) BinaryNode(n->in(2),n->in(3));
  2155         Node *pair2 = new (C) BinaryNode(n->in(2),n->in(3));
  2156         n->set_req(2,pair2);
  2156         n->set_req(2,pair2);
  2157         n->del_req(3);
  2157         n->del_req(3);
  2158         break;
  2158         break;
  2159       }
  2159       }
  2160       case Op_LoopLimit: {
  2160       case Op_LoopLimit: {
  2161         Node *pair1 = new (C, 3) BinaryNode(n->in(1),n->in(2));
  2161         Node *pair1 = new (C) BinaryNode(n->in(1),n->in(2));
  2162         n->set_req(1,pair1);
  2162         n->set_req(1,pair1);
  2163         n->set_req(2,n->in(3));
  2163         n->set_req(2,n->in(3));
  2164         n->del_req(3);
  2164         n->del_req(3);
  2165         break;
  2165         break;
  2166       }
  2166       }
  2167       case Op_StrEquals: {
  2167       case Op_StrEquals: {
  2168         Node *pair1 = new (C, 3) BinaryNode(n->in(2),n->in(3));
  2168         Node *pair1 = new (C) BinaryNode(n->in(2),n->in(3));
  2169         n->set_req(2,pair1);
  2169         n->set_req(2,pair1);
  2170         n->set_req(3,n->in(4));
  2170         n->set_req(3,n->in(4));
  2171         n->del_req(4);
  2171         n->del_req(4);
  2172         break;
  2172         break;
  2173       }
  2173       }
  2174       case Op_StrComp:
  2174       case Op_StrComp:
  2175       case Op_StrIndexOf: {
  2175       case Op_StrIndexOf: {
  2176         Node *pair1 = new (C, 3) BinaryNode(n->in(2),n->in(3));
  2176         Node *pair1 = new (C) BinaryNode(n->in(2),n->in(3));
  2177         n->set_req(2,pair1);
  2177         n->set_req(2,pair1);
  2178         Node *pair2 = new (C, 3) BinaryNode(n->in(4),n->in(5));
  2178         Node *pair2 = new (C) BinaryNode(n->in(4),n->in(5));
  2179         n->set_req(3,pair2);
  2179         n->set_req(3,pair2);
  2180         n->del_req(5);
  2180         n->del_req(5);
  2181         n->del_req(4);
  2181         n->del_req(4);
  2182         break;
  2182         break;
  2183       }
  2183       }