Mercurial > hg > truffle
comparison src/share/vm/c1/c1_GraphBuilder.cpp @ 1378:9f5b60a14736
6939930: exception unwind changes in 6919934 hurts compilation speed
Reviewed-by: twisti
author | never |
---|---|
date | Thu, 15 Apr 2010 18:14:49 -0700 |
parents | 3cf667df43ef |
children | b4776199210f |
comparison
equal
deleted
inserted
replaced
1377:ef74d6d1ac1e | 1378:9f5b60a14736 |
---|---|
827 // handler block instead of the default one but the synthetic | 827 // handler block instead of the default one but the synthetic |
828 // unlocker needs to be handled specially. The synthetic unlocker | 828 // unlocker needs to be handled specially. The synthetic unlocker |
829 // should be left alone since there can be only one and all code | 829 // should be left alone since there can be only one and all code |
830 // should dispatch to the same one. | 830 // should dispatch to the same one. |
831 XHandler* h = handlers->handler_at(i); | 831 XHandler* h = handlers->handler_at(i); |
832 if (h->handler_bci() != SynchronizationEntryBCI) { | 832 assert(h->handler_bci() != SynchronizationEntryBCI, "must be real"); |
833 h->set_entry_block(block_at(h->handler_bci())); | 833 h->set_entry_block(block_at(h->handler_bci())); |
834 } else { | |
835 assert(h->entry_block()->is_set(BlockBegin::default_exception_handler_flag), | |
836 "should be the synthetic unlock block"); | |
837 } | |
838 } | 834 } |
839 _jsr_xhandlers = handlers; | 835 _jsr_xhandlers = handlers; |
840 } | 836 } |
841 | 837 |
842 | 838 |
2865 | 2861 |
2866 // setup state for std entry | 2862 // setup state for std entry |
2867 _initial_state = state_at_entry(); | 2863 _initial_state = state_at_entry(); |
2868 start_block->merge(_initial_state); | 2864 start_block->merge(_initial_state); |
2869 | 2865 |
2870 // setup an exception handler to do the unlocking and/or | |
2871 // notification and unwind the frame. | |
2872 BlockBegin* sync_handler = new BlockBegin(-1); | |
2873 sync_handler->set(BlockBegin::exception_entry_flag); | |
2874 sync_handler->set(BlockBegin::is_on_work_list_flag); | |
2875 sync_handler->set(BlockBegin::default_exception_handler_flag); | |
2876 | |
2877 ciExceptionHandler* desc = new ciExceptionHandler(method()->holder(), 0, method()->code_size(), -1, 0); | |
2878 XHandler* h = new XHandler(desc); | |
2879 h->set_entry_block(sync_handler); | |
2880 scope_data()->xhandlers()->append(h); | |
2881 scope_data()->set_has_handler(); | |
2882 | |
2883 // complete graph | 2866 // complete graph |
2884 _vmap = new ValueMap(); | 2867 _vmap = new ValueMap(); |
2885 scope->compute_lock_stack_size(); | 2868 scope->compute_lock_stack_size(); |
2886 switch (scope->method()->intrinsic_id()) { | 2869 switch (scope->method()->intrinsic_id()) { |
2887 case vmIntrinsics::_dabs : // fall through | 2870 case vmIntrinsics::_dabs : // fall through |
2927 scope_data()->add_to_work_list(start_block); | 2910 scope_data()->add_to_work_list(start_block); |
2928 iterate_all_blocks(); | 2911 iterate_all_blocks(); |
2929 break; | 2912 break; |
2930 } | 2913 } |
2931 CHECK_BAILOUT(); | 2914 CHECK_BAILOUT(); |
2932 | |
2933 if (sync_handler && sync_handler->state() != NULL) { | |
2934 Value lock = NULL; | |
2935 if (method()->is_synchronized()) { | |
2936 lock = method()->is_static() ? new Constant(new InstanceConstant(method()->holder()->java_mirror())) : | |
2937 _initial_state->local_at(0); | |
2938 | |
2939 sync_handler->state()->unlock(); | |
2940 sync_handler->state()->lock(scope, lock); | |
2941 | |
2942 } | |
2943 fill_sync_handler(lock, sync_handler, true); | |
2944 } | |
2945 | 2915 |
2946 _start = setup_start_block(osr_bci, start_block, _osr_entry, _initial_state); | 2916 _start = setup_start_block(osr_bci, start_block, _osr_entry, _initial_state); |
2947 | 2917 |
2948 eliminate_redundant_phis(_start); | 2918 eliminate_redundant_phis(_start); |
2949 | 2919 |