aboutsummaryrefslogtreecommitdiff
path: root/gcc/recog.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@gcc.gnu.org>2002-04-12 00:52:05 -0700
committerRichard Henderson <rth@gcc.gnu.org>2002-04-12 00:52:05 -0700
commit9be408334932dd7a55741e911e34e644fe3fefed (patch)
tree30d336ac36e5d65e0f68d3dc7b5ef3da92af21cd /gcc/recog.c
parentc58c6b73f4b6809371be28bd5c166ca3f67f132c (diff)
downloadgcc-9be408334932dd7a55741e911e34e644fe3fefed.zip
gcc-9be408334932dd7a55741e911e34e644fe3fefed.tar.gz
gcc-9be408334932dd7a55741e911e34e644fe3fefed.tar.bz2
re PR bootstrap/4191 (GCC does not build for d30v-elf - needs tweaking for crtstuff.c changes)
PR bootstrap/4191 * config/d30v/d30v.h (INIT_SECTION_ASM_OP): Don't undef. * flow.c (mark_used_reg): Manage reg_cond_dead properly for modes spanning multiple hard regs. * recog.c (peephole2_optimize): Rebuild jump labels as needed. From-SVN: r52205
Diffstat (limited to 'gcc/recog.c')
-rw-r--r--gcc/recog.c27
1 files changed, 20 insertions, 7 deletions
diff --git a/gcc/recog.c b/gcc/recog.c
index 3289f6e..7987d20 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -3003,6 +3003,7 @@ peephole2_optimize (dump_file)
bool changed;
#endif
bool do_cleanup_cfg = false;
+ bool do_rebuild_jump_labels = false;
/* Initialize the regsets we're going to use. */
for (i = 0; i < MAX_INSNS_PER_PEEP2 + 1; ++i)
@@ -3045,7 +3046,7 @@ peephole2_optimize (dump_file)
prev = PREV_INSN (insn);
if (INSN_P (insn))
{
- rtx try, before_try;
+ rtx try, before_try, x;
int match_len;
rtx note;
@@ -3139,7 +3140,6 @@ peephole2_optimize (dump_file)
/* Re-insert the EH_REGION notes. */
if (note)
{
- rtx x;
edge eh_edge;
for (eh_edge = bb->succ; eh_edge
@@ -3209,25 +3209,35 @@ peephole2_optimize (dump_file)
COPY_REG_SET (live, peep2_insn_data[i].live_before);
/* Update life information for the new sequence. */
+ x = try;
do
{
- if (INSN_P (try))
+ if (INSN_P (x))
{
if (--i < 0)
i = MAX_INSNS_PER_PEEP2;
- peep2_insn_data[i].insn = try;
- propagate_one_insn (pbi, try);
+ peep2_insn_data[i].insn = x;
+ propagate_one_insn (pbi, x);
COPY_REG_SET (peep2_insn_data[i].live_before, live);
}
- try = PREV_INSN (try);
+ x = PREV_INSN (x);
}
- while (try != prev);
+ while (x != prev);
/* ??? Should verify that LIVE now matches what we
had before the new sequence. */
peep2_current = i;
#endif
+
+ /* If we generated a jump instruction, it won't have
+ JUMP_LABEL set. Recompute after we're done. */
+ for (x = try; x != before_try; x = PREV_INSN (x))
+ if (GET_CODE (x) == JUMP_INSN)
+ {
+ do_rebuild_jump_labels = true;
+ break;
+ }
}
}
@@ -3242,6 +3252,9 @@ peephole2_optimize (dump_file)
FREE_REG_SET (peep2_insn_data[i].live_before);
FREE_REG_SET (live);
+ if (do_rebuild_jump_labels)
+ rebuild_jump_labels (get_insns ());
+
/* If we eliminated EH edges, we may be able to merge blocks. Further,
we've changed global life since exception handlers are no longer
reachable. */