diff options
author | nemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-16 22:15:49 +0000 |
---|---|---|
committer | nemet <nemet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-09-16 22:15:49 +0000 |
commit | 5a14b2b41227896a74e12a22aede314eb56df44c (patch) | |
tree | 024503185c3eb32872ed5a1b409891d4ebb4300c /gcc/ifcvt.c | |
parent | 6e721d5016627d8f6523615eba0b4975ba29ee1b (diff) | |
download | gcc-5a14b2b41227896a74e12a22aede314eb56df44c.tar.gz |
PR rtl-optimization/37483
* ifcvt.c (noce_try_sign_mask): Use if_info->test_bb instead of
if_info->insn_b's bb as argument to optimize_bb_for_speed_p.
Rearrange code to better match the original comment. Check
t_unconditional first. Improve comment.
testsuite/
* gcc.c-torture/compile/pr37483.c: New test.
* gcc.c-torture/compile/pr37395.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140403 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r-- | gcc/ifcvt.c | 25 |
1 files changed, 14 insertions, 11 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 66a65a4a7ab..341174ab02f 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -1869,7 +1869,7 @@ noce_try_sign_mask (struct noce_if_info *if_info) rtx cond, t, m, c, seq; enum machine_mode mode; enum rtx_code code; - bool b_unconditional; + bool t_unconditional; cond = if_info->cond; code = GET_CODE (cond); @@ -1898,16 +1898,19 @@ noce_try_sign_mask (struct noce_if_info *if_info) if (GET_MODE (m) != mode) return FALSE; - /* This is only profitable if T is cheap, or T is unconditionally - executed/evaluated in the original insn sequence. The latter - happens if INSN_B was taken from TEST_BB, or if there was no - INSN_B which can happen for e.g. conditional stores to memory. */ - b_unconditional = (if_info->insn_b == NULL_RTX - || BLOCK_FOR_INSN (if_info->insn_b) == if_info->test_bb); - if (rtx_cost (t, SET, optimize_bb_for_speed_p (BLOCK_FOR_INSN (if_info->insn_b))) - >= COSTS_N_INSNS (2) - && (!b_unconditional - || t != if_info->b)) + /* This is only profitable if T is unconditionally executed/evaluated in the + original insn sequence or T is cheap. The former happens if B is the + non-zero (T) value and if INSN_B was taken from TEST_BB, or there was no + INSN_B which can happen for e.g. conditional stores to memory. For the + cost computation use the block TEST_BB where the evaluation will end up + after the transformation. */ + t_unconditional = + (t == if_info->b + && (if_info->insn_b == NULL_RTX + || BLOCK_FOR_INSN (if_info->insn_b) == if_info->test_bb)); + if (!(t_unconditional + || (rtx_cost (t, SET, optimize_bb_for_speed_p (if_info->test_bb)) + < COSTS_N_INSNS (2)))) return FALSE; start_sequence (); |