aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <aoliva@redhat.com>2012-06-28 07:39:25 +0000
committerAlexandre Oliva <aoliva@gcc.gnu.org>2012-06-28 07:39:25 +0000
commit6f9e260c80f8aa7d49a2c809e17d62686c5f13a6 (patch)
tree5cb806a55543696d39711d3f54d8308c3a5c7ce9 /gcc
parentb94a8a1239c4ec4ec50bbcd24fa85cae912b3a8e (diff)
downloadgcc-6f9e260c80f8aa7d49a2c809e17d62686c5f13a6.zip
gcc-6f9e260c80f8aa7d49a2c809e17d62686c5f13a6.tar.gz
gcc-6f9e260c80f8aa7d49a2c809e17d62686c5f13a6.tar.bz2
re PR debug/53740 (--enable-checking=yes,rtl bootstrap failure with ada)
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. From-SVN: r189036
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/dce.c14
-rw-r--r--gcc/df-problems.c12
3 files changed, 34 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 09c2d56..9b5a0f3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2012-06-28 Alexandre Oliva <aoliva@redhat.com>
+
+ 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 <rth@redhat.com>
* config/alpha/alpha.c (alpha_dimode_u): New.
diff --git a/gcc/dce.c b/gcc/dce.c
index 8954d5c..2e58e43 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 a020e28..7afbed9 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