From bb07060a6aa5000a59e7d4f2a7d37b929980ec2d Mon Sep 17 00:00:00 2001 From: John Wehle Date: Wed, 13 Sep 2000 06:27:16 +0000 Subject: [PATCH] alias.c (find_base_term): Use frame_pointer_rtx when handling an ADDRESSOF. * alias.c (find_base_term): Use frame_pointer_rtx when handling an ADDRESSOF. * cse.c (canon_hash): Handle USE of BLKmode memory. (cse_insn): Outgoing arguments for a libcall don't affect any recorded expressions. From-SVN: r36384 --- gcc/ChangeLog | 9 +++++++++ gcc/alias.c | 2 +- gcc/cse.c | 42 ++++++++++++++++++++++++++++++++++++++---- 3 files changed, 48 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 55ee61332ba..15f235d404a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +Wed Sep 13 02:31:23 EDT 2000 John Wehle (john@feith.com) + + * alias.c (find_base_term): Use frame_pointer_rtx + when handling an ADDRESSOF. + + * cse.c (canon_hash): Handle USE of BLKmode memory. + (cse_insn): Outgoing arguments for a libcall don't + affect any recorded expressions. + 2000-09-12 Tom Tromey * configure, config.in: Rebuilt. diff --git a/gcc/alias.c b/gcc/alias.c index 61a1bd67354..32d63b269c5 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -1132,7 +1132,7 @@ find_base_term (x) return x; case ADDRESSOF: - return REG_BASE_VALUE (stack_pointer_rtx); + return REG_BASE_VALUE (frame_pointer_rtx); default: return 0; diff --git a/gcc/cse.c b/gcc/cse.c index 553ffaec371..2396889c7d0 100644 --- a/gcc/cse.c +++ b/gcc/cse.c @@ -2352,6 +2352,28 @@ canon_hash (x, mode) x = XEXP (x, 0); goto repeat; + case USE: + /* A USE that mentions non-volatile memory needs special + handling since the MEM may be BLKmode which normally + prevents an entry from being made. Pure calls are + marked by a USE which mentions BLKmode memory. */ + if (GET_CODE (XEXP (x, 0)) == MEM + && ! MEM_VOLATILE_P (XEXP (x, 0))) + { + hash += (unsigned)USE; + x = XEXP (x, 0); + + if (! RTX_UNCHANGING_P (x) || FIXED_BASE_PLUS_P (XEXP (x, 0))) + hash_arg_in_memory = 1; + + /* Now that we have already found this special case, + might as well speed it up as much as possible. */ + hash += (unsigned) MEM; + x = XEXP (x, 0); + goto repeat; + } + break; + case PRE_DEC: case PRE_INC: case POST_DEC: @@ -5760,9 +5782,15 @@ cse_insn (insn, libcall_insn) else if (do_not_record) { - if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG - || GET_CODE (dest) == MEM) + if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG) invalidate (dest, VOIDmode); + else if (GET_CODE (dest) == MEM) + { + /* Outgoing arguments for a libcall don't + affect any recorded expressions. */ + if (! libcall_insn || insn == libcall_insn) + invalidate (dest, VOIDmode); + } else if (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == ZERO_EXTRACT) invalidate (XEXP (dest, 0), GET_MODE (dest)); @@ -5919,9 +5947,15 @@ cse_insn (insn, libcall_insn) previous quantity's chain. Needed for memory if this is a nonvarying address, unless we have just done an invalidate_memory that covers even those. */ - if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG - || GET_CODE (dest) == MEM) + if (GET_CODE (dest) == REG || GET_CODE (dest) == SUBREG) invalidate (dest, VOIDmode); + else if (GET_CODE (dest) == MEM) + { + /* Outgoing arguments for a libcall don't + affect any recorded expressions. */ + if (! libcall_insn || insn == libcall_insn) + invalidate (dest, VOIDmode); + } else if (GET_CODE (dest) == STRICT_LOW_PART || GET_CODE (dest) == ZERO_EXTRACT) invalidate (XEXP (dest, 0), GET_MODE (dest));