28 #include "asm/codeBuffer.hpp" |
28 #include "asm/codeBuffer.hpp" |
29 #include "ci/compilerInterface.hpp" |
29 #include "ci/compilerInterface.hpp" |
30 #include "code/debugInfoRec.hpp" |
30 #include "code/debugInfoRec.hpp" |
31 #include "code/exceptionHandlerTable.hpp" |
31 #include "code/exceptionHandlerTable.hpp" |
32 #include "compiler/compilerOracle.hpp" |
32 #include "compiler/compilerOracle.hpp" |
|
33 #include "compiler/compileBroker.hpp" |
33 #include "libadt/dict.hpp" |
34 #include "libadt/dict.hpp" |
34 #include "libadt/port.hpp" |
35 #include "libadt/port.hpp" |
35 #include "libadt/vectset.hpp" |
36 #include "libadt/vectset.hpp" |
36 #include "memory/resourceArea.hpp" |
37 #include "memory/resourceArea.hpp" |
37 #include "opto/idealGraphPrinter.hpp" |
38 #include "opto/idealGraphPrinter.hpp" |
367 WarmCallInfo* _warm_calls; // Sorted work-list for heat-based inlining. |
368 WarmCallInfo* _warm_calls; // Sorted work-list for heat-based inlining. |
368 |
369 |
369 GrowableArray<CallGenerator*> _late_inlines; // List of CallGenerators to be revisited after |
370 GrowableArray<CallGenerator*> _late_inlines; // List of CallGenerators to be revisited after |
370 // main parsing has finished. |
371 // main parsing has finished. |
371 |
372 |
|
373 // Inlining may not happen in parse order which would make |
|
374 // PrintInlining output confusing. Keep track of PrintInlining |
|
375 // pieces in order. |
|
376 class PrintInliningBuffer : public ResourceObj { |
|
377 private: |
|
378 CallGenerator* _cg; |
|
379 stringStream* _ss; |
|
380 |
|
381 public: |
|
382 PrintInliningBuffer() |
|
383 : _cg(NULL) { _ss = new stringStream(); } |
|
384 |
|
385 stringStream* ss() const { return _ss; } |
|
386 CallGenerator* cg() const { return _cg; } |
|
387 void set_cg(CallGenerator* cg) { _cg = cg; } |
|
388 }; |
|
389 |
|
390 GrowableArray<PrintInliningBuffer>* _print_inlining_list; |
|
391 int _print_inlining; |
|
392 |
|
393 public: |
|
394 |
|
395 outputStream* print_inlining_stream() const { |
|
396 return _print_inlining_list->at(_print_inlining).ss(); |
|
397 } |
|
398 |
|
399 void print_inlining_skip(CallGenerator* cg) { |
|
400 if (PrintInlining) { |
|
401 _print_inlining_list->at(_print_inlining).set_cg(cg); |
|
402 _print_inlining++; |
|
403 _print_inlining_list->insert_before(_print_inlining, PrintInliningBuffer()); |
|
404 } |
|
405 } |
|
406 |
|
407 void print_inlining_insert(CallGenerator* cg) { |
|
408 if (PrintInlining) { |
|
409 for (int i = 0; i < _print_inlining_list->length(); i++) { |
|
410 if (_print_inlining_list->at(i).cg() == cg) { |
|
411 _print_inlining_list->insert_before(i+1, PrintInliningBuffer()); |
|
412 _print_inlining = i+1; |
|
413 _print_inlining_list->at(i).set_cg(NULL); |
|
414 return; |
|
415 } |
|
416 } |
|
417 ShouldNotReachHere(); |
|
418 } |
|
419 } |
|
420 |
|
421 void print_inlining(ciMethod* method, int inline_level, int bci, const char* msg = NULL) { |
|
422 stringStream ss; |
|
423 CompileTask::print_inlining(&ss, method, inline_level, bci, msg); |
|
424 print_inlining_stream()->print(ss.as_string()); |
|
425 } |
|
426 |
|
427 private: |
372 // Matching, CFG layout, allocation, code generation |
428 // Matching, CFG layout, allocation, code generation |
373 PhaseCFG* _cfg; // Results of CFG finding |
429 PhaseCFG* _cfg; // Results of CFG finding |
374 bool _select_24_bit_instr; // We selected an instruction with a 24-bit result |
430 bool _select_24_bit_instr; // We selected an instruction with a 24-bit result |
375 bool _in_24_bit_fp_mode; // We are emitting instructions with 24-bit results |
431 bool _in_24_bit_fp_mode; // We are emitting instructions with 24-bit results |
376 int _java_calls; // Number of java calls in the method |
432 int _java_calls; // Number of java calls in the method |
589 } |
645 } |
590 uint dead_node_count() { return _dead_node_count; } |
646 uint dead_node_count() { return _dead_node_count; } |
591 void reset_dead_node_list() { _dead_node_list.Reset(); |
647 void reset_dead_node_list() { _dead_node_list.Reset(); |
592 _dead_node_count = 0; |
648 _dead_node_count = 0; |
593 } |
649 } |
594 uint live_nodes() { |
650 uint live_nodes() const { |
595 int val = _unique - _dead_node_count; |
651 int val = _unique - _dead_node_count; |
596 assert (val >= 0, err_msg_res("number of tracked dead nodes %d more than created nodes %d", _unique, _dead_node_count)); |
652 assert (val >= 0, err_msg_res("number of tracked dead nodes %d more than created nodes %d", _unique, _dead_node_count)); |
597 return (uint) val; |
653 return (uint) val; |
598 } |
654 } |
599 #ifdef ASSERT |
655 #ifdef ASSERT |
700 void gvn_replace_by(Node* n, Node* nn); |
756 void gvn_replace_by(Node* n, Node* nn); |
701 |
757 |
702 |
758 |
703 void identify_useful_nodes(Unique_Node_List &useful); |
759 void identify_useful_nodes(Unique_Node_List &useful); |
704 void update_dead_node_list(Unique_Node_List &useful); |
760 void update_dead_node_list(Unique_Node_List &useful); |
705 void remove_useless_nodes (Unique_Node_List &useful); |
761 void remove_useless_nodes (Unique_Node_List &useful); |
706 |
762 |
707 WarmCallInfo* warm_calls() const { return _warm_calls; } |
763 WarmCallInfo* warm_calls() const { return _warm_calls; } |
708 void set_warm_calls(WarmCallInfo* l) { _warm_calls = l; } |
764 void set_warm_calls(WarmCallInfo* l) { _warm_calls = l; } |
709 WarmCallInfo* pop_warm_call(); |
765 WarmCallInfo* pop_warm_call(); |
710 |
766 |
711 // Record this CallGenerator for inlining at the end of parsing. |
767 // Record this CallGenerator for inlining at the end of parsing. |
712 void add_late_inline(CallGenerator* cg) { _late_inlines.push(cg); } |
768 void add_late_inline(CallGenerator* cg) { _late_inlines.push(cg); } |
|
769 |
|
770 void dump_inlining(); |
713 |
771 |
714 // Matching, CFG layout, allocation, code generation |
772 // Matching, CFG layout, allocation, code generation |
715 PhaseCFG* cfg() { return _cfg; } |
773 PhaseCFG* cfg() { return _cfg; } |
716 bool select_24_bit_instr() const { return _select_24_bit_instr; } |
774 bool select_24_bit_instr() const { return _select_24_bit_instr; } |
717 bool in_24_bit_fp_mode() const { return _in_24_bit_fp_mode; } |
775 bool in_24_bit_fp_mode() const { return _in_24_bit_fp_mode; } |