diff options
author | bernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-03-30 17:18:14 +0000 |
---|---|---|
committer | bernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-03-30 17:18:14 +0000 |
commit | fb0ac82c995b3afecd3adbae0478c7eb95991ee9 (patch) | |
tree | 6bb77525430822e52dfab40313ae1008f0f67372 | |
parent | 4ae1ee1ae61680a229a6f628e42e038d648d3b71 (diff) | |
download | gcc-fb0ac82c995b3afecd3adbae0478c7eb95991ee9.tar.gz |
Prevent hoisting code from generating uninitialized accesses.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@40971 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/loop.c | 18 |
2 files changed, 20 insertions, 3 deletions
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 <bernds@redhat.com> + + * 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 <jh@suse.cz> * 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), |