Mercurial > hg > truffle
comparison src/share/vm/opto/matcher.cpp @ 1137:97125851f396
6829187: compiler optimizations required for JSR 292
Summary: C2 implementation for invokedynamic support.
Reviewed-by: kvn, never
author | twisti |
---|---|
date | Tue, 05 Jan 2010 13:05:58 +0100 |
parents | 09572fede9d1 |
children | 844a9d73ec22 |
comparison
equal
deleted
inserted
replaced
1136:4b84186a8248 | 1137:97125851f396 |
---|---|
68 _visited(&_states_arena), | 68 _visited(&_states_arena), |
69 _shared(&_states_arena), | 69 _shared(&_states_arena), |
70 _dontcare(&_states_arena) { | 70 _dontcare(&_states_arena) { |
71 C->set_matcher(this); | 71 C->set_matcher(this); |
72 | 72 |
73 idealreg2spillmask[Op_RegI] = NULL; | 73 idealreg2spillmask [Op_RegI] = NULL; |
74 idealreg2spillmask[Op_RegN] = NULL; | 74 idealreg2spillmask [Op_RegN] = NULL; |
75 idealreg2spillmask[Op_RegL] = NULL; | 75 idealreg2spillmask [Op_RegL] = NULL; |
76 idealreg2spillmask[Op_RegF] = NULL; | 76 idealreg2spillmask [Op_RegF] = NULL; |
77 idealreg2spillmask[Op_RegD] = NULL; | 77 idealreg2spillmask [Op_RegD] = NULL; |
78 idealreg2spillmask[Op_RegP] = NULL; | 78 idealreg2spillmask [Op_RegP] = NULL; |
79 | 79 |
80 idealreg2debugmask[Op_RegI] = NULL; | 80 idealreg2debugmask [Op_RegI] = NULL; |
81 idealreg2debugmask[Op_RegN] = NULL; | 81 idealreg2debugmask [Op_RegN] = NULL; |
82 idealreg2debugmask[Op_RegL] = NULL; | 82 idealreg2debugmask [Op_RegL] = NULL; |
83 idealreg2debugmask[Op_RegF] = NULL; | 83 idealreg2debugmask [Op_RegF] = NULL; |
84 idealreg2debugmask[Op_RegD] = NULL; | 84 idealreg2debugmask [Op_RegD] = NULL; |
85 idealreg2debugmask[Op_RegP] = NULL; | 85 idealreg2debugmask [Op_RegP] = NULL; |
86 | |
87 idealreg2mhdebugmask[Op_RegI] = NULL; | |
88 idealreg2mhdebugmask[Op_RegN] = NULL; | |
89 idealreg2mhdebugmask[Op_RegL] = NULL; | |
90 idealreg2mhdebugmask[Op_RegF] = NULL; | |
91 idealreg2mhdebugmask[Op_RegD] = NULL; | |
92 idealreg2mhdebugmask[Op_RegP] = NULL; | |
93 | |
86 debug_only(_mem_node = NULL;) // Ideal memory node consumed by mach node | 94 debug_only(_mem_node = NULL;) // Ideal memory node consumed by mach node |
87 } | 95 } |
88 | 96 |
89 //------------------------------warp_incoming_stk_arg------------------------ | 97 //------------------------------warp_incoming_stk_arg------------------------ |
90 // This warps a VMReg into an OptoReg::Name | 98 // This warps a VMReg into an OptoReg::Name |
387 // Disallow any debug info in outgoing argument areas by setting the | 395 // Disallow any debug info in outgoing argument areas by setting the |
388 // initial mask accordingly. | 396 // initial mask accordingly. |
389 void Matcher::init_first_stack_mask() { | 397 void Matcher::init_first_stack_mask() { |
390 | 398 |
391 // Allocate storage for spill masks as masks for the appropriate load type. | 399 // Allocate storage for spill masks as masks for the appropriate load type. |
392 RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask)*12); | 400 RegMask *rms = (RegMask*)C->comp_arena()->Amalloc_D(sizeof(RegMask) * 3*6); |
393 idealreg2spillmask[Op_RegN] = &rms[0]; | 401 |
394 idealreg2spillmask[Op_RegI] = &rms[1]; | 402 idealreg2spillmask [Op_RegN] = &rms[0]; |
395 idealreg2spillmask[Op_RegL] = &rms[2]; | 403 idealreg2spillmask [Op_RegI] = &rms[1]; |
396 idealreg2spillmask[Op_RegF] = &rms[3]; | 404 idealreg2spillmask [Op_RegL] = &rms[2]; |
397 idealreg2spillmask[Op_RegD] = &rms[4]; | 405 idealreg2spillmask [Op_RegF] = &rms[3]; |
398 idealreg2spillmask[Op_RegP] = &rms[5]; | 406 idealreg2spillmask [Op_RegD] = &rms[4]; |
399 idealreg2debugmask[Op_RegN] = &rms[6]; | 407 idealreg2spillmask [Op_RegP] = &rms[5]; |
400 idealreg2debugmask[Op_RegI] = &rms[7]; | 408 |
401 idealreg2debugmask[Op_RegL] = &rms[8]; | 409 idealreg2debugmask [Op_RegN] = &rms[6]; |
402 idealreg2debugmask[Op_RegF] = &rms[9]; | 410 idealreg2debugmask [Op_RegI] = &rms[7]; |
403 idealreg2debugmask[Op_RegD] = &rms[10]; | 411 idealreg2debugmask [Op_RegL] = &rms[8]; |
404 idealreg2debugmask[Op_RegP] = &rms[11]; | 412 idealreg2debugmask [Op_RegF] = &rms[9]; |
413 idealreg2debugmask [Op_RegD] = &rms[10]; | |
414 idealreg2debugmask [Op_RegP] = &rms[11]; | |
415 | |
416 idealreg2mhdebugmask[Op_RegN] = &rms[12]; | |
417 idealreg2mhdebugmask[Op_RegI] = &rms[13]; | |
418 idealreg2mhdebugmask[Op_RegL] = &rms[14]; | |
419 idealreg2mhdebugmask[Op_RegF] = &rms[15]; | |
420 idealreg2mhdebugmask[Op_RegD] = &rms[16]; | |
421 idealreg2mhdebugmask[Op_RegP] = &rms[17]; | |
405 | 422 |
406 OptoReg::Name i; | 423 OptoReg::Name i; |
407 | 424 |
408 // At first, start with the empty mask | 425 // At first, start with the empty mask |
409 C->FIRST_STACK_mask().Clear(); | 426 C->FIRST_STACK_mask().Clear(); |
440 idealreg2spillmask[Op_RegP]->OR(C->FIRST_STACK_mask()); | 457 idealreg2spillmask[Op_RegP]->OR(C->FIRST_STACK_mask()); |
441 | 458 |
442 // Make up debug masks. Any spill slot plus callee-save registers. | 459 // Make up debug masks. Any spill slot plus callee-save registers. |
443 // Caller-save registers are assumed to be trashable by the various | 460 // Caller-save registers are assumed to be trashable by the various |
444 // inline-cache fixup routines. | 461 // inline-cache fixup routines. |
445 *idealreg2debugmask[Op_RegN]= *idealreg2spillmask[Op_RegN]; | 462 *idealreg2debugmask [Op_RegN]= *idealreg2spillmask[Op_RegN]; |
446 *idealreg2debugmask[Op_RegI]= *idealreg2spillmask[Op_RegI]; | 463 *idealreg2debugmask [Op_RegI]= *idealreg2spillmask[Op_RegI]; |
447 *idealreg2debugmask[Op_RegL]= *idealreg2spillmask[Op_RegL]; | 464 *idealreg2debugmask [Op_RegL]= *idealreg2spillmask[Op_RegL]; |
448 *idealreg2debugmask[Op_RegF]= *idealreg2spillmask[Op_RegF]; | 465 *idealreg2debugmask [Op_RegF]= *idealreg2spillmask[Op_RegF]; |
449 *idealreg2debugmask[Op_RegD]= *idealreg2spillmask[Op_RegD]; | 466 *idealreg2debugmask [Op_RegD]= *idealreg2spillmask[Op_RegD]; |
450 *idealreg2debugmask[Op_RegP]= *idealreg2spillmask[Op_RegP]; | 467 *idealreg2debugmask [Op_RegP]= *idealreg2spillmask[Op_RegP]; |
468 | |
469 *idealreg2mhdebugmask[Op_RegN]= *idealreg2spillmask[Op_RegN]; | |
470 *idealreg2mhdebugmask[Op_RegI]= *idealreg2spillmask[Op_RegI]; | |
471 *idealreg2mhdebugmask[Op_RegL]= *idealreg2spillmask[Op_RegL]; | |
472 *idealreg2mhdebugmask[Op_RegF]= *idealreg2spillmask[Op_RegF]; | |
473 *idealreg2mhdebugmask[Op_RegD]= *idealreg2spillmask[Op_RegD]; | |
474 *idealreg2mhdebugmask[Op_RegP]= *idealreg2spillmask[Op_RegP]; | |
451 | 475 |
452 // Prevent stub compilations from attempting to reference | 476 // Prevent stub compilations from attempting to reference |
453 // callee-saved registers from debug info | 477 // callee-saved registers from debug info |
454 bool exclude_soe = !Compile::current()->is_method_compilation(); | 478 bool exclude_soe = !Compile::current()->is_method_compilation(); |
455 | 479 |
456 for( i=OptoReg::Name(0); i<OptoReg::Name(_last_Mach_Reg); i = OptoReg::add(i,1) ) { | 480 for( i=OptoReg::Name(0); i<OptoReg::Name(_last_Mach_Reg); i = OptoReg::add(i,1) ) { |
457 // registers the caller has to save do not work | 481 // registers the caller has to save do not work |
458 if( _register_save_policy[i] == 'C' || | 482 if( _register_save_policy[i] == 'C' || |
459 _register_save_policy[i] == 'A' || | 483 _register_save_policy[i] == 'A' || |
460 (_register_save_policy[i] == 'E' && exclude_soe) ) { | 484 (_register_save_policy[i] == 'E' && exclude_soe) ) { |
461 idealreg2debugmask[Op_RegN]->Remove(i); | 485 idealreg2debugmask [Op_RegN]->Remove(i); |
462 idealreg2debugmask[Op_RegI]->Remove(i); // Exclude save-on-call | 486 idealreg2debugmask [Op_RegI]->Remove(i); // Exclude save-on-call |
463 idealreg2debugmask[Op_RegL]->Remove(i); // registers from debug | 487 idealreg2debugmask [Op_RegL]->Remove(i); // registers from debug |
464 idealreg2debugmask[Op_RegF]->Remove(i); // masks | 488 idealreg2debugmask [Op_RegF]->Remove(i); // masks |
465 idealreg2debugmask[Op_RegD]->Remove(i); | 489 idealreg2debugmask [Op_RegD]->Remove(i); |
466 idealreg2debugmask[Op_RegP]->Remove(i); | 490 idealreg2debugmask [Op_RegP]->Remove(i); |
467 } | 491 |
468 } | 492 idealreg2mhdebugmask[Op_RegN]->Remove(i); |
493 idealreg2mhdebugmask[Op_RegI]->Remove(i); | |
494 idealreg2mhdebugmask[Op_RegL]->Remove(i); | |
495 idealreg2mhdebugmask[Op_RegF]->Remove(i); | |
496 idealreg2mhdebugmask[Op_RegD]->Remove(i); | |
497 idealreg2mhdebugmask[Op_RegP]->Remove(i); | |
498 } | |
499 } | |
500 | |
501 // Subtract the register we use to save the SP for MethodHandle | |
502 // invokes to from the debug mask. | |
503 const RegMask save_mask = method_handle_invoke_SP_save_mask(); | |
504 idealreg2mhdebugmask[Op_RegN]->SUBTRACT(save_mask); | |
505 idealreg2mhdebugmask[Op_RegI]->SUBTRACT(save_mask); | |
506 idealreg2mhdebugmask[Op_RegL]->SUBTRACT(save_mask); | |
507 idealreg2mhdebugmask[Op_RegF]->SUBTRACT(save_mask); | |
508 idealreg2mhdebugmask[Op_RegD]->SUBTRACT(save_mask); | |
509 idealreg2mhdebugmask[Op_RegP]->SUBTRACT(save_mask); | |
469 } | 510 } |
470 | 511 |
471 //---------------------------is_save_on_entry---------------------------------- | 512 //---------------------------is_save_on_entry---------------------------------- |
472 bool Matcher::is_save_on_entry( int reg ) { | 513 bool Matcher::is_save_on_entry( int reg ) { |
473 return | 514 return |
987 uint cnt; | 1028 uint cnt; |
988 // Split out case for SafePoint vs Call | 1029 // Split out case for SafePoint vs Call |
989 CallNode *call; | 1030 CallNode *call; |
990 const TypeTuple *domain; | 1031 const TypeTuple *domain; |
991 ciMethod* method = NULL; | 1032 ciMethod* method = NULL; |
1033 bool is_method_handle_invoke = false; // for special kill effects | |
992 if( sfpt->is_Call() ) { | 1034 if( sfpt->is_Call() ) { |
993 call = sfpt->as_Call(); | 1035 call = sfpt->as_Call(); |
994 domain = call->tf()->domain(); | 1036 domain = call->tf()->domain(); |
995 cnt = domain->cnt(); | 1037 cnt = domain->cnt(); |
996 | 1038 |
1011 const CallJavaNode *call_java = call->as_CallJava(); | 1053 const CallJavaNode *call_java = call->as_CallJava(); |
1012 method = call_java->method(); | 1054 method = call_java->method(); |
1013 mcall_java->_method = method; | 1055 mcall_java->_method = method; |
1014 mcall_java->_bci = call_java->_bci; | 1056 mcall_java->_bci = call_java->_bci; |
1015 mcall_java->_optimized_virtual = call_java->is_optimized_virtual(); | 1057 mcall_java->_optimized_virtual = call_java->is_optimized_virtual(); |
1058 is_method_handle_invoke = call_java->is_method_handle_invoke(); | |
1059 mcall_java->_method_handle_invoke = is_method_handle_invoke; | |
1016 if( mcall_java->is_MachCallStaticJava() ) | 1060 if( mcall_java->is_MachCallStaticJava() ) |
1017 mcall_java->as_MachCallStaticJava()->_name = | 1061 mcall_java->as_MachCallStaticJava()->_name = |
1018 call_java->as_CallStaticJava()->_name; | 1062 call_java->as_CallStaticJava()->_name; |
1019 if( mcall_java->is_MachCallDynamicJava() ) | 1063 if( mcall_java->is_MachCallDynamicJava() ) |
1020 mcall_java->as_MachCallDynamicJava()->_vtable_index = | 1064 mcall_java->as_MachCallDynamicJava()->_vtable_index = |
1122 } // End of for all arguments | 1166 } // End of for all arguments |
1123 | 1167 |
1124 // Compute number of stack slots needed to restore stack in case of | 1168 // Compute number of stack slots needed to restore stack in case of |
1125 // Pascal-style argument popping. | 1169 // Pascal-style argument popping. |
1126 mcall->_argsize = out_arg_limit_per_call - begin_out_arg_area; | 1170 mcall->_argsize = out_arg_limit_per_call - begin_out_arg_area; |
1171 } | |
1172 | |
1173 if (is_method_handle_invoke) { | |
1174 // Kill some extra stack space in case method handles want to do | |
1175 // a little in-place argument insertion. | |
1176 int regs_per_word = NOT_LP64(1) LP64_ONLY(2); // %%% make a global const! | |
1177 out_arg_limit_per_call += MethodHandlePushLimit * regs_per_word; | |
1178 // Do not update mcall->_argsize because (a) the extra space is not | |
1179 // pushed as arguments and (b) _argsize is dead (not used anywhere). | |
1127 } | 1180 } |
1128 | 1181 |
1129 // Compute the max stack slot killed by any call. These will not be | 1182 // Compute the max stack slot killed by any call. These will not be |
1130 // available for debug info, and will be used to adjust FIRST_STACK_mask | 1183 // available for debug info, and will be used to adjust FIRST_STACK_mask |
1131 // after all call sites have been visited. | 1184 // after all call sites have been visited. |