379 } |
379 } |
380 } |
380 } |
381 |
381 |
382 //------------------------------Parse------------------------------------------ |
382 //------------------------------Parse------------------------------------------ |
383 // Main parser constructor. |
383 // Main parser constructor. |
384 Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses, Parse* parent) |
384 Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses) |
385 : _exits(caller), _parent(parent) |
385 : _exits(caller) |
386 { |
386 { |
387 // Init some variables |
387 // Init some variables |
388 _caller = caller; |
388 _caller = caller; |
389 _method = parse_method; |
389 _method = parse_method; |
390 _expected_uses = expected_uses; |
390 _expected_uses = expected_uses; |
393 _wrote_volatile = false; |
393 _wrote_volatile = false; |
394 _alloc_with_final = NULL; |
394 _alloc_with_final = NULL; |
395 _entry_bci = InvocationEntryBci; |
395 _entry_bci = InvocationEntryBci; |
396 _tf = NULL; |
396 _tf = NULL; |
397 _block = NULL; |
397 _block = NULL; |
|
398 _first_return = true; |
|
399 _replaced_nodes_for_exceptions = false; |
|
400 _new_idx = C->unique(); |
398 debug_only(_block_count = -1); |
401 debug_only(_block_count = -1); |
399 debug_only(_blocks = (Block*)-1); |
402 debug_only(_blocks = (Block*)-1); |
400 #ifndef PRODUCT |
403 #ifndef PRODUCT |
401 if (PrintCompilation || PrintOpto) { |
404 if (PrintCompilation || PrintOpto) { |
402 // Make sure I have an inline tree, so I can print messages about it. |
405 // Make sure I have an inline tree, so I can print messages about it. |
893 caller.set_sp(_caller->sp()); |
896 caller.set_sp(_caller->sp()); |
894 // Copy out the standard machine state: |
897 // Copy out the standard machine state: |
895 for (uint i = 0; i < TypeFunc::Parms; i++) { |
898 for (uint i = 0; i < TypeFunc::Parms; i++) { |
896 caller.map()->set_req(i, ex_map->in(i)); |
899 caller.map()->set_req(i, ex_map->in(i)); |
897 } |
900 } |
|
901 if (ex_map->has_replaced_nodes()) { |
|
902 _replaced_nodes_for_exceptions = true; |
|
903 } |
|
904 caller.map()->transfer_replaced_nodes_from(ex_map, _new_idx); |
898 // ...and the exception: |
905 // ...and the exception: |
899 Node* ex_oop = saved_ex_oop(ex_map); |
906 Node* ex_oop = saved_ex_oop(ex_map); |
900 SafePointNode* caller_ex_map = caller.make_exception_state(ex_oop); |
907 SafePointNode* caller_ex_map = caller.make_exception_state(ex_oop); |
901 // Finally, collect the new exception state in my exits: |
908 // Finally, collect the new exception state in my exits: |
902 _exits.add_exception_state(caller_ex_map); |
909 _exits.add_exception_state(caller_ex_map); |
961 // (e.g., null checks) arising from multiple points within this method. |
968 // (e.g., null checks) arising from multiple points within this method. |
962 // See GraphKit::add_exception_state, which performs the commoning. |
969 // See GraphKit::add_exception_state, which performs the commoning. |
963 bool do_synch = method()->is_synchronized() && GenerateSynchronizationCode; |
970 bool do_synch = method()->is_synchronized() && GenerateSynchronizationCode; |
964 |
971 |
965 // record exit from a method if compiled while Dtrace is turned on. |
972 // record exit from a method if compiled while Dtrace is turned on. |
966 if (do_synch || C->env()->dtrace_method_probes()) { |
973 if (do_synch || C->env()->dtrace_method_probes() || _replaced_nodes_for_exceptions) { |
967 // First move the exception list out of _exits: |
974 // First move the exception list out of _exits: |
968 GraphKit kit(_exits.transfer_exceptions_into_jvms()); |
975 GraphKit kit(_exits.transfer_exceptions_into_jvms()); |
969 SafePointNode* normal_map = kit.map(); // keep this guy safe |
976 SafePointNode* normal_map = kit.map(); // keep this guy safe |
970 // Now re-collect the exceptions into _exits: |
977 // Now re-collect the exceptions into _exits: |
971 SafePointNode* ex_map; |
978 SafePointNode* ex_map; |
986 kit.shared_unlock(_synch_lock->box_node(), _synch_lock->obj_node()); |
993 kit.shared_unlock(_synch_lock->box_node(), _synch_lock->obj_node()); |
987 } |
994 } |
988 if (C->env()->dtrace_method_probes()) { |
995 if (C->env()->dtrace_method_probes()) { |
989 kit.make_dtrace_method_exit(method()); |
996 kit.make_dtrace_method_exit(method()); |
990 } |
997 } |
|
998 if (_replaced_nodes_for_exceptions) { |
|
999 kit.map()->apply_replaced_nodes(); |
|
1000 } |
991 // Done with exception-path processing. |
1001 // Done with exception-path processing. |
992 ex_map = kit.make_exception_state(ex_oop); |
1002 ex_map = kit.make_exception_state(ex_oop); |
993 assert(ex_jvms->same_calls_as(ex_map->jvms()), "sanity"); |
1003 assert(ex_jvms->same_calls_as(ex_map->jvms()), "sanity"); |
994 // Pop the last vestige of this method: |
1004 // Pop the last vestige of this method: |
995 ex_map->set_jvms(caller->clone_shallow(C)); |
1005 ex_map->set_jvms(caller->clone_shallow(C)); |
1005 SafePointNode* ex_map; |
1015 SafePointNode* ex_map; |
1006 while ((ex_map = caller.pop_exception_state()) != NULL) { |
1016 while ((ex_map = caller.pop_exception_state()) != NULL) { |
1007 _exits.add_exception_state(ex_map); |
1017 _exits.add_exception_state(ex_map); |
1008 } |
1018 } |
1009 } |
1019 } |
|
1020 _exits.map()->apply_replaced_nodes(); |
1010 } |
1021 } |
1011 |
1022 |
1012 //-----------------------------create_entry_map------------------------------- |
1023 //-----------------------------create_entry_map------------------------------- |
1013 // Initialize our parser map to contain the types at method entry. |
1024 // Initialize our parser map to contain the types at method entry. |
1014 // For OSR, the map contains a single RawPtr parameter. |
1025 // For OSR, the map contains a single RawPtr parameter. |
1019 if (len >= 32760) { |
1030 if (len >= 32760) { |
1020 C->record_method_not_compilable_all_tiers("too many local variables"); |
1031 C->record_method_not_compilable_all_tiers("too many local variables"); |
1021 return NULL; |
1032 return NULL; |
1022 } |
1033 } |
1023 |
1034 |
|
1035 // clear current replaced nodes that are of no use from here on (map was cloned in build_exits). |
|
1036 _caller->map()->delete_replaced_nodes(); |
|
1037 |
1024 // If this is an inlined method, we may have to do a receiver null check. |
1038 // If this is an inlined method, we may have to do a receiver null check. |
1025 if (_caller->has_method() && is_normal_parse() && !method()->is_static()) { |
1039 if (_caller->has_method() && is_normal_parse() && !method()->is_static()) { |
1026 GraphKit kit(_caller); |
1040 GraphKit kit(_caller); |
1027 kit.null_check_receiver_before_call(method()); |
1041 kit.null_check_receiver_before_call(method()); |
1028 _caller = kit.transfer_exceptions_into_jvms(); |
1042 _caller = kit.transfer_exceptions_into_jvms(); |
1042 record_for_igvn(map()); |
1056 record_for_igvn(map()); |
1043 assert(jvms->endoff() == len, "correct jvms sizing"); |
1057 assert(jvms->endoff() == len, "correct jvms sizing"); |
1044 |
1058 |
1045 SafePointNode* inmap = _caller->map(); |
1059 SafePointNode* inmap = _caller->map(); |
1046 assert(inmap != NULL, "must have inmap"); |
1060 assert(inmap != NULL, "must have inmap"); |
|
1061 // In case of null check on receiver above |
|
1062 map()->transfer_replaced_nodes_from(inmap, _new_idx); |
1047 |
1063 |
1048 uint i; |
1064 uint i; |
1049 |
1065 |
1050 // Pass thru the predefined input parameters. |
1066 // Pass thru the predefined input parameters. |
1051 for (i = 0; i < TypeFunc::Parms; i++) { |
1067 for (i = 0; i < TypeFunc::Parms; i++) { |
1671 !r->in(0)) { // The occasional useless Region |
1687 !r->in(0)) { // The occasional useless Region |
1672 assert(control() == r, ""); |
1688 assert(control() == r, ""); |
1673 set_control(r->nonnull_req()); |
1689 set_control(r->nonnull_req()); |
1674 } |
1690 } |
1675 |
1691 |
|
1692 map()->merge_replaced_nodes_with(newin); |
|
1693 |
1676 // newin has been subsumed into the lazy merge, and is now dead. |
1694 // newin has been subsumed into the lazy merge, and is now dead. |
1677 set_block(save_block); |
1695 set_block(save_block); |
1678 |
1696 |
1679 stop(); // done with this guy, for now |
1697 stop(); // done with this guy, for now |
1680 } |
1698 } |
2075 } |
2093 } |
2076 } |
2094 } |
2077 phi->add_req(value); |
2095 phi->add_req(value); |
2078 } |
2096 } |
2079 |
2097 |
|
2098 if (_first_return) { |
|
2099 _exits.map()->transfer_replaced_nodes_from(map(), _new_idx); |
|
2100 _first_return = false; |
|
2101 } else { |
|
2102 _exits.map()->merge_replaced_nodes_with(map()); |
|
2103 } |
|
2104 |
2080 stop_and_kill_map(); // This CFG path dies here |
2105 stop_and_kill_map(); // This CFG path dies here |
2081 } |
2106 } |
2082 |
2107 |
2083 |
2108 |
2084 //------------------------------add_safepoint---------------------------------- |
2109 //------------------------------add_safepoint---------------------------------- |