Fix for irix6 -O0 bug, see testcase gcc.c-torture/compile/981007-1.c.
authorJim Wilson <wilson@cygnus.com>
Wed, 7 Oct 1998 12:12:21 +0000 (12:12 +0000)
committerJim Wilson <wilson@gcc.gnu.org>
Wed, 7 Oct 1998 12:12:21 +0000 (05:12 -0700)
* expr.c (emit_group_store): Handle a PARALLEL destination.

From-SVN: r22893

gcc/ChangeLog
gcc/expr.c

index e6ff59387965f5925e5e79c25a9f67c40b4604dd..0ded56ee2e957b574c831d6d28c865e417ca6d62 100644 (file)
@@ -1,3 +1,7 @@
+Wed Oct  7 12:10:46 1998  Jim Wilson  <wilson@cygnus.com>
+
+       * expr.c (emit_group_store): Handle a PARALLEL destination.
+
 Wed Oct  7 10:07:29 1998  Richard Henderson  <rth@cygnus.com>
 
        * gcse.c (pre_insert_insn): When a call ends a bb, insert
index adb2d4ad1f9314f8148f890c91f1d8f6153a61ab..d2dcdf8c592fee06e58aad44d8631cf0fef2917e 100644 (file)
@@ -2006,7 +2006,26 @@ emit_group_store (orig_dst, src, ssize, align)
   /* If we won't be storing directly into memory, protect the real destination
      from strange tricks we might play.  */
   dst = orig_dst;
-  if (GET_CODE (dst) != MEM)
+  if (GET_CODE (dst) == PARALLEL)
+    {
+      rtx temp;
+
+      /* We can get a PARALLEL dst if there is a conditional expression in
+        a return statement.  In that case, the dst and src are the same,
+        so no action is necessary.  */
+      if (rtx_equal_p (dst, src))
+       return;
+
+      /* It is unclear if we can ever reach here, but we may as well handle
+        it.  Allocate a temporary, and split this into a store/load to/from
+        the temporary.  */
+
+      temp = assign_stack_temp (GET_MODE (dst), ssize, 0);
+      emit_group_store (temp, src, ssize, align);
+      emit_group_load (dst, temp, ssize, align);
+      return;
+    }
+  else if (GET_CODE (dst) != MEM)
     {
       dst = gen_reg_rtx (GET_MODE (orig_dst));
       /* Make life a bit easier for combine.  */