From: Alexandre Oliva Date: Fri, 8 Oct 2010 04:41:14 +0000 (+0000) Subject: re PR debug/45656 (gfortran.dg/forall_4.f90 -O3, wrong code with -g) X-Git-Tag: releases/gcc-4.6.0~3759 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5f262d13207ecf0e799fd10c479d14a7808ce9ae;p=thirdparty%2Fgcc.git re PR debug/45656 (gfortran.dg/forall_4.f90 -O3, wrong code with -g) PR debug/45656 * cse.c (cse_extended_basic_block): Preserve cc0 info across debug isnsn. Skip them when searching for cc0 setter. (set_live_p): Skip debug insns when searching for cc0 user. From-SVN: r165150 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3525466c3d9b..7168df046ff3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2010-10-08 Alexandre Oliva + + PR debug/45656 + * cse.c (cse_extended_basic_block): Preserve cc0 info across + debug isnsn. Skip them when searching for cc0 setter. + (set_live_p): Skip debug insns when searching for cc0 user. + 2010-10-08 Alexandre Oliva PR debug/45673 diff --git a/gcc/cse.c b/gcc/cse.c index 6857d3fad1a2..6adb799d8747 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -6348,29 +6348,31 @@ cse_extended_basic_block (struct cse_basic_block_data *ebb_data) recorded_label_ref = true; #ifdef HAVE_cc0 - /* If the previous insn set CC0 and this insn no longer - references CC0, delete the previous insn. Here we use - fact that nothing expects CC0 to be valid over an insn, - which is true until the final pass. */ - { - rtx prev_insn, tem; - - prev_insn = PREV_INSN (insn); - if (prev_insn && NONJUMP_INSN_P (prev_insn) - && (tem = single_set (prev_insn)) != 0 - && SET_DEST (tem) == cc0_rtx - && ! reg_mentioned_p (cc0_rtx, PATTERN (insn))) - delete_insn (prev_insn); - } - - /* If this insn is not the last insn in the basic block, - it will be PREV_INSN(insn) in the next iteration. If - we recorded any CC0-related information for this insn, - remember it. */ - if (insn != BB_END (bb)) + if (NONDEBUG_INSN_P (insn)) { - prev_insn_cc0 = this_insn_cc0; - prev_insn_cc0_mode = this_insn_cc0_mode; + /* If the previous insn sets CC0 and this insn no + longer references CC0, delete the previous insn. + Here we use fact that nothing expects CC0 to be + valid over an insn, which is true until the final + pass. */ + rtx prev_insn, tem; + + prev_insn = prev_nonnote_nondebug_insn (insn); + if (prev_insn && NONJUMP_INSN_P (prev_insn) + && (tem = single_set (prev_insn)) != NULL_RTX + && SET_DEST (tem) == cc0_rtx + && ! reg_mentioned_p (cc0_rtx, PATTERN (insn))) + delete_insn (prev_insn); + + /* If this insn is not the last insn in the basic + block, it will be PREV_INSN(insn) in the next + iteration. If we recorded any CC0-related + information for this insn, remember it. */ + if (insn != BB_END (bb)) + { + prev_insn_cc0 = this_insn_cc0; + prev_insn_cc0_mode = this_insn_cc0_mode; + } } #endif } @@ -6713,7 +6715,7 @@ set_live_p (rtx set, rtx insn ATTRIBUTE_UNUSED, /* Only used with HAVE_cc0. */ #ifdef HAVE_cc0 else if (GET_CODE (SET_DEST (set)) == CC0 && !side_effects_p (SET_SRC (set)) - && ((tem = next_nonnote_insn (insn)) == 0 + && ((tem = next_nonnote_nondebug_insn (insn)) == NULL_RTX || !INSN_P (tem) || !reg_referenced_p (cc0_rtx, PATTERN (tem)))) return false;