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.