From: Jim Wilson Date: Thu, 29 Oct 1998 19:06:48 +0000 (+0000) Subject: Fix sched REG_DEAD note handling bug found by post-reload-flow pass. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=faff4ab8c58604e4d521dabf3ae33a4ab0481d7e;p=gcc.git Fix sched REG_DEAD note handling bug found by post-reload-flow pass. * sched.c (update_flow_info): Add code to ! found_orig_dest case to handle deleted no-op moves of hard registers. * haifa-sched.c (update_flow_info): Likewise. From-SVN: r23431 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b67825de419..22c38bc8c11 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +Thu Oct 29 19:05:17 1998 Jim Wilson + + * sched.c (update_flow_info): Add code to ! found_orig_dest case to + handle deleted no-op moves of hard registers. + * haifa-sched.c (update_flow_info): Likewise. + Thu Oct 29 18:07:47 1998 Jeffrey A Law (law@cygnus.com) * mips.md (reload_{in,out}{si,di}): Emit a USE of HILO at the end diff --git a/gcc/haifa-sched.c b/gcc/haifa-sched.c index 806bb396d88..ea043907262 100644 --- a/gcc/haifa-sched.c +++ b/gcc/haifa-sched.c @@ -8340,8 +8340,28 @@ update_flow_info (notes, first, last, orig_insn) } else if (!found_orig_dest) { - /* This should never happen. */ - abort (); + int i, regno; + + /* Should never reach here for a pseudo reg. */ + if (REGNO (orig_dest) >= FIRST_PSEUDO_REGISTER) + abort (); + + /* This can happen for a hard register, if the splitter + does not bother to emit instructions which would be no-ops. + We try to verify that this is the case by checking to see if + the original instruction uses all of the registers that it + set. This case is OK, because deleting a no-op can not affect + REG_DEAD notes on other insns. If this is not the case, then + abort. */ + + regno = REGNO (orig_dest); + for (i = HARD_REGNO_NREGS (regno, GET_MODE (orig_dest)) - 1; + i >= 0; i--) + if (! refers_to_regno_p (regno + i, regno + i + 1, orig_insn, + NULL_PTR)) + break; + if (i >= 0) + abort (); } } diff --git a/gcc/sched.c b/gcc/sched.c index 1d81407c3f4..e27f70e28ea 100644 --- a/gcc/sched.c +++ b/gcc/sched.c @@ -4174,8 +4174,28 @@ update_flow_info (notes, first, last, orig_insn) } else if (! found_orig_dest) { - /* This should never happen. */ - abort (); + int i, regno; + + /* Should never reach here for a pseudo reg. */ + if (REGNO (orig_dest) >= FIRST_PSEUDO_REGISTER) + abort (); + + /* This can happen for a hard register, if the splitter + does not bother to emit instructions which would be no-ops. + We try to verify that this is the case by checking to see if + the original instruction uses all of the registers that it + set. This case is OK, because deleting a no-op can not affect + REG_DEAD notes on other insns. If this is not the case, then + abort. */ + + regno = REGNO (orig_dest); + for (i = HARD_REGNO_NREGS (regno, GET_MODE (orig_dest)) - 1; + i >= 0; i--) + if (! refers_to_regno_p (regno + i, regno + i + 1, orig_insn, + NULL_PTR)) + break; + if (i >= 0) + abort (); } }