Hi,
it's a couple of regressions in the C testsuite present on SPARC 64-bit and
coming from the new coalescing code which fails to handle vector types with
BLKmode that are returned in multiple registers. The code assigns a BLKmode
REG to the RESULT_DECL of the function in expand_function_start and this later
causes expand_function_end to choke.
As discussed with Alexandre in the audit trail, the attached minimal fix just
prevents the problematic BLKmode REG from being generated, which appears to be
sufficient to restore the nominal operating mode.
Tested on x86-64/Linux and SPARC64/Solaris, OK for the mainline?
2015-12-07 Eric Botcazou <ebotca...@adacore.com>
PR middle-end/68291
PR middle-end/68292
* cfgexpand.c (set_rtl): Always accept PARALLELs with BLKmode for
SSA names based on RESULT_DECLs.
* function.c (expand_function_start): Do not create BLKmode REGs
for GIMPLE registers when coalescing is enabled.
--
Eric Botcazou
Index: cfgexpand.c
===================================================================
--- cfgexpand.c (revision 231318)
+++ cfgexpand.c (working copy)
@@ -184,10 +184,15 @@ set_rtl (tree t, rtx x)
|| SUBREG_P (XEXP (x, 0)))
&& (REG_P (XEXP (x, 1))
|| SUBREG_P (XEXP (x, 1))))
+ /* We need to accept PARALLELs for RESUT_DECLs
+ because of vector types with BLKmode returned
+ in multiple registers, but they are supposed
+ to be uncoalesced. */
|| (GET_CODE (x) == PARALLEL
&& SSAVAR (t)
&& TREE_CODE (SSAVAR (t)) == RESULT_DECL
- && !flag_tree_coalesce_vars))
+ && (GET_MODE (x) == BLKmode
+ || !flag_tree_coalesce_vars)))
: (MEM_P (x) || x == pc_rtx
|| (GET_CODE (x) == CONCAT
&& MEM_P (XEXP (x, 0))
Index: function.c
===================================================================
--- function.c (revision 231318)
+++ function.c (working copy)
@@ -5148,15 +5148,16 @@ expand_function_start (tree subr)
/* Compute the return values into a pseudo reg, which we will copy
into the true return register after the cleanups are done. */
tree return_type = TREE_TYPE (res);
- /* If we may coalesce this result, make sure it has the expected
- mode. */
- if (flag_tree_coalesce_vars && is_gimple_reg (res))
- {
- tree def = ssa_default_def (cfun, res);
- gcc_assert (def);
- machine_mode mode = promote_ssa_mode (def, NULL);
- set_parm_rtl (res, gen_reg_rtx (mode));
- }
+
+ /* If we may coalesce this result, make sure it has the expected mode
+ in case it was promoted. But we need not bother about BLKmode. */
+ machine_mode promoted_mode
+ = flag_tree_coalesce_vars && is_gimple_reg (res)
+ ? promote_ssa_mode (ssa_default_def (cfun, res), NULL)
+ : BLKmode;
+
+ if (promoted_mode != BLKmode)
+ set_parm_rtl (res, gen_reg_rtx (promoted_mode));
else if (TYPE_MODE (return_type) != BLKmode
&& targetm.calls.return_in_msb (return_type))
/* expand_function_end will insert the appropriate padding in