https://gcc.gnu.org/bugzilla/show_bug.cgi?id=27800

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |rguenth at gcc dot 
gnu.org

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
Note this is done on purpose, possibly to better handle functions with multiple
returns.

A fix is probably in gimplification of the MODIFY_EXPR

  D.2774 = a != 0 ? b : c

where gimplify_cond_expr isn't told it can re-use the LHS as temporary.
That means special-casing this COND_EXPR RHS in gimplify_modify_expr_rhs
which already handles the non-register type case.  It could be extended
to cover all cases which then generates the smaller

int iii (int a, int b, int c)
{
  int D.2774;

  if (a != 0) goto <D.2775>; else goto <D.2776>;
  <D.2775>:
  D.2774 = b;
  goto <D.2777>;
  <D.2776>:
  D.2774 = c;
  <D.2777>:
  return D.2774;
}

diff --git a/gcc/gimplify.cc b/gcc/gimplify.cc
index 76221f7637d..b48c43f1471 100644
--- a/gcc/gimplify.cc
+++ b/gcc/gimplify.cc
@@ -5985,7 +5985,7 @@ gimplify_modify_expr_rhs (tree *expr_p, tree *from_p,
tree *to_p,
             down into the branches.  This is mandatory for ADDRESSABLE types,
             since we cannot generate temporaries for such, but it saves a
             copy in other cases as well.  */
-         if (!is_gimple_reg_type (TREE_TYPE (*from_p)))
+         if (1)
            {
              /* This code should mirror the code in gimplify_cond_expr. */
              enum tree_code code = TREE_CODE (*expr_p);

or to cases where is_gimple_reg (*to_p).

Reply via email to