+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
 
      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;
        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));
          }
             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,
        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)