aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Wehle <john@feith.com>2000-09-13 06:27:16 +0000
committerJohn Wehle <wehle@gcc.gnu.org>2000-09-13 06:27:16 +0000
commitbb07060a6aa5000a59e7d4f2a7d37b929980ec2d (patch)
tree6d053274503c8c34e42c3c2a121565419548e2ae
parentd21445e714fbef35a64b1ae05f8625c395e73890 (diff)
downloadgcc-bb07060a6aa5000a59e7d4f2a7d37b929980ec2d.zip
gcc-bb07060a6aa5000a59e7d4f2a7d37b929980ec2d.tar.gz
gcc-bb07060a6aa5000a59e7d4f2a7d37b929980ec2d.tar.bz2
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
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/alias.c2
-rw-r--r--gcc/cse.c42
3 files changed, 48 insertions, 5 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 55ee613..15f235d 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 <tromey@cygnus.com>
* configure, config.in: Rebuilt.
diff --git a/gcc/alias.c b/gcc/alias.c
index 61a1bd6..32d63b2 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 553ffae..2396889 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));