+Mon Apr 29 13:36:41 CEST 2002 Jan Hubicka <jh@suse.cz>
+
+ * 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 <jh@suse.cz>
* i386.c (dbx64_register_map): Fix typo.
-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
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
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. */
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,
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);
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);
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);
/* 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);
timevar_pop (TV_RENAME_REGISTERS);
}
- if (optimize > 0)
+ if (flag_if_conversion2)
{
timevar_push (TV_IFCVT2);
open_dump_file (DFI_ce2, decl);
flag_cprop_registers = 1;
flag_loop_optimize = 1;
flag_crossjumping = 1;
+ flag_if_conversion = 1;
+ flag_if_conversion2 = 1;
}
if (optimize >= 2)