comparison src/share/vm/opto/compile.cpp @ 10278:6f3fd5150b67

6934604: enable parts of EliminateAutoBox by default Summary: Resurrected autobox elimination code and enabled part of it by default. Reviewed-by: roland, twisti
author kvn
date Wed, 08 May 2013 15:08:01 -0700
parents 8373c19be854
children f2110083203d d2907f74462e
comparison
equal deleted inserted replaced
10277:aabf54ccedb1 10278:6f3fd5150b67
416 remove_expensive_node(n); 416 remove_expensive_node(n);
417 } 417 }
418 } 418 }
419 // clean up the late inline lists 419 // clean up the late inline lists
420 remove_useless_late_inlines(&_string_late_inlines, useful); 420 remove_useless_late_inlines(&_string_late_inlines, useful);
421 remove_useless_late_inlines(&_boxing_late_inlines, useful);
421 remove_useless_late_inlines(&_late_inlines, useful); 422 remove_useless_late_inlines(&_late_inlines, useful);
422 debug_only(verify_graph_edges(true/*check for no_dead_code*/);) 423 debug_only(verify_graph_edges(true/*check for no_dead_code*/);)
423 } 424 }
424 425
425 //------------------------------frame_size_in_words----------------------------- 426 //------------------------------frame_size_in_words-----------------------------
481 } 482 }
482 if (_do_escape_analysis != DoEscapeAnalysis && PrintOpto) { 483 if (_do_escape_analysis != DoEscapeAnalysis && PrintOpto) {
483 // Recompiling without escape analysis 484 // Recompiling without escape analysis
484 tty->print_cr("*********************************************************"); 485 tty->print_cr("*********************************************************");
485 tty->print_cr("** Bailout: Recompile without escape analysis **"); 486 tty->print_cr("** Bailout: Recompile without escape analysis **");
487 tty->print_cr("*********************************************************");
488 }
489 if (_eliminate_boxing != EliminateAutoBox && PrintOpto) {
490 // Recompiling without boxing elimination
491 tty->print_cr("*********************************************************");
492 tty->print_cr("** Bailout: Recompile without boxing elimination **");
486 tty->print_cr("*********************************************************"); 493 tty->print_cr("*********************************************************");
487 } 494 }
488 if (env()->break_at_compile()) { 495 if (env()->break_at_compile()) {
489 // Open the debugger when compiling this method. 496 // Open the debugger when compiling this method.
490 tty->print("### Breaking when compiling: "); 497 tty->print("### Breaking when compiling: ");
599 606
600 // Compile a method. entry_bci is -1 for normal compilations and indicates 607 // Compile a method. entry_bci is -1 for normal compilations and indicates
601 // the continuation bci for on stack replacement. 608 // the continuation bci for on stack replacement.
602 609
603 610
604 Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr_bci, bool subsume_loads, bool do_escape_analysis ) 611 Compile::Compile( ciEnv* ci_env, C2Compiler* compiler, ciMethod* target, int osr_bci,
612 bool subsume_loads, bool do_escape_analysis, bool eliminate_boxing )
605 : Phase(Compiler), 613 : Phase(Compiler),
606 _env(ci_env), 614 _env(ci_env),
607 _log(ci_env->log()), 615 _log(ci_env->log()),
608 _compile_id(ci_env->compile_id()), 616 _compile_id(ci_env->compile_id()),
609 _save_argument_registers(false), 617 _save_argument_registers(false),
615 _initial_gvn(NULL), 623 _initial_gvn(NULL),
616 _for_igvn(NULL), 624 _for_igvn(NULL),
617 _warm_calls(NULL), 625 _warm_calls(NULL),
618 _subsume_loads(subsume_loads), 626 _subsume_loads(subsume_loads),
619 _do_escape_analysis(do_escape_analysis), 627 _do_escape_analysis(do_escape_analysis),
628 _eliminate_boxing(eliminate_boxing),
620 _failure_reason(NULL), 629 _failure_reason(NULL),
621 _code_buffer("Compile::Fill_buffer"), 630 _code_buffer("Compile::Fill_buffer"),
622 _orig_pc_slot(0), 631 _orig_pc_slot(0),
623 _orig_pc_slot_offset_in_bytes(0), 632 _orig_pc_slot_offset_in_bytes(0),
624 _has_method_handle_invokes(false), 633 _has_method_handle_invokes(false),
636 _printer(IdealGraphPrinter::printer()), 645 _printer(IdealGraphPrinter::printer()),
637 #endif 646 #endif
638 _congraph(NULL), 647 _congraph(NULL),
639 _late_inlines(comp_arena(), 2, 0, NULL), 648 _late_inlines(comp_arena(), 2, 0, NULL),
640 _string_late_inlines(comp_arena(), 2, 0, NULL), 649 _string_late_inlines(comp_arena(), 2, 0, NULL),
650 _boxing_late_inlines(comp_arena(), 2, 0, NULL),
641 _late_inlines_pos(0), 651 _late_inlines_pos(0),
642 _number_of_mh_late_inlines(0), 652 _number_of_mh_late_inlines(0),
643 _inlining_progress(false), 653 _inlining_progress(false),
644 _inlining_incrementally(false), 654 _inlining_incrementally(false),
645 _print_inlining_list(NULL), 655 _print_inlining_list(NULL),
904 _warm_calls(NULL), 914 _warm_calls(NULL),
905 _orig_pc_slot(0), 915 _orig_pc_slot(0),
906 _orig_pc_slot_offset_in_bytes(0), 916 _orig_pc_slot_offset_in_bytes(0),
907 _subsume_loads(true), 917 _subsume_loads(true),
908 _do_escape_analysis(false), 918 _do_escape_analysis(false),
919 _eliminate_boxing(false),
909 _failure_reason(NULL), 920 _failure_reason(NULL),
910 _code_buffer("Compile::Fill_buffer"), 921 _code_buffer("Compile::Fill_buffer"),
911 _has_method_handle_invokes(false), 922 _has_method_handle_invokes(false),
912 _mach_constant_base_node(NULL), 923 _mach_constant_base_node(NULL),
913 _node_bundling_limit(0), 924 _node_bundling_limit(0),
1014 1025
1015 _fixed_slots = 0; 1026 _fixed_slots = 0;
1016 set_has_split_ifs(false); 1027 set_has_split_ifs(false);
1017 set_has_loops(has_method() && method()->has_loops()); // first approximation 1028 set_has_loops(has_method() && method()->has_loops()); // first approximation
1018 set_has_stringbuilder(false); 1029 set_has_stringbuilder(false);
1030 set_has_boxed_value(false);
1019 _trap_can_recompile = false; // no traps emitted yet 1031 _trap_can_recompile = false; // no traps emitted yet
1020 _major_progress = true; // start out assuming good things will happen 1032 _major_progress = true; // start out assuming good things will happen
1021 set_has_unsafe_access(false); 1033 set_has_unsafe_access(false);
1022 set_max_vector_size(0); 1034 set_max_vector_size(0);
1023 Copy::zero_to_bytes(_trap_hist, sizeof(_trap_hist)); 1035 Copy::zero_to_bytes(_trap_hist, sizeof(_trap_hist));
1805 if (failing()) return; 1817 if (failing()) return;
1806 } 1818 }
1807 _string_late_inlines.trunc_to(0); 1819 _string_late_inlines.trunc_to(0);
1808 } 1820 }
1809 1821
1822 // Late inlining of boxing methods
1823 void Compile::inline_boxing_calls(PhaseIterGVN& igvn) {
1824 if (_boxing_late_inlines.length() > 0) {
1825 assert(has_boxed_value(), "inconsistent");
1826
1827 PhaseGVN* gvn = initial_gvn();
1828 set_inlining_incrementally(true);
1829
1830 assert( igvn._worklist.size() == 0, "should be done with igvn" );
1831 for_igvn()->clear();
1832 gvn->replace_with(&igvn);
1833
1834 while (_boxing_late_inlines.length() > 0) {
1835 CallGenerator* cg = _boxing_late_inlines.pop();
1836 cg->do_late_inline();
1837 if (failing()) return;
1838 }
1839 _boxing_late_inlines.trunc_to(0);
1840
1841 {
1842 ResourceMark rm;
1843 PhaseRemoveUseless pru(gvn, for_igvn());
1844 }
1845
1846 igvn = PhaseIterGVN(gvn);
1847 igvn.optimize();
1848
1849 set_inlining_progress(false);
1850 set_inlining_incrementally(false);
1851 }
1852 }
1853
1810 void Compile::inline_incrementally_one(PhaseIterGVN& igvn) { 1854 void Compile::inline_incrementally_one(PhaseIterGVN& igvn) {
1811 assert(IncrementalInline, "incremental inlining should be on"); 1855 assert(IncrementalInline, "incremental inlining should be on");
1812 PhaseGVN* gvn = initial_gvn(); 1856 PhaseGVN* gvn = initial_gvn();
1813 1857
1814 set_inlining_progress(false); 1858 set_inlining_progress(false);
1829 } 1873 }
1830 _late_inlines.trunc_to(j); 1874 _late_inlines.trunc_to(j);
1831 1875
1832 { 1876 {
1833 ResourceMark rm; 1877 ResourceMark rm;
1834 PhaseRemoveUseless pru(C->initial_gvn(), C->for_igvn()); 1878 PhaseRemoveUseless pru(gvn, for_igvn());
1835 } 1879 }
1836 1880
1837 igvn = PhaseIterGVN(gvn); 1881 igvn = PhaseIterGVN(gvn);
1838 } 1882 }
1839 1883
1927 1971
1928 print_method("Iter GVN 1", 2); 1972 print_method("Iter GVN 1", 2);
1929 1973
1930 if (failing()) return; 1974 if (failing()) return;
1931 1975
1932 inline_incrementally(igvn); 1976 {
1977 NOT_PRODUCT( TracePhase t2("incrementalInline", &_t_incrInline, TimeCompiler); )
1978 inline_incrementally(igvn);
1979 }
1933 1980
1934 print_method("Incremental Inline", 2); 1981 print_method("Incremental Inline", 2);
1935 1982
1936 if (failing()) return; 1983 if (failing()) return;
1984
1985 if (eliminate_boxing()) {
1986 NOT_PRODUCT( TracePhase t2("incrementalInline", &_t_incrInline, TimeCompiler); )
1987 // Inline valueOf() methods now.
1988 inline_boxing_calls(igvn);
1989
1990 print_method("Incremental Boxing Inline", 2);
1991
1992 if (failing()) return;
1993 }
1937 1994
1938 // No more new expensive nodes will be added to the list from here 1995 // No more new expensive nodes will be added to the list from here
1939 // so keep only the actual candidates for optimizations. 1996 // so keep only the actual candidates for optimizations.
1940 cleanup_expensive_nodes(igvn); 1997 cleanup_expensive_nodes(igvn);
1941 1998
2894 in2->disconnect_inputs(NULL, this); 2951 in2->disconnect_inputs(NULL, this);
2895 } 2952 }
2896 } 2953 }
2897 break; 2954 break;
2898 case Op_MemBarStoreStore: 2955 case Op_MemBarStoreStore:
2956 case Op_MemBarRelease:
2899 // Break the link with AllocateNode: it is no longer useful and 2957 // Break the link with AllocateNode: it is no longer useful and
2900 // confuses register allocation. 2958 // confuses register allocation.
2901 if (n->req() > MemBarNode::Precedent) { 2959 if (n->req() > MemBarNode::Precedent) {
2902 n->set_req(MemBarNode::Precedent, top()); 2960 n->set_req(MemBarNode::Precedent, top());
2903 } 2961 }