diff options
author | Richard Henderson <rth@redhat.com> | 2004-11-14 20:04:03 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2004-11-14 20:04:03 -0800 |
commit | 8df3dbb75b31332a750459ed78f79c06e63a509c (patch) | |
tree | d05dc008468c762c2853856bd22d3a9a9b7a7b40 /gcc/calls.c | |
parent | 18522563e0d346db259fc6404b54c95e4155ae48 (diff) | |
download | gcc-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.c | 15 |
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) |