src/share/vm/opto/matcher.cpp

changeset 1572
97125851f396
parent 1496
09572fede9d1
child 1638
844a9d73ec22
     1.1 --- a/src/share/vm/opto/matcher.cpp	Mon Jan 04 15:21:09 2010 -0800
     1.2 +++ b/src/share/vm/opto/matcher.cpp	Tue Jan 05 13:05:58 2010 +0100
     1.3 @@ -70,19 +70,27 @@
     1.4    _dontcare(&_states_arena) {
     1.5    C->set_matcher(this);
     1.6  
     1.7 -  idealreg2spillmask[Op_RegI] = NULL;
     1.8 -  idealreg2spillmask[Op_RegN] = NULL;
     1.9 -  idealreg2spillmask[Op_RegL] = NULL;
    1.10 -  idealreg2spillmask[Op_RegF] = NULL;
    1.11 -  idealreg2spillmask[Op_RegD] = NULL;
    1.12 -  idealreg2spillmask[Op_RegP] = NULL;
    1.13 +  idealreg2spillmask  [Op_RegI] = NULL;
    1.14 +  idealreg2spillmask  [Op_RegN] = NULL;
    1.15 +  idealreg2spillmask  [Op_RegL] = NULL;
    1.16 +  idealreg2spillmask  [Op_RegF] = NULL;
    1.17 +  idealreg2spillmask  [Op_RegD] = NULL;
    1.18 +  idealreg2spillmask  [Op_RegP] = NULL;
    1.19  
    1.20 -  idealreg2debugmask[Op_RegI] = NULL;
    1.21 -  idealreg2debugmask[Op_RegN] = NULL;
    1.22 -  idealreg2debugmask[Op_RegL] = NULL;
    1.23 -  idealreg2debugmask[Op_RegF] = NULL;
    1.24 -  idealreg2debugmask[Op_RegD] = NULL;
    1.25 -  idealreg2debugmask[Op_RegP] = NULL;
    1.26 +  idealreg2debugmask  [Op_RegI] = NULL;
    1.27 +  idealreg2debugmask  [Op_RegN] = NULL;
    1.28 +  idealreg2debugmask  [Op_RegL] = NULL;
    1.29 +  idealreg2debugmask  [Op_RegF] = NULL;
    1.30 +  idealreg2debugmask  [Op_RegD] = NULL;
    1.31 +  idealreg2debugmask  [Op_RegP] = NULL;
    1.32 +
    1.33 +  idealreg2mhdebugmask[Op_RegI] = NULL;
    1.34 +  idealreg2mhdebugmask[Op_RegN] = NULL;
    1.35 +  idealreg2mhdebugmask[Op_RegL] = NULL;
    1.36 +  idealreg2mhdebugmask[Op_RegF] = NULL;
    1.37 +  idealreg2mhdebugmask[Op_RegD] = NULL;
    1.38 +  idealreg2mhdebugmask[Op_RegP] = NULL;
    1.39 +
    1.40    debug_only(_mem_node = NULL;)   // Ideal memory node consumed by mach node
    1.41  }
    1.42  
    1.43 @@ -389,19 +397,28 @@
    1.44  void Matcher::init_first_stack_mask() {
    1.45  
    1.46    // Allocate storage for spill masks as masks for the appropriate load type.
    1.47 -  RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask)*12);
    1.48 -  idealreg2spillmask[Op_RegN] = &rms[0];
    1.49 -  idealreg2spillmask[Op_RegI] = &rms[1];
    1.50 -  idealreg2spillmask[Op_RegL] = &rms[2];
    1.51 -  idealreg2spillmask[Op_RegF] = &rms[3];
    1.52 -  idealreg2spillmask[Op_RegD] = &rms[4];
    1.53 -  idealreg2spillmask[Op_RegP] = &rms[5];
    1.54 -  idealreg2debugmask[Op_RegN] = &rms[6];
    1.55 -  idealreg2debugmask[Op_RegI] = &rms[7];
    1.56 -  idealreg2debugmask[Op_RegL] = &rms[8];
    1.57 -  idealreg2debugmask[Op_RegF] = &rms[9];
    1.58 -  idealreg2debugmask[Op_RegD] = &rms[10];
    1.59 -  idealreg2debugmask[Op_RegP] = &rms[11];
    1.60 +  RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * 3*6);
    1.61 +
    1.62 +  idealreg2spillmask  [Op_RegN] = &rms[0];
    1.63 +  idealreg2spillmask  [Op_RegI] = &rms[1];
    1.64 +  idealreg2spillmask  [Op_RegL] = &rms[2];
    1.65 +  idealreg2spillmask  [Op_RegF] = &rms[3];
    1.66 +  idealreg2spillmask  [Op_RegD] = &rms[4];
    1.67 +  idealreg2spillmask  [Op_RegP] = &rms[5];
    1.68 +
    1.69 +  idealreg2debugmask  [Op_RegN] = &rms[6];
    1.70 +  idealreg2debugmask  [Op_RegI] = &rms[7];
    1.71 +  idealreg2debugmask  [Op_RegL] = &rms[8];
    1.72 +  idealreg2debugmask  [Op_RegF] = &rms[9];
    1.73 +  idealreg2debugmask  [Op_RegD] = &rms[10];
    1.74 +  idealreg2debugmask  [Op_RegP] = &rms[11];
    1.75 +
    1.76 +  idealreg2mhdebugmask[Op_RegN] = &rms[12];
    1.77 +  idealreg2mhdebugmask[Op_RegI] = &rms[13];
    1.78 +  idealreg2mhdebugmask[Op_RegL] = &rms[14];
    1.79 +  idealreg2mhdebugmask[Op_RegF] = &rms[15];
    1.80 +  idealreg2mhdebugmask[Op_RegD] = &rms[16];
    1.81 +  idealreg2mhdebugmask[Op_RegP] = &rms[17];
    1.82  
    1.83    OptoReg::Name i;
    1.84  
    1.85 @@ -442,12 +459,19 @@
    1.86    // Make up debug masks.  Any spill slot plus callee-save registers.
    1.87    // Caller-save registers are assumed to be trashable by the various
    1.88    // inline-cache fixup routines.
    1.89 -  *idealreg2debugmask[Op_RegN]= *idealreg2spillmask[Op_RegN];
    1.90 -  *idealreg2debugmask[Op_RegI]= *idealreg2spillmask[Op_RegI];
    1.91 -  *idealreg2debugmask[Op_RegL]= *idealreg2spillmask[Op_RegL];
    1.92 -  *idealreg2debugmask[Op_RegF]= *idealreg2spillmask[Op_RegF];
    1.93 -  *idealreg2debugmask[Op_RegD]= *idealreg2spillmask[Op_RegD];
    1.94 -  *idealreg2debugmask[Op_RegP]= *idealreg2spillmask[Op_RegP];
    1.95 +  *idealreg2debugmask  [Op_RegN]= *idealreg2spillmask[Op_RegN];
    1.96 +  *idealreg2debugmask  [Op_RegI]= *idealreg2spillmask[Op_RegI];
    1.97 +  *idealreg2debugmask  [Op_RegL]= *idealreg2spillmask[Op_RegL];
    1.98 +  *idealreg2debugmask  [Op_RegF]= *idealreg2spillmask[Op_RegF];
    1.99 +  *idealreg2debugmask  [Op_RegD]= *idealreg2spillmask[Op_RegD];
   1.100 +  *idealreg2debugmask  [Op_RegP]= *idealreg2spillmask[Op_RegP];
   1.101 +
   1.102 +  *idealreg2mhdebugmask[Op_RegN]= *idealreg2spillmask[Op_RegN];
   1.103 +  *idealreg2mhdebugmask[Op_RegI]= *idealreg2spillmask[Op_RegI];
   1.104 +  *idealreg2mhdebugmask[Op_RegL]= *idealreg2spillmask[Op_RegL];
   1.105 +  *idealreg2mhdebugmask[Op_RegF]= *idealreg2spillmask[Op_RegF];
   1.106 +  *idealreg2mhdebugmask[Op_RegD]= *idealreg2spillmask[Op_RegD];
   1.107 +  *idealreg2mhdebugmask[Op_RegP]= *idealreg2spillmask[Op_RegP];
   1.108  
   1.109    // Prevent stub compilations from attempting to reference
   1.110    // callee-saved registers from debug info
   1.111 @@ -458,14 +482,31 @@
   1.112      if( _register_save_policy[i] == 'C' ||
   1.113          _register_save_policy[i] == 'A' ||
   1.114          (_register_save_policy[i] == 'E' && exclude_soe) ) {
   1.115 -      idealreg2debugmask[Op_RegN]->Remove(i);
   1.116 -      idealreg2debugmask[Op_RegI]->Remove(i); // Exclude save-on-call
   1.117 -      idealreg2debugmask[Op_RegL]->Remove(i); // registers from debug
   1.118 -      idealreg2debugmask[Op_RegF]->Remove(i); // masks
   1.119 -      idealreg2debugmask[Op_RegD]->Remove(i);
   1.120 -      idealreg2debugmask[Op_RegP]->Remove(i);
   1.121 +      idealreg2debugmask  [Op_RegN]->Remove(i);
   1.122 +      idealreg2debugmask  [Op_RegI]->Remove(i); // Exclude save-on-call
   1.123 +      idealreg2debugmask  [Op_RegL]->Remove(i); // registers from debug
   1.124 +      idealreg2debugmask  [Op_RegF]->Remove(i); // masks
   1.125 +      idealreg2debugmask  [Op_RegD]->Remove(i);
   1.126 +      idealreg2debugmask  [Op_RegP]->Remove(i);
   1.127 +
   1.128 +      idealreg2mhdebugmask[Op_RegN]->Remove(i);
   1.129 +      idealreg2mhdebugmask[Op_RegI]->Remove(i);
   1.130 +      idealreg2mhdebugmask[Op_RegL]->Remove(i);
   1.131 +      idealreg2mhdebugmask[Op_RegF]->Remove(i);
   1.132 +      idealreg2mhdebugmask[Op_RegD]->Remove(i);
   1.133 +      idealreg2mhdebugmask[Op_RegP]->Remove(i);
   1.134      }
   1.135    }
   1.136 +
   1.137 +  // Subtract the register we use to save the SP for MethodHandle
   1.138 +  // invokes to from the debug mask.
   1.139 +  const RegMask save_mask = method_handle_invoke_SP_save_mask();
   1.140 +  idealreg2mhdebugmask[Op_RegN]->SUBTRACT(save_mask);
   1.141 +  idealreg2mhdebugmask[Op_RegI]->SUBTRACT(save_mask);
   1.142 +  idealreg2mhdebugmask[Op_RegL]->SUBTRACT(save_mask);
   1.143 +  idealreg2mhdebugmask[Op_RegF]->SUBTRACT(save_mask);
   1.144 +  idealreg2mhdebugmask[Op_RegD]->SUBTRACT(save_mask);
   1.145 +  idealreg2mhdebugmask[Op_RegP]->SUBTRACT(save_mask);
   1.146  }
   1.147  
   1.148  //---------------------------is_save_on_entry----------------------------------
   1.149 @@ -989,6 +1030,7 @@
   1.150    CallNode *call;
   1.151    const TypeTuple *domain;
   1.152    ciMethod*        method = NULL;
   1.153 +  bool             is_method_handle_invoke = false;  // for special kill effects
   1.154    if( sfpt->is_Call() ) {
   1.155      call = sfpt->as_Call();
   1.156      domain = call->tf()->domain();
   1.157 @@ -1013,6 +1055,8 @@
   1.158        mcall_java->_method = method;
   1.159        mcall_java->_bci = call_java->_bci;
   1.160        mcall_java->_optimized_virtual = call_java->is_optimized_virtual();
   1.161 +      is_method_handle_invoke = call_java->is_method_handle_invoke();
   1.162 +      mcall_java->_method_handle_invoke = is_method_handle_invoke;
   1.163        if( mcall_java->is_MachCallStaticJava() )
   1.164          mcall_java->as_MachCallStaticJava()->_name =
   1.165           call_java->as_CallStaticJava()->_name;
   1.166 @@ -1126,6 +1170,15 @@
   1.167      mcall->_argsize = out_arg_limit_per_call - begin_out_arg_area;
   1.168    }
   1.169  
   1.170 +  if (is_method_handle_invoke) {
   1.171 +    // Kill some extra stack space in case method handles want to do
   1.172 +    // a little in-place argument insertion.
   1.173 +    int regs_per_word  = NOT_LP64(1) LP64_ONLY(2); // %%% make a global const!
   1.174 +    out_arg_limit_per_call += MethodHandlePushLimit * regs_per_word;
   1.175 +    // Do not update mcall->_argsize because (a) the extra space is not
   1.176 +    // pushed as arguments and (b) _argsize is dead (not used anywhere).
   1.177 +  }
   1.178 +
   1.179    // Compute the max stack slot killed by any call.  These will not be
   1.180    // available for debug info, and will be used to adjust FIRST_STACK_mask
   1.181    // after all call sites have been visited.

mercurial