aboutsummaryrefslogtreecommitdiff
path: root/gcc/ifcvt.c
diff options
context:
space:
mode:
authorUros Bizjak <uros@kss-loka.si>2004-09-17 07:32:36 +0200
committerUros Bizjak <uros@gcc.gnu.org>2004-09-17 07:32:36 +0200
commitb355f2229a07beb1b1b08d1c7e6b7dbac55c8df9 (patch)
tree2debc033aa43be108f0e9e92def155be98b05e6c /gcc/ifcvt.c
parent7a1162112b7fbbd0fd3c8dc5b59e065f170e0042 (diff)
downloadgcc-b355f2229a07beb1b1b08d1c7e6b7dbac55c8df9.zip
gcc-b355f2229a07beb1b1b08d1c7e6b7dbac55c8df9.tar.gz
gcc-b355f2229a07beb1b1b08d1c7e6b7dbac55c8df9.tar.bz2
re PR rtl-optimization/15187 (Inefficient if optimization with -O2 -ffast-math)
PR rtl-optimization/15187 * ifcvt.c (noce_try_cmove_arith): Exit early if total insn_rtx_cost of both branches > BRANCH_COST From-SVN: r87631
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r--gcc/ifcvt.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c
index 0767eb2..5963158 100644
--- a/gcc/ifcvt.c
+++ b/gcc/ifcvt.c
@@ -1214,6 +1214,7 @@ noce_try_cmove_arith (struct noce_if_info *if_info)
rtx insn_a, insn_b;
rtx tmp, target;
int is_mem = 0;
+ int insn_cost;
enum rtx_code code;
/* A conditional move from two memory sources is equivalent to a
@@ -1247,6 +1248,25 @@ noce_try_cmove_arith (struct noce_if_info *if_info)
insn_a = if_info->insn_a;
insn_b = if_info->insn_b;
+ /* Total insn_rtx_cost should be smaller than branch cost. Exit
+ if insn_rtx_cost can't be estimated. */
+ if (insn_a)
+ {
+ insn_cost = insn_rtx_cost (PATTERN (insn_a));
+ if (insn_cost == 0 || insn_cost > COSTS_N_INSNS (BRANCH_COST))
+ return FALSE;
+ }
+ else
+ {
+ insn_cost = 0;
+ }
+
+ if (insn_b) {
+ insn_cost += insn_rtx_cost (PATTERN (insn_b));
+ if (insn_cost == 0 || insn_cost > COSTS_N_INSNS (BRANCH_COST))
+ return FALSE;
+ }
+
/* Possibly rearrange operands to make things come out more natural. */
if (reversed_comparison_code (if_info->cond, if_info->jump) != UNKNOWN)
{