From 704e91bd4accea20d39aeb887d46e8800fecaef0 Mon Sep 17 00:00:00 2001 From: aoliva Date: Thu, 28 Jun 2012 07:39:25 +0000 Subject: [PATCH] PR debug/53740 PR debug/52983 PR debug/48866 * dce.c (word_dce_process_block): Check whether inserting debug temps are needed even for needed insns. (dce_process_block): Likewise. * df-problems.c (dead_debug_add): Add comment about multi-regs. (dead_debug_insert_temp): Likewise. Don't subreg when we're setting fewer regs than a multi-reg requires. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@189036 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 12 ++++++++++++ gcc/dce.c | 14 ++++++++++---- gcc/df-problems.c | 12 ++++++++++++ 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 09c2d568b51..9b5a0f317d2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2012-06-28 Alexandre Oliva + + PR debug/53740 + PR debug/52983 + PR debug/48866 + * dce.c (word_dce_process_block): Check whether inserting debug + temps are needed even for needed insns. + (dce_process_block): Likewise. + * df-problems.c (dead_debug_add): Add comment about multi-regs. + (dead_debug_insert_temp): Likewise. Don't subreg when we're + setting fewer regs than a multi-reg requires. + 2012-06-27 Richard Henderson * config/alpha/alpha.c (alpha_dimode_u): New. diff --git a/gcc/dce.c b/gcc/dce.c index 8954d5c0c01..2e58e434356 100644 --- a/gcc/dce.c +++ b/gcc/dce.c @@ -864,9 +864,12 @@ word_dce_process_block (basic_block bb, bool redo_out) anything in local_live. */ if (marked_insn_p (insn)) df_word_lr_simulate_uses (insn, local_live); + /* Insert debug temps for dead REGs used in subsequent debug - insns. */ - else if (debug.used && !bitmap_empty_p (debug.used)) + insns. We may have to emit a debug temp even if the insn + was marked, in case the debug use was after the point of + death. */ + if (debug.used && !bitmap_empty_p (debug.used)) { df_ref *def_rec; @@ -963,9 +966,12 @@ dce_process_block (basic_block bb, bool redo_out, bitmap au) anything in local_live. */ if (needed) df_simulate_uses (insn, local_live); + /* Insert debug temps for dead REGs used in subsequent debug - insns. */ - else if (debug.used && !bitmap_empty_p (debug.used)) + insns. We may have to emit a debug temp even if the insn + was marked, in case the debug use was after the point of + death. */ + if (debug.used && !bitmap_empty_p (debug.used)) for (def_rec = DF_INSN_DEFS (insn); *def_rec; def_rec++) dead_debug_insert_temp (&debug, DF_REF_REGNO (*def_rec), insn, DEBUG_TEMP_BEFORE_WITH_VALUE); diff --git a/gcc/df-problems.c b/gcc/df-problems.c index a020e28ad27..7afbed98283 100644 --- a/gcc/df-problems.c +++ b/gcc/df-problems.c @@ -3179,6 +3179,9 @@ dead_debug_add (struct dead_debug *debug, df_ref use, unsigned int uregno) if (!debug->used) debug->used = BITMAP_ALLOC (NULL); + /* ??? If we dealt with split multi-registers below, we should set + all registers for the used mode in case of hardware + registers. */ bitmap_set_bit (debug->used, uregno); } @@ -3269,6 +3272,15 @@ dead_debug_insert_temp (struct dead_debug *debug, unsigned int uregno, /* Hmm... Something's fishy, we should be setting REG here. */ if (REGNO (dest) != REGNO (reg)) breg = NULL; + /* If we're not overwriting all the hardware registers that + setting REG in its mode would, we won't know what to bind + the debug temp to. ??? We could bind the debug_expr to a + CONCAT or PARALLEL with the split multi-registers, and + replace them as we found the corresponding sets. */ + else if (REGNO (reg) < FIRST_PSEUDO_REGISTER + && (hard_regno_nregs[REGNO (reg)][GET_MODE (reg)] + != hard_regno_nregs[REGNO (reg)][GET_MODE (dest)])) + breg = NULL; /* Ok, it's the same (hardware) REG, but with a different mode, so SUBREG it. */ else -- 2.11.4.GIT