323 set_inline_cleanup_info(_block, _last, _state); 324 } 325 BlockBegin* inline_cleanup_block() const { return scope_data()->inline_cleanup_block(); } 326 Instruction* inline_cleanup_return_prev() const { return scope_data()->inline_cleanup_return_prev(); } 327 ValueStack* inline_cleanup_state() const { return scope_data()->inline_cleanup_state(); } 328 void restore_inline_cleanup_info() { 329 _block = inline_cleanup_block(); 330 _last = inline_cleanup_return_prev(); 331 _state = inline_cleanup_state(); 332 } 333 void incr_num_returns() { scope_data()->incr_num_returns(); } 334 int num_returns() const { return scope_data()->num_returns(); } 335 intx max_inline_size() const { return scope_data()->max_inline_size(); } 336 int inline_level() const { return scope()->level(); } 337 int recursive_inline_level(ciMethod* callee) const; 338 339 // inlining of synchronized methods 340 void inline_sync_entry(Value lock, BlockBegin* sync_handler); 341 void fill_sync_handler(Value lock, BlockBegin* sync_handler, bool default_handler = false); 342 343 void build_graph_for_intrinsic(ciMethod* callee); 344 345 // inliners 346 bool try_inline( ciMethod* callee, bool holder_known, Bytecodes::Code bc = Bytecodes::_illegal, Value receiver = NULL); 347 bool try_inline_intrinsics(ciMethod* callee); 348 bool try_inline_full( ciMethod* callee, bool holder_known, Bytecodes::Code bc = Bytecodes::_illegal, Value receiver = NULL); 349 bool try_inline_jsr(int jsr_dest_bci); 350 351 const char* check_can_parse(ciMethod* callee) const; 352 const char* should_not_inline(ciMethod* callee) const; 353 354 // JSR 292 support 355 bool try_method_handle_inline(ciMethod* callee); 356 357 // helpers 358 void inline_bailout(const char* msg); 359 BlockBegin* header_block(BlockBegin* entry, BlockBegin::Flag f, ValueStack* state); 360 BlockBegin* setup_start_block(int osr_bci, BlockBegin* std_entry, BlockBegin* osr_entry, ValueStack* init_state); 361 void setup_osr_entry_block(); 362 void clear_inline_bailout(); 363 ValueStack* state_at_entry(); 364 void push_root_scope(IRScope* scope, BlockList* bci2block, BlockBegin* start); 365 void push_scope(ciMethod* callee, BlockBegin* continuation); 366 void push_scope_for_jsr(BlockBegin* jsr_continuation, int jsr_dest_bci); 367 void pop_scope(); 368 void pop_scope_for_jsr(); 369 370 void append_unsafe_get_obj(ciMethod* callee, BasicType t, bool is_volatile); 371 void append_unsafe_put_obj(ciMethod* callee, BasicType t, bool is_volatile); 372 void append_unsafe_get_raw(ciMethod* callee, BasicType t); 373 void append_unsafe_put_raw(ciMethod* callee, BasicType t); 374 void append_unsafe_CAS(ciMethod* callee); 375 void append_unsafe_get_and_set_obj(ciMethod* callee, bool is_add); 376 void append_char_access(ciMethod* callee, bool is_store); 377 378 void print_inlining(ciMethod* callee, const char* msg = NULL, bool success = true); 379 380 void profile_call(ciMethod* callee, Value recv, ciKlass* predicted_holder, Values* obj_args, bool inlined); 381 void profile_return_type(Value ret, ciMethod* callee, ciMethod* m = NULL, int bci = -1); 382 void profile_invocation(ciMethod* inlinee, ValueStack* state); 383 384 // Shortcuts to profiling control. 385 bool is_profiling() { return _compilation->is_profiling(); } 386 bool count_invocations() { return _compilation->count_invocations(); } 387 bool count_backedges() { return _compilation->count_backedges(); } 388 bool profile_branches() { return _compilation->profile_branches(); } 389 bool profile_calls() { return _compilation->profile_calls(); } 390 bool profile_inlined_calls() { return _compilation->profile_inlined_calls(); } 391 bool profile_checkcasts() { return _compilation->profile_checkcasts(); } 392 bool profile_parameters() { return _compilation->profile_parameters(); } 393 bool profile_arguments() { return _compilation->profile_arguments(); } 394 bool profile_return() { return _compilation->profile_return(); } 395 396 Values* args_list_for_profiling(ciMethod* target, int& start, bool may_have_receiver); | 323 set_inline_cleanup_info(_block, _last, _state); 324 } 325 BlockBegin* inline_cleanup_block() const { return scope_data()->inline_cleanup_block(); } 326 Instruction* inline_cleanup_return_prev() const { return scope_data()->inline_cleanup_return_prev(); } 327 ValueStack* inline_cleanup_state() const { return scope_data()->inline_cleanup_state(); } 328 void restore_inline_cleanup_info() { 329 _block = inline_cleanup_block(); 330 _last = inline_cleanup_return_prev(); 331 _state = inline_cleanup_state(); 332 } 333 void incr_num_returns() { scope_data()->incr_num_returns(); } 334 int num_returns() const { return scope_data()->num_returns(); } 335 intx max_inline_size() const { return scope_data()->max_inline_size(); } 336 int inline_level() const { return scope()->level(); } 337 int recursive_inline_level(ciMethod* callee) const; 338 339 // inlining of synchronized methods 340 void inline_sync_entry(Value lock, BlockBegin* sync_handler); 341 void fill_sync_handler(Value lock, BlockBegin* sync_handler, bool default_handler = false); 342 343 bool build_graph_for_intrinsic(ciMethod* callee); 344 345 // inliners 346 bool try_inline( ciMethod* callee, bool holder_known, Bytecodes::Code bc = Bytecodes::_illegal, Value receiver = NULL); 347 bool try_inline_intrinsics(ciMethod* callee); 348 bool try_inline_full( ciMethod* callee, bool holder_known, Bytecodes::Code bc = Bytecodes::_illegal, Value receiver = NULL); 349 bool try_inline_jsr(int jsr_dest_bci); 350 351 const char* check_can_parse(ciMethod* callee) const; 352 const char* should_not_inline(ciMethod* callee) const; 353 354 // JSR 292 support 355 bool try_method_handle_inline(ciMethod* callee); 356 357 // helpers 358 void inline_bailout(const char* msg); 359 BlockBegin* header_block(BlockBegin* entry, BlockBegin::Flag f, ValueStack* state); 360 BlockBegin* setup_start_block(int osr_bci, BlockBegin* std_entry, BlockBegin* osr_entry, ValueStack* init_state); 361 void setup_osr_entry_block(); 362 void clear_inline_bailout(); 363 ValueStack* state_at_entry(); 364 void push_root_scope(IRScope* scope, BlockList* bci2block, BlockBegin* start); 365 void push_scope(ciMethod* callee, BlockBegin* continuation); 366 void push_scope_for_jsr(BlockBegin* jsr_continuation, int jsr_dest_bci); 367 void pop_scope(); 368 void pop_scope_for_jsr(); 369 370 void append_unsafe_get_obj(ciMethod* callee, BasicType t, bool is_volatile); 371 void append_unsafe_put_obj(ciMethod* callee, BasicType t, bool is_volatile); 372 void append_unsafe_get_raw(ciMethod* callee, BasicType t); 373 void append_unsafe_put_raw(ciMethod* callee, BasicType t); 374 void append_unsafe_CAS(ciMethod* callee); 375 void append_unsafe_get_and_set_obj(ciMethod* callee, bool is_add); 376 bool append_char_access(ciMethod* callee, bool is_store); 377 378 void print_inlining(ciMethod* callee, const char* msg = NULL, bool success = true); 379 380 void profile_call(ciMethod* callee, Value recv, ciKlass* predicted_holder, Values* obj_args, bool inlined); 381 void profile_return_type(Value ret, ciMethod* callee, ciMethod* m = NULL, int bci = -1); 382 void profile_invocation(ciMethod* inlinee, ValueStack* state); 383 384 // Shortcuts to profiling control. 385 bool is_profiling() { return _compilation->is_profiling(); } 386 bool count_invocations() { return _compilation->count_invocations(); } 387 bool count_backedges() { return _compilation->count_backedges(); } 388 bool profile_branches() { return _compilation->profile_branches(); } 389 bool profile_calls() { return _compilation->profile_calls(); } 390 bool profile_inlined_calls() { return _compilation->profile_inlined_calls(); } 391 bool profile_checkcasts() { return _compilation->profile_checkcasts(); } 392 bool profile_parameters() { return _compilation->profile_parameters(); } 393 bool profile_arguments() { return _compilation->profile_arguments(); } 394 bool profile_return() { return _compilation->profile_return(); } 395 396 Values* args_list_for_profiling(ciMethod* target, int& start, bool may_have_receiver); |