From 8df3dbb75b31332a750459ed78f79c06e63a509c Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sun, 14 Nov 2004 20:04:03 -0800 Subject: [PATCH] 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 --- gcc/ChangeLog | 8 ++++++++ gcc/calls.c | 15 +++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c26b57c832d6..7c2e32d50049 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2004-11-14 Richard Henderson + + 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 PR tree-optimization/18431 diff --git a/gcc/calls.c b/gcc/calls.c index e66181e9f9fc..720ffb7de76a 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) -- 2.43.5