diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2012-06-28 07:39:25 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2012-06-28 07:39:25 +0000 |
commit | 6f9e260c80f8aa7d49a2c809e17d62686c5f13a6 (patch) | |
tree | 5cb806a55543696d39711d3f54d8308c3a5c7ce9 /gcc/df-problems.c | |
parent | b94a8a1239c4ec4ec50bbcd24fa85cae912b3a8e (diff) | |
download | gcc-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/df-problems.c')
-rw-r--r-- | gcc/df-problems.c | 12 |
1 files changed, 12 insertions, 0 deletions
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 |