diff options
Diffstat (limited to 'gcc/ifcvt.c')
-rw-r--r-- | gcc/ifcvt.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/gcc/ifcvt.c b/gcc/ifcvt.c index 9e65a25..99228a8 100644 --- a/gcc/ifcvt.c +++ b/gcc/ifcvt.c @@ -1866,6 +1866,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; if (no_new_pseudos) return FALSE; @@ -1899,9 +1900,12 @@ noce_try_sign_mask (struct noce_if_info *if_info) /* 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. */ + 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) >= COSTS_N_INSNS (2) - && (BLOCK_FOR_INSN (if_info->insn_b) != if_info->test_bb + && (!b_unconditional || t != if_info->b)) return FALSE; |