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 <[email protected]>
* 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