aboutsummaryrefslogtreecommitdiff
path: root/gcc/calls.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@redhat.com>2004-11-14 20:04:03 -0800
committerRichard Henderson <rth@gcc.gnu.org>2004-11-14 20:04:03 -0800
commit8df3dbb75b31332a750459ed78f79c06e63a509c (patch)
treed05dc008468c762c2853856bd22d3a9a9b7a7b40 /gcc/calls.c
parent18522563e0d346db259fc6404b54c95e4155ae48 (diff)
downloadgcc-8df3dbb75b31332a750459ed78f79c06e63a509c.zip
gcc-8df3dbb75b31332a750459ed78f79c06e63a509c.tar.gz
gcc-8df3dbb75b31332a750459ed78f79c06e63a509c.tar.bz2
re PR middle-end/18480 (ICE in emit_group_move with recent change)
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
Diffstat (limited to 'gcc/calls.c')
-rw-r--r--gcc/calls.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/calls.c b/gcc/calls.c
index e66181e..720ffb7d 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -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)