aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@redhat.com>2001-09-07 23:25:01 +0000
committerJim Wilson <wilson@gcc.gnu.org>2001-09-07 16:25:01 -0700
commit43fe47ca785b524496e2082eddfd00b50b68b281 (patch)
tree944330803f51ba791ebf2256c7196203c46cdef1
parent177b41ebf31068a9423718b445d08181295d8c87 (diff)
downloadgcc-43fe47ca785b524496e2082eddfd00b50b68b281.zip
gcc-43fe47ca785b524496e2082eddfd00b50b68b281.tar.gz
gcc-43fe47ca785b524496e2082eddfd00b50b68b281.tar.bz2
re PR rtl-optimization/3783 (gcc3.0/ia64 ICE on linux kernel file fs/ufs/super.c)
Fix for PR 3783. * alias.c (clear_reg_alias_info): New. * flow.c (attempt_auto_inc): Call clear_reg_alias_info. * rtl.h (clear_reg_alias_info): Declare. From-SVN: r45482
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/alias.c14
-rw-r--r--gcc/flow.c3
-rw-r--r--gcc/rtl.h1
4 files changed, 24 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 559e8b4..c3dc8f4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2001-09-07 Jim Wilson <wilson@redhat.com>
+
+ * alias.c (clear_reg_alias_info): New.
+ * flow.c (attempt_auto_inc): Call clear_reg_alias_info.
+ * rtl.h (clear_reg_alias_info): Declare.
+
2001-09-07 Roman Lechtchinsky <rl@cs.tu-berlin.de>
* real.c (EMUSHORT,EMUSHORT_SIZE): Use HImode if no 16-bit type is
diff --git a/gcc/alias.c b/gcc/alias.c
index d8e9d42..8c6ad5f 100644
--- a/gcc/alias.c
+++ b/gcc/alias.c
@@ -960,6 +960,20 @@ record_base_value (regno, val, invariant)
reg_base_value[regno] = find_base_value (val);
}
+/* Clear alias info for a register. This is used if an RTL transformation
+ changes the value of a register. This is used in flow by AUTO_INC_DEC
+ optimizations. We don't need to clear reg_base_value, since flow only
+ changes the offset. */
+
+void
+clear_reg_alias_info (rtx reg)
+{
+ int regno = REGNO (reg);
+
+ if (regno < reg_known_value_size)
+ reg_known_value[regno] = reg;
+}
+
/* Returns a canonical version of X, from the point of view alias
analysis. (For example, if X is a MEM whose address is a register,
and the register has a known value (say a SYMBOL_REF), then a MEM
diff --git a/gcc/flow.c b/gcc/flow.c
index 8ca0877..1cbb0f8 100644
--- a/gcc/flow.c
+++ b/gcc/flow.c
@@ -7027,6 +7027,9 @@ attempt_auto_inc (pbi, inc, insn, mem, incr, incr_reg)
for (temp = insn; temp != incr; temp = NEXT_INSN (temp))
if (GET_CODE (temp) == CALL_INSN)
REG_N_CALLS_CROSSED (regno)++;
+
+ /* Invalidate alias info for Q since we just changed its value. */
+ clear_reg_alias_info (q);
}
else
return;
diff --git a/gcc/rtl.h b/gcc/rtl.h
index 75204b6..d993888 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1988,6 +1988,7 @@ extern void fancy_abort PARAMS ((const char *, int, const char *))
#define abort() fancy_abort (__FILE__, __LINE__, __FUNCTION__)
/* In alias.c */
+extern void clear_reg_alias_info PARAMS ((rtx));
extern rtx canon_rtx PARAMS ((rtx));
extern int true_dependence PARAMS ((rtx, enum machine_mode, rtx,
int (*)(rtx, int)));