From 7506f49132276e0bd064a169dca106b6436bde7c Mon Sep 17 00:00:00 2001 From: Doug Evans <devans@cygnus.com> Date: Wed, 20 May 1998 00:24:32 +0000 Subject: * Global CSE and constant/copy propagation. * Makefile.in (OBJS): Add gcse.o (STAGESTUFF): Add *.gcse. (gcse.o): Add dependencies. (mostlyclean): Remove *.gcse and */*.gcse. * gcse.c: New file. * loop.c (loop_optimize): Move call to init_alias_analysis. * recog.c (validate_replace_src): New function. * toplev.c (gcse_dump): New global variable. (flag_gcse, gcse_time): Likewise. (compile_file): Initialize gcse_time and clean out the gcse dump file if necessary. (rest_of_compilation): Call gcse_main as requested. Dump RTL after gcse if requested. (main): Enable gcse for -O2 and above. Handle -dG. Enable gcse dumps for -da. * gcc.texi: Add gcse related internal documentation. * invoke.texi: Note new command line options for gcse. * tm.texi: Document AVOID_CCMODE_COPIES. * mips.h (AVOID_CCMODE_COPIES): Define. Co-Authored-By: Jeffrey A Law <law@cygnus.com> From-SVN: r19901 --- gcc/toplev.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'gcc/toplev.c') diff --git a/gcc/toplev.c b/gcc/toplev.c index 2542d1a23f2..ecd11f9b66a 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -267,6 +267,7 @@ int rtl_dump_and_exit = 0; int jump_opt_dump = 0; int addressof_dump = 0; int cse_dump = 0; +int gcse_dump = 0; int loop_dump = 0; int cse2_dump = 0; int branch_prob_dump = 0; @@ -538,6 +539,10 @@ int flag_volatile_global; int flag_syntax_only = 0; +/* Nonzero means perform global cse. */ + +static int flag_gcse; + /* Nonzero means to rerun cse after loop optimization. This increases compilation time about 20% and picks up a few more common expressions. */ @@ -738,6 +743,7 @@ struct { char *string; int *variable; int on_value;} f_options[] = {"pcc-struct-return", &flag_pcc_struct_return, 1}, {"reg-struct-return", &flag_pcc_struct_return, 0}, {"delayed-branch", &flag_delayed_branch, 1}, + {"gcse", &flag_gcse, 1}, {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1}, {"rerun-loop-opt", &flag_rerun_loop_opt, 1}, {"pretend-float", &flag_pretend_float, 1}, @@ -977,6 +983,7 @@ int varconst_time; int integration_time; int jump_time; int cse_time; +int gcse_time; int loop_time; int cse2_time; int branch_prob_time; @@ -2274,6 +2281,7 @@ compile_file (name) integration_time = 0; jump_time = 0; cse_time = 0; + gcse_time = 0; loop_time = 0; cse2_time = 0; branch_prob_time = 0; @@ -2360,6 +2368,8 @@ compile_file (name) if (dbr_sched_dump) clean_dump_file (".dbr"); #endif + if (gcse_dump) + clean_dump_file (".gcse"); #ifdef STACK_REGS if (stack_reg_dump) clean_dump_file (".stack"); @@ -2840,6 +2850,7 @@ compile_file (name) print_time ("integration", integration_time); print_time ("jump", jump_time); print_time ("cse", cse_time); + print_time ("gcse", gcse_time); print_time ("loop", loop_time); print_time ("cse2", cse2_time); print_time ("branch-prob", branch_prob_time); @@ -3257,6 +3268,18 @@ rest_of_compilation (decl) if (addressof_dump) dump_rtl (".addressof", decl, print_rtl, insns); + /* Perform global cse. */ + + if (optimize > 0 && flag_gcse) + { + if (gcse_dump) + open_dump_file (".gcse", IDENTIFIER_POINTER (DECL_NAME (decl))); + + TIMEVAR (gcse_time, gcse_main (insns, rtl_dump_file)); + + if (gcse_dump) + close_dump_file (print_rtl, insns); + } /* Move constant computations out of loops. */ if (optimize > 0) @@ -3801,6 +3824,7 @@ main (argc, argv, envp) { flag_cse_follow_jumps = 1; flag_cse_skip_blocks = 1; + flag_gcse = 1; flag_expensive_optimizations = 1; flag_strength_reduce = 1; flag_rerun_cse_after_loop = 1; @@ -3879,6 +3903,7 @@ main (argc, argv, envp) regmove_dump = 1; rtl_dump = 1; cse_dump = 1, cse2_dump = 1; + gcse_dump = 1; sched_dump = 1; sched2_dump = 1; #ifdef STACK_REGS @@ -3911,6 +3936,9 @@ main (argc, argv, envp) case 'g': global_reg_dump = 1; break; + case 'G': + gcse_dump = 1; + break; case 'j': jump_opt_dump = 1; break; -- cgit v1.2.1