Mercurial > hg > CbC > CbC_gcc
diff gcc/ifcvt.c @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 84e7813d76e9 |
children |
line wrap: on
line diff
--- a/gcc/ifcvt.c Thu Oct 25 07:37:49 2018 +0900 +++ b/gcc/ifcvt.c Thu Feb 13 11:34:05 2020 +0900 @@ -1,5 +1,5 @@ /* If-conversion support. - Copyright (C) 2000-2018 Free Software Foundation, Inc. + Copyright (C) 2000-2020 Free Software Foundation, Inc. This file is part of GCC. @@ -45,7 +45,6 @@ #include "shrink-wrap.h" #include "rtl-iter.h" #include "ifcvt.h" -#include "params.h" #ifndef MAX_CONDITIONAL_EXECUTE #define MAX_CONDITIONAL_EXECUTE \ @@ -503,7 +502,7 @@ return FALSE; /* If the conditional jump is more than just a conditional jump, - then we can not do conditional execution conversion on this block. */ + then we cannot do conditional execution conversion on this block. */ if (! onlyjump_p (BB_END (test_bb))) return FALSE; @@ -652,7 +651,7 @@ goto fail; /* If the conditional jump is more than just a conditional jump, then - we can not do conditional execution conversion on this block. */ + we cannot do conditional execution conversion on this block. */ if (! onlyjump_p (BB_END (bb))) goto fail; @@ -3311,7 +3310,7 @@ { rtx_insn *insn; unsigned count = 0; - unsigned param = PARAM_VALUE (PARAM_MAX_RTL_IF_CONVERSION_INSNS); + unsigned param = param_max_rtl_if_conversion_insns; FOR_BB_INSNS (test_bb, insn) { @@ -3358,6 +3357,16 @@ return count > 1 && count <= param; } +/* Compute average of two given costs weighted by relative probabilities + of respective basic blocks in an IF-THEN-ELSE. E is the IF-THEN edge. + With P as the probability to take the IF-THEN branch, return + P * THEN_COST + (1 - P) * ELSE_COST. */ +static unsigned +average_cost (unsigned then_cost, unsigned else_cost, edge e) +{ + return else_cost + e->probability.apply ((signed) (then_cost - else_cost)); +} + /* Given a simple IF-THEN-JOIN or IF-THEN-ELSE-JOIN block, attempt to convert it without using conditional execution. Return TRUE if we were successful at converting the block. */ @@ -3413,10 +3422,9 @@ &if_info->else_simple)) return false; - if (else_bb == NULL) - if_info->original_cost += then_cost; - else if (speed_p) - if_info->original_cost += MIN (then_cost, else_cost); + if (speed_p) + if_info->original_cost += average_cost (then_cost, else_cost, + find_edge (test_bb, then_bb)); else if_info->original_cost += then_cost + else_cost; @@ -3829,7 +3837,7 @@ vec<rtx> else_regs = vNULL; unsigned int i; int success_p = FALSE; - int limit = PARAM_VALUE (PARAM_MAX_RTL_IF_CONVERSION_INSNS); + int limit = param_max_rtl_if_conversion_insns; /* Build a mapping for each block to the value used for each register. */ @@ -4022,7 +4030,7 @@ } /* If the conditional jump is more than just a conditional - jump, then we can not do if-conversion on this block. */ + jump, then we cannot do if-conversion on this block. */ jump = BB_END (test_bb); if (! onlyjump_p (jump)) return FALSE; @@ -4642,7 +4650,7 @@ return FALSE; /* If the conditional jump is more than just a conditional jump, then - we can not do if-conversion on this block. Give up for returnjump_p, + we cannot do if-conversion on this block. Give up for returnjump_p, changing a conditional return followed by unconditional trap for conditional trap followed by unconditional return is likely not beneficial and harder to handle. */ @@ -5457,6 +5465,8 @@ static unsigned int rest_of_handle_if_conversion (void) { + int flags = 0; + if (flag_if_conversion) { if (dump_file) @@ -5466,9 +5476,12 @@ } cleanup_cfg (CLEANUP_EXPENSIVE); if_convert (false); + if (num_updated_if_blocks) + /* Get rid of any dead CC-related instructions. */ + flags |= CLEANUP_FORCE_FAST_DCE; } - cleanup_cfg (0); + cleanup_cfg (flags); return 0; }