diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c8d4d77d422..ac51b904e66 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +Mon Apr 29 13:36:41 CEST 2002 Jan Hubicka + + * toplev.c (flag_if_conversion, flag_if_conversion2): New static + variables. + (lang_independent_options): Add -fif-conversion, -fif-conversion2 + (rest_of_compilation): Do if conversion only when asked for. + (parse_options_and_default_flags): Set new variables to 1 for -O1 + * invoke.texi (-fif-conversion, -fif-conversion2): Document. + Mon Apr 29 13:02:50 CEST 2002 Jan Hubicka * i386.c (dbx64_register_map): Fix typo. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index be361e59801..6bfe7dfe6f6 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -267,6 +267,7 @@ in the following sections. -fexpensive-optimizations -ffast-math -ffloat-store @gol -fforce-addr -fforce-mem -ffunction-sections @gol -fgcse -fgcse-lm -fgcse-sm -floop-optimize -fcrossjumping @gol +-fif-conversion -fif-conversion2 @gol -finline-functions -finline-limit=@var{n} -fkeep-inline-functions @gol -fkeep-static-consts -fmerge-constants -fmerge-all-constants @gol -fmove-all-movables -fno-default-inline -fno-defer-pop @gol @@ -3522,6 +3523,18 @@ well. Perform cross-jumping transformation. This transformation unifies equivalent code and save code size. The resulting code may or may not perform better than without cross-jumping. +@item -fif-conversion +@opindex if-conversion +Attempt to transform conditional jumps into branch-less equivalents. This +include use of conditional moves, min, max, set flags and abs instructions, and +some tricks doable by standard arithmetics. The use of conditional execution +on chips where it is available is controlled by @code{if-conversion2}. + +@item -fif-conversion2 +@opindex if-conversion2 +Use conditional execution (where available) to transform conditional jumps into +branch-less equivalents. + @item -fdelete-null-pointer-checks @opindex fdelete-null-pointer-checks Use global dataflow analysis to identify and eliminate useless checks diff --git a/gcc/toplev.c b/gcc/toplev.c index 42c39c101f4..01e3276b3e2 100644 --- a/gcc/toplev.c +++ b/gcc/toplev.c @@ -600,6 +600,14 @@ static int flag_loop_optimize; static int flag_crossjumping; +/* Nonzero means perform if conversion. */ + +static int flag_if_conversion; + +/* Nonzero means perform if conversion after reload. */ + +static int flag_if_conversion2; + /* Nonzero means to use global dataflow analysis to eliminate useless null pointer tests. */ @@ -1016,6 +1024,10 @@ static const lang_independent_options f_options[] = N_("Perform the loop optimizations") }, {"crossjumping", &flag_crossjumping, 1, N_("Perform cross-jumping optimization") }, + {"if-conversion", &flag_if_conversion, 1, + N_("Perform conversion of conditional jumps to branchless equivalents") }, + {"if-conversion2", &flag_if_conversion2, 1, + N_("Perform conversion of conditional jumps to conditional execution") }, {"rerun-cse-after-loop", &flag_rerun_cse_after_loop, 1, N_("Run CSE pass after loop optimizations") }, {"rerun-loop-opt", &flag_rerun_loop_opt, 1, @@ -2635,7 +2647,7 @@ rest_of_compilation (decl) timevar_push (TV_JUMP); - if (optimize > 0) + if (flag_delete_null_pointer_checks || flag_if_conversion) { open_dump_file (DFI_null, decl); find_basic_blocks (insns, max_reg_num (), rtl_dump_file); @@ -2648,7 +2660,8 @@ rest_of_compilation (decl) delete_null_pointer_checks (insns); timevar_push (TV_IFCVT); - if_convert (0); + if (flag_if_conversion) + if_convert (0); timevar_pop (TV_IFCVT); cleanup_cfg (CLEANUP_EXPENSIVE | CLEANUP_PRE_LOOP); close_dump_file (DFI_null, print_rtl_with_bb, insns); @@ -2897,7 +2910,8 @@ rest_of_compilation (decl) timevar_push (TV_IFCVT); cleanup_cfg (CLEANUP_EXPENSIVE); - if_convert (0); + if (flag_if_conversion) + if_convert (0); timevar_pop(TV_IFCVT); timevar_pop (TV_JUMP); @@ -2996,7 +3010,7 @@ rest_of_compilation (decl) /* Rerun if-conversion, as combine may have simplified things enough to now meet sequence length restrictions. */ - if (optimize > 0) + if (flag_if_conversion) { timevar_push (TV_IFCVT); open_dump_file (DFI_ce, decl); @@ -3237,7 +3251,7 @@ rest_of_compilation (decl) timevar_pop (TV_RENAME_REGISTERS); } - if (optimize > 0) + if (flag_if_conversion2) { timevar_push (TV_IFCVT2); open_dump_file (DFI_ce2, decl); @@ -4593,6 +4607,8 @@ parse_options_and_default_flags (argc, argv) flag_cprop_registers = 1; flag_loop_optimize = 1; flag_crossjumping = 1; + flag_if_conversion = 1; + flag_if_conversion2 = 1; } if (optimize >= 2)