PR middle-end/48660: Assigning to BLKmode RESULT_DECL
Michael Matz
matz@suse.de
Thu Sep 8 15:42:00 GMT 2011
Hi,
On Thu, 8 Sep 2011, Richard Sandiford wrote:
> if (TREE_CODE (from) == CALL_EXPR && ! aggregate_value_p (from, from)
> && COMPLETE_TYPE_P (TREE_TYPE (from))
> && TREE_CODE (TYPE_SIZE (TREE_TYPE (from))) == INTEGER_CST
> && ! (((TREE_CODE (to) == VAR_DECL || TREE_CODE (to) == PARM_DECL)
> && REG_P (DECL_RTL (to)))
> || TREE_CODE (to) == SSA_NAME))
> {
> rtx value;
>
> push_temp_slots ();
> value = expand_normal (from);
> if (to_rtx == 0)
> to_rtx = expand_expr (to, NULL_RTX, VOIDmode, EXPAND_WRITE);
>
> block of expand_assignment, but I think the REG_P exclusion that applies
> to VAR_DECLs and PARM_DECLs also applies to RESULT_DECLs.
Right, when I saw your conversation on IRC that was also my first
reaction. My second was similar to this hunk ...
> @@ -8950,10 +9061,15 @@ expand_expr_real_1 (tree exp, rtx target
> return temp;
> }
>
> - /* If the mode of DECL_RTL does not match that of the decl, it
> - must be a promoted value. We return a SUBREG of the wanted mode,
> - but mark it so that we know that it was already extended. */
> - if (REG_P (decl_rtl) && GET_MODE (decl_rtl) != DECL_MODE (exp))
> + /* If the mode of DECL_RTL does not match that of the decl,
> + there are two cases: we are dealing with a BLKmode value
> + that is returned in a register, or we are dealing with
> + a promoted value. In the latter case, return a SUBREG
> + of the wanted mode, but mark it so that we know that it
> + was already extended. */
> + if (REG_P (decl_rtl)
> + && !(code == RESULT_DECL && DECL_MODE (exp) == BLKmode)
> + && GET_MODE (decl_rtl) != DECL_MODE (exp))
... though I don't see the need for a RESULT_DECL check. If GET_MODE(exp)
is BLKmode, then the code inside the if never will do anything sane
(promote_function_mode and promote_decl_mode will return BLKmode). And
you miss a ChangeLog entry for this hunk.
After these two changes I would have had to split out the expand_return
code to make progress, and stopped poking at it :) So, I think your
approach makes sense.
Ciao,
Michael.
More information about the Gcc-patches
mailing list