This removes an odd restriction in lookup_tmp_vars helper
create_tmp_from_val.  That conditionalizes whether vector and complex
variables get to have a register based on whether the tmp var
is a formal one or not.  But that can't matter for correctness,
either all temporaries can get a register or none.

The only case is prepare_gimple_addressable which is used to
avoid marking a register as addressable by creating a new
temporary (otherwise previous other gimplifications could need
revisiting).  But here we can safely un-set DECL_GIMPLE_REG_P
before the new temporary gets further uses.

This improves initial code-gen for gcc.dg/tree-ssa/forwprop-19.c
for example when gimplfying

    vec z =  VEC_PERM_EXPR < SAVE_EXPR <y> , SAVE_EXPR <y> , m > ;

creating

  y.0 = y;
  z = VEC_PERM_EXPR <y.0, y.0, m>;

instead of two extra loads from y.0 for the uses in the VEC_PERM_EXPR.

Thus the following, bootstrapped on x86_64-unknown-linux-gnu,
testing in progress.

Richard.

2014-06-04  Richard Biener  <rguent...@suse.de>

        * gimplify.c (create_tmp_from_val): Remove is_formal parameter
        and set DECL_GIMPLE_REG_P unconditionally if appropriate.
        (lookup_tmp_var): Adjust.
        (prepare_gimple_addressable): Unset DECL_GIMPLE_REG_P here.

Index: gcc/gimplify.c
===================================================================
--- gcc/gimplify.c      (revision 211227)
+++ gcc/gimplify.c      (working copy)
@@ -451,14 +451,13 @@ is_gimple_mem_rhs_or_call (tree t)
    lookup_tmp_var; nobody else should call this function.  */
 
 static inline tree
-create_tmp_from_val (tree val, bool is_formal)
+create_tmp_from_val (tree val)
 {
   /* Drop all qualifiers and address-space information from the value type.  */
   tree type = TYPE_MAIN_VARIANT (TREE_TYPE (val));
   tree var = create_tmp_var (type, get_name (val));
-  if (is_formal
-      && (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
-         || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE))
+  if (TREE_CODE (TREE_TYPE (var)) == COMPLEX_TYPE
+      || TREE_CODE (TREE_TYPE (var)) == VECTOR_TYPE)
     DECL_GIMPLE_REG_P (var) = 1;
   return var;
 }
@@ -477,7 +476,7 @@ lookup_tmp_var (tree val, bool is_formal
      work in reload and final and poorer code generation, outweighing
      the extra memory allocation here.  */
   if (!optimize || !is_formal || TREE_SIDE_EFFECTS (val))
-    ret = create_tmp_from_val (val, is_formal);
+    ret = create_tmp_from_val (val);
   else
     {
       elt_t elt, *elt_p;
@@ -491,7 +490,7 @@ lookup_tmp_var (tree val, bool is_formal
        {
          elt_p = XNEW (elt_t);
          elt_p->val = val;
-         elt_p->temp = ret = create_tmp_from_val (val, is_formal);
+         elt_p->temp = ret = create_tmp_from_val (val);
          *slot = elt_p;
        }
       else
@@ -3154,7 +3153,11 @@ prepare_gimple_addressable (tree *expr_p
   while (handled_component_p (*expr_p))
     expr_p = &TREE_OPERAND (*expr_p, 0);
   if (is_gimple_reg (*expr_p))
-    *expr_p = get_initialized_tmp_var (*expr_p, seq_p, NULL);
+    {
+      tree var = get_initialized_tmp_var (*expr_p, seq_p, NULL);
+      DECL_GIMPLE_REG_P (var) = 0;
+      *expr_p = var;
+    }
 }
 
 /* A subroutine of gimplify_modify_expr.  Replace a MODIFY_EXPR with

Reply via email to