function.c (expand_function_start): Don't abort on PARALLEL returns from hard_functio...
authorRichard Henderson <rth@redhat.com>
Fri, 25 May 2001 19:05:24 +0000 (12:05 -0700)
committerRichard Henderson <rth@gcc.gnu.org>
Fri, 25 May 2001 19:05:24 +0000 (12:05 -0700)
        * function.c (expand_function_start): Don't abort on PARALLEL
        returns from hard_function_value.

From-SVN: r42577

gcc/ChangeLog
gcc/function.c

index 091d66f5341f7c1afedcc049c1bbb7ab144f88cd..cdf1ca58bcaaabaec7a6e8a3815d19a9aff3d089 100644 (file)
@@ -1,3 +1,8 @@
+2001-05-25  Richard Henderson  <rth@redhat.com>
+
+       * function.c (expand_function_start): Don't abort on PARALLEL
+       returns from hard_function_value.
+
 2001-05-25  Richard Henderson  <rth@redhat.com>
 
        * config/i386/i386.md: Revert previous change.  Do not apply
index 6aeed3e9bbcfceda1bfbb30f1b7d8ce5234ad5d4..161173e8d698a2529df6ad1759bbf465168f4b2e 100644 (file)
@@ -6378,17 +6378,19 @@ expand_function_start (subr, parms_have_cleanups)
        = hard_function_value (TREE_TYPE (DECL_RESULT (subr)),
                               subr, 1);
 
-      /* Since we know the return value is not an aggregate, we should
-        have a REG here.  */
-      if (!REG_P (hard_reg))
-       abort ();
+      /* Structures that are returned in registers are not aggregate_value_p,
+        so we may see a PARALLEL.  Don't play pseudo games with this.  */
+      if (! REG_P (hard_reg))
+       SET_DECL_RTL (DECL_RESULT (subr), hard_reg);
+      else
+       {
+         /* Create the pseudo.  */
+         SET_DECL_RTL (DECL_RESULT (subr), gen_reg_rtx (GET_MODE (hard_reg)));
 
-      /* Create the pseudo.  */
-      SET_DECL_RTL (DECL_RESULT (subr), 
-                   gen_reg_rtx (GET_MODE (hard_reg)));
-      /* Needed because we may need to move this to memory
-        in case it's a named return value whose address is taken.  */
-      DECL_REGISTER (DECL_RESULT (subr)) = 1;
+         /* Needed because we may need to move this to memory
+            in case it's a named return value whose address is taken.  */
+         DECL_REGISTER (DECL_RESULT (subr)) = 1;
+       }
     }
 
   /* Initialize rtx for parameters and local variables.