diff options
author | Zhenqiang Chen <zhenqiang.chen@arm.com> | 2014-11-03 06:36:11 +0000 |
---|---|---|
committer | Zhenqiang Chen <zqchen@gcc.gnu.org> | 2014-11-03 06:36:11 +0000 |
commit | b5a4533b365b1405a3649f2f7c135ade80917e7b (patch) | |
tree | 5aeafda1b24a1ca5523464fa4aa4b3d90037403e /gcc/ifcvt.c | |
parent | ed60a04bbb4787ddc5efe5c2920d6c406fe566e1 (diff) | |
download | gcc-b5a4533b365b1405a3649f2f7c135ade80917e7b.tar.gz |
ifcvt.c (noce_try_store_flag_mask): Check rtx cost.
ChangeLog:
2014-11-03 Zhenqiang Chen <zhenqiang.chen@arm.com>
* ifcvt.c (noce_try_store_flag_mask): Check rtx cost.
testsuite/ChangeLog:
2014-11-03 Zhenqiang Chen <zhenqiang.chen@arm.com>
* gcc.target/arm/ifcvt-size-check.c: New test.
From-SVN: r217029
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r-- | gcc/ifcvt.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index f8ea467111b..c5a104e2b6d 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -1394,6 +1394,9 @@ noce_try_store_flag_mask (struct noce_if_info *if_info) if (target) { + int old_cost, new_cost, insn_cost; + int speed_p; + if (target != if_info->x) noce_emit_move_insn (if_info->x, target); @@ -1401,6 +1404,14 @@ noce_try_store_flag_mask (struct noce_if_info *if_info) if (!seq) return FALSE; + speed_p = optimize_bb_for_speed_p (BLOCK_FOR_INSN (if_info->insn_a)); + insn_cost = insn_rtx_cost (PATTERN (if_info->insn_a), speed_p); + old_cost = COSTS_N_INSNS (if_info->branch_cost) + insn_cost; + new_cost = seq_cost (seq, speed_p); + + if (new_cost > old_cost) + return FALSE; + emit_insn_before_setloc (seq, if_info->jump, INSN_LOCATION (if_info->insn_a)); return TRUE; |