aboutsummaryrefslogtreecommitdiff
path: root/gcc/cse.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1998-06-30 22:10:51 -0700
committerRichard Henderson <rth@gcc.gnu.org>1998-06-30 22:10:51 -0700
commitaac5cc1620c19d41b26c09982ed666e0dae3d453 (patch)
tree828f62b36645dd969e85f79cb627a5fabb232ee1 /gcc/cse.c
parent1eac9f59f2a15474966ffa2fe591119cc5a4360b (diff)
downloadgcc-aac5cc1620c19d41b26c09982ed666e0dae3d453.zip
gcc-aac5cc1620c19d41b26c09982ed666e0dae3d453.tar.gz
gcc-aac5cc1620c19d41b26c09982ed666e0dae3d453.tar.bz2
expr.c (emit_group_load, [...]): Rewrite considering the size and alignment of the structure being manipulated.
* expr.c (emit_group_load, emit_group_store): Rewrite considering the size and alignment of the structure being manipulated. * expr.c, calls.c, function.c: Update all callers. * expr.h: Update prototypes. * cse.c (invalidate): Cope with parallels. From-SVN: r20867
Diffstat (limited to 'gcc/cse.c')
-rw-r--r--gcc/cse.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/gcc/cse.c b/gcc/cse.c
index bd2aa56..3705511 100644
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -1609,6 +1609,24 @@ invalidate (x, full_mode)
return;
}
+ /* If X is a parallel, invalidate all of its elements. */
+
+ if (GET_CODE (x) == PARALLEL)
+ {
+ for (i = XVECLEN (x, 0) - 1; i >= 0 ; --i)
+ invalidate (XVECEXP (x, 0, i), VOIDmode);
+ return;
+ }
+
+ /* If X is an expr_list, this is part of a disjoint return value;
+ extract the location in question ignoring the offset. */
+
+ if (GET_CODE (x) == EXPR_LIST)
+ {
+ invalidate (XEXP (x, 0), VOIDmode);
+ return;
+ }
+
/* X is not a register; it must be a memory reference with
a nonvarying address. Remove all hash table elements
that refer to overlapping pieces of memory. */