aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2004-01-24 15:31:04 +0000
committerJan Hubicka <jh@suse.cz>2004-01-24 15:31:04 +0000
commit40ef438bba5767fc42bcdbaa52d0906fee00c283 (patch)
treef05a3f300306fc4f9d1ee7e63305439f7119b17f
parent16c205cff76b0c2abeba2f44f78d8ffbc3fac0cf (diff)
* emit-rtl.c (change_address, adjust_address_1, offset_address,
widen_memory_access): Return early when there is nothing to change. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@76512 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/emit-rtl.c17
2 files changed, 22 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 77bfc8784c8..54e0d4f1d84 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2004-01-24 Jan Hubicka <jh@suse.cz>
+
+ * emit-rtl.c (change_address, adjust_address_1, offset_address,
+ widen_memory_access): Return early when there is nothing to change.
+
2004-01-24 Jakub Jelinek <jakub@redhat.com>
* simplify-rtx.c (simplify_relational_operation): Don't
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index f576e76ca75..294577c2d5c 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -1872,6 +1872,10 @@ change_address (rtx memref, enum machine_mode mode, rtx addr)
rtx new = change_address_1 (memref, mode, addr, 1);
enum machine_mode mmode = GET_MODE (new);
+ /* If there are no changes, just return the original memory reference. */
+ if (new == memref)
+ return new;
+
MEM_ATTRS (new)
= get_mem_attrs (MEM_ALIAS_SET (memref), 0, 0,
mmode == BLKmode ? 0 : GEN_INT (GET_MODE_SIZE (mmode)),
@@ -1898,6 +1902,11 @@ adjust_address_1 (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset,
rtx size = 0;
unsigned int memalign = MEM_ALIGN (memref);
+ /* If there are no changes, just return the original memory reference. */
+ if (mode == GET_MODE (memref) && !offset
+ && (!validate || memory_address_p (mode, addr)))
+ return memref;
+
/* ??? Prefer to create garbage instead of creating shared rtl.
This may happen even if offset is nonzero -- consider
(plus (plus reg reg) const_int) -- so do this always. */
@@ -1988,6 +1997,10 @@ offset_address (rtx memref, rtx offset, unsigned HOST_WIDE_INT pow2)
update_temp_slot_address (XEXP (memref, 0), new);
new = change_address_1 (memref, VOIDmode, new, 1);
+ /* If there are no changes, just return the original memory reference. */
+ if (new == memref)
+ return new;
+
/* Update the alignment to reflect the offset. Reset the offset, which
we don't know. */
MEM_ATTRS (new)
@@ -2032,6 +2045,10 @@ widen_memory_access (rtx memref, enum machine_mode mode, HOST_WIDE_INT offset)
rtx memoffset = MEM_OFFSET (new);
unsigned int size = GET_MODE_SIZE (mode);
+ /* If there are no changes, just return the original memory reference. */
+ if (new == memref)
+ return new;
+
/* If we don't know what offset we were at within the expression, then
we can't know if we've overstepped the bounds. */
if (! memoffset)