diff options
Diffstat (limited to 'gcc/cse.c')
-rw-r--r-- | gcc/cse.c | 24 |
1 files changed, 21 insertions, 3 deletions
@@ -3199,9 +3199,27 @@ fold_rtx (rtx x, rtx insn) #ifdef HAVE_cc0 case CC0: - folded_arg = prev_insn_cc0; - mode_arg = prev_insn_cc0_mode; - const_arg = equiv_constant (folded_arg); + /* The cc0-user and cc0-setter may be in different blocks if + the cc0-setter potentially traps. In that case PREV_INSN_CC0 + will have been cleared as we exited the block with the + setter. + + While we could potentially track cc0 in this case, it just + doesn't seem to be worth it given that cc0 targets are not + terribly common or important these days and trapping math + is rarely used. The combination of those two conditions + necessary to trip this situation is exceedingly rare in the + real world. */ + if (!prev_insn_cc0) + { + const_arg = NULL_RTX; + } + else + { + folded_arg = prev_insn_cc0; + mode_arg = prev_insn_cc0_mode; + const_arg = equiv_constant (folded_arg); + } break; #endif |