From 9f5e1a5ad455bf3fcd3fb7d79899f442515a3c78 Mon Sep 17 00:00:00 2001 From: wilson Date: Fri, 7 Sep 2001 23:25:01 +0000 Subject: [PATCH] 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45482 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/alias.c | 14 ++++++++++++++ gcc/flow.c | 3 +++ gcc/rtl.h | 1 + 4 files changed, 24 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 559e8b43c17..c3dc8f418d2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2001-09-07 Jim Wilson + + * 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 * real.c (EMUSHORT,EMUSHORT_SIZE): Use HImode if no 16-bit type is diff --git a/gcc/alias.c b/gcc/alias.c index d8e9d42e3b3..8c6ad5f0eb3 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 8ca087757dd..1cbb0f8f82a 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 75204b66de8..d99388866e0 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))); -- 2.11.0