diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2015-12-07 16:45:45 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2015-12-07 16:45:45 +0000 |
commit | 058c6384fe443310b1788dcdc8880beba24d6b43 (patch) | |
tree | 2e641b887cd6d08eba392818062c5fa46e53f8ae /gcc/function.c | |
parent | 5dd2902aa1bf772c53951ae9998645d4b89d50ae (diff) | |
download | gcc-058c6384fe443310b1788dcdc8880beba24d6b43.zip gcc-058c6384fe443310b1788dcdc8880beba24d6b43.tar.gz gcc-058c6384fe443310b1788dcdc8880beba24d6b43.tar.bz2 |
re PR middle-end/68291 (ICE in emit_move_insn, at expr.c:3540)
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.
From-SVN: r231372
Diffstat (limited to 'gcc/function.c')
-rw-r--r-- | gcc/function.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/gcc/function.c b/gcc/function.c index e452865..b513ead 100644 --- a/gcc/function.c +++ b/gcc/function.c @@ -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 |