summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2001-03-30 17:18:14 +0000
committerbernds <bernds@138bc75d-0d04-0410-961f-82ee72b054a4>2001-03-30 17:18:14 +0000
commitfb0ac82c995b3afecd3adbae0478c7eb95991ee9 (patch)
tree6bb77525430822e52dfab40313ae1008f0f67372
parent4ae1ee1ae61680a229a6f628e42e038d648d3b71 (diff)
downloadgcc-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/ChangeLog5
-rw-r--r--gcc/loop.c18
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),