diff options
author | Uros Bizjak <uros@kss-loka.si> | 2004-09-17 07:32:36 +0200 |
---|---|---|
committer | Uros Bizjak <uros@gcc.gnu.org> | 2004-09-17 07:32:36 +0200 |
commit | b355f2229a07beb1b1b08d1c7e6b7dbac55c8df9 (patch) | |
tree | 2debc033aa43be108f0e9e92def155be98b05e6c /gcc/ifcvt.c | |
parent | 7a1162112b7fbbd0fd3c8dc5b59e065f170e0042 (diff) | |
download | gcc-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.c | 20 |
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) { |