re PR middle-end/18480 (ICE in emit_group_move with recent change)
authorRichard Henderson <rth@redhat.com>
Mon, 15 Nov 2004 04:04:03 +0000 (20:04 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 15 Nov 2004 04:04:03 +0000 (20:04 -0800)
        PR 18480
        * calls.c (struct arg_data): Add parallel_value.
        (precompute_register_parameters): Set it.
        (load_register_parameters): Use it.
        (store_one_arg): Also set it here.

From-SVN: r90649

gcc/ChangeLog
gcc/calls.c

index c26b57c832d615e0f531f10fe2561bc883cc87e9..7c2e32d500496bd94c31d586727006b33ef325cb 100644 (file)
@@ -1,3 +1,11 @@
+2004-11-14  Richard Henderson  <rth@redhat.com>
+
+       PR 18480
+       * calls.c (struct arg_data): Add parallel_value.
+       (precompute_register_parameters): Set it.
+       (load_register_parameters): Use it.
+       (store_one_arg): Also set it here.
+
 2004-11-14  Zdenek Dvorak  <dvorakz@suse.cz>
 
        PR tree-optimization/18431
index e66181e9f9fc8ba6fc4f339f9290d4463b092e3a..720ffb7de76ac08cc36a8058afed15213215cecf 100644 (file)
@@ -64,6 +64,9 @@ struct arg_data
      This is not the same register as for normal calls on machines with
      register windows.  */
   rtx tail_call_reg;
+  /* If REG is a PARALLEL, this is a copy of VALUE pulled into the correct
+     form for emit_group_move.  */
+  rtx parallel_value;
   /* If REG was promoted from the actual mode of the argument expression,
      indicates whether the promotion is sign- or zero-extended.  */
   int unsignedp;
@@ -686,7 +689,7 @@ precompute_register_parameters (int num_actuals, struct arg_data *args,
        if (GET_CODE (args[i].reg) == PARALLEL)
          {
            tree type = TREE_TYPE (args[i].tree_value);
-           args[i].value
+           args[i].parallel_value
              = emit_group_load_into_temps (args[i].reg, args[i].value,
                                            type, int_size_in_bytes (type));
          }
@@ -1466,7 +1469,7 @@ load_register_parameters (struct arg_data *args, int num_actuals,
             locations.  The Irix 6 ABI has examples of this.  */
 
          if (GET_CODE (reg) == PARALLEL)
-           emit_group_move (reg, args[i].value);
+           emit_group_move (reg, args[i].parallel_value);
 
          /* If simple case, just do move.  If normal partial, store_one_arg
             has already loaded the register for us.  In all other cases,
@@ -4187,6 +4190,14 @@ store_one_arg (struct arg_data *arg, rtx argblock, int flags,
        arg->value = arg->stack_slot;
     }
 
+  if (arg->reg && GET_CODE (arg->reg) == PARALLEL)
+    {
+      tree type = TREE_TYPE (arg->tree_value);
+      arg->parallel_value
+       = emit_group_load_into_temps (arg->reg, arg->value, type,
+                                     int_size_in_bytes (type));
+    }
+
   /* Mark all slots this store used.  */
   if (ACCUMULATE_OUTGOING_ARGS && !(flags & ECF_SIBCALL)
       && argblock && ! variable_size && arg->stack)