From: Bernd Schmidt Date: Fri, 30 Mar 2001 17:18:14 +0000 (+0000) Subject: Prevent hoisting code from generating uninitialized accesses. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1757e77456ae740ccfeb2b446d8680ea1e3c4e68;p=gcc.git Prevent hoisting code from generating uninitialized accesses. From-SVN: r40971 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 533b520f763..7f0266b425f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-03-30 Bernd Schmidt + + * loop.c (load_mems): When generating a load from a pseudo, update + REGNO_LAST_UID. + Fri Mar 30 17:36:43 CEST 2001 Jan Hubicka * i386.c (ix86_split_long_move): Use change address to compensate diff --git a/gcc/loop.c b/gcc/loop.c index f2d44cba7cc..085b7c8b54a 100644 --- a/gcc/loop.c +++ b/gcc/loop.c @@ -8811,7 +8811,7 @@ load_mems (loop) struct loop_regs *regs = LOOP_REGS (loop); int maybe_never = 0; int i; - rtx p; + rtx p, prev_ebb_head; rtx label = NULL_RTX; rtx end_label; /* Nonzero if the next instruction may never be executed. */ @@ -8873,6 +8873,7 @@ load_mems (loop) PREV_INSN (p) && GET_CODE (p) != CODE_LABEL; p = PREV_INSN (p)) ; + prev_ebb_head = p; cselib_init (); @@ -8963,7 +8964,7 @@ load_mems (loop) loop_info->mems[i].reg = reg; /* Now, replace all references to the MEM with the - corresponding pesudos. */ + corresponding pseudos. */ maybe_never = 0; for (p = next_insn_in_loop (loop, loop->scan_start); p != NULL_RTX; @@ -9034,7 +9035,7 @@ load_mems (loop) if (CONSTANT_P (equiv->loc)) const_equiv = equiv; else if (GET_CODE (equiv->loc) == REG - /* Extending hard register lifetimes cuases crash + /* Extending hard register lifetimes causes crash on SRC targets. Doing so on non-SRC is probably also not good idea, since we most probably have pseudoregister equivalence as @@ -9060,8 +9061,19 @@ load_mems (loop) if (best_equiv) best = copy_rtx (best_equiv->loc); } + set = gen_move_insn (reg, best); set = loop_insn_hoist (loop, set); + if (REG_P (best)) + { + for (p = prev_ebb_head; p != loop->start; p = NEXT_INSN (p)) + if (REGNO_LAST_UID (REGNO (best)) == INSN_UID (p)) + { + REGNO_LAST_UID (REGNO (best)) = INSN_UID (set); + break; + } + } + if (const_equiv) REG_NOTES (set) = gen_rtx_EXPR_LIST (REG_EQUAL, copy_rtx (const_equiv->loc),