Commit 88d8330d by Eric Botcazou

re PR rtl-optimization/54870 (gfortran.dg/array_constructor_4.f90 FAILs)

	PR rtl-optimization/54870
	* tree.h (TREE_ADDRESSABLE): Document special usage on SSA_NAME.
	* cfgexpand.c (update_alias_info_with_stack_vars ): Set it on the
	SSA_NAME pointer that points to a partition if there is at least
	one variable with it set in the partition.
	* dse.c (local_variable_can_escape): New predicate.
	(can_escape): Call it.
	* gimplify.c (mark_addressable): If this is a partitioned decl, also
	mark the SSA_NAME pointer that points to a partition.

From-SVN: r192517
parent da4fdf2d
...@@ -635,6 +635,8 @@ update_alias_info_with_stack_vars (void) ...@@ -635,6 +635,8 @@ update_alias_info_with_stack_vars (void)
(void *)(size_t) uid)) = part; (void *)(size_t) uid)) = part;
*((tree *) pointer_map_insert (cfun->gimple_df->decls_to_pointers, *((tree *) pointer_map_insert (cfun->gimple_df->decls_to_pointers,
decl)) = name; decl)) = name;
if (TREE_ADDRESSABLE (decl))
TREE_ADDRESSABLE (name) = 1;
} }
/* Make the SSA name point to all partition members. */ /* Make the SSA name point to all partition members. */
......
...@@ -989,7 +989,32 @@ delete_dead_store_insn (insn_info_t insn_info) ...@@ -989,7 +989,32 @@ delete_dead_store_insn (insn_info_t insn_info)
insn_info->wild_read = false; insn_info->wild_read = false;
} }
/* Check if EXPR can possibly escape the current function scope. */ /* Return whether DECL, a local variable, can possibly escape the current
function scope. */
static bool
local_variable_can_escape (tree decl)
{
if (TREE_ADDRESSABLE (decl))
return true;
/* If this is a partitioned variable, we need to consider all the variables
in the partition. This is necessary because a store into one of them can
be replaced with a store into another and this may not change the outcome
of the escape analysis. */
if (cfun->gimple_df->decls_to_pointers != NULL)
{
void *namep
= pointer_map_contains (cfun->gimple_df->decls_to_pointers, decl);
if (namep)
return TREE_ADDRESSABLE (*(tree *)namep);
}
return false;
}
/* Return whether EXPR can possibly escape the current function scope. */
static bool static bool
can_escape (tree expr) can_escape (tree expr)
{ {
...@@ -998,7 +1023,11 @@ can_escape (tree expr) ...@@ -998,7 +1023,11 @@ can_escape (tree expr)
return true; return true;
base = get_base_address (expr); base = get_base_address (expr);
if (DECL_P (base) if (DECL_P (base)
&& !may_be_aliased (base)) && !may_be_aliased (base)
&& !(TREE_CODE (base) == VAR_DECL
&& !DECL_EXTERNAL (base)
&& !TREE_STATIC (base)
&& local_variable_can_escape (base)))
return false; return false;
return true; return true;
} }
......
...@@ -116,6 +116,19 @@ mark_addressable (tree x) ...@@ -116,6 +116,19 @@ mark_addressable (tree x)
&& TREE_CODE (x) != RESULT_DECL) && TREE_CODE (x) != RESULT_DECL)
return; return;
TREE_ADDRESSABLE (x) = 1; TREE_ADDRESSABLE (x) = 1;
/* Also mark the artificial SSA_NAME that points to the partition of X. */
if (TREE_CODE (x) == VAR_DECL
&& !DECL_EXTERNAL (x)
&& !TREE_STATIC (x)
&& cfun->gimple_df != NULL
&& cfun->gimple_df->decls_to_pointers != NULL)
{
void *namep
= pointer_map_contains (cfun->gimple_df->decls_to_pointers, x);
if (namep)
TREE_ADDRESSABLE (*(tree *)namep) = 1;
}
} }
/* Return a hash value for a formal temporary table entry. */ /* Return a hash value for a formal temporary table entry. */
......
...@@ -484,9 +484,10 @@ struct GTY(()) tree_base { ...@@ -484,9 +484,10 @@ struct GTY(()) tree_base {
TREE_ADDRESSABLE in TREE_ADDRESSABLE in
VAR_DECL, PARM_DECL, RESULT_DECL, FUNCTION_DECL, LABEL_DECL VAR_DECL, PARM_DECL, RESULT_DECL, FUNCTION_DECL, LABEL_DECL
SSA_NAME
all types all types
CONSTRUCTOR, IDENTIFIER_NODE CONSTRUCTOR, IDENTIFIER_NODE
STMT_EXPR, it means we want the result of the enclosed expression STMT_EXPR
CALL_EXPR_TAILCALL in CALL_EXPR_TAILCALL in
CALL_EXPR CALL_EXPR
...@@ -1085,15 +1086,18 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, ...@@ -1085,15 +1086,18 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
/* In VAR_DECL, PARM_DECL and RESULT_DECL nodes, nonzero means address /* In VAR_DECL, PARM_DECL and RESULT_DECL nodes, nonzero means address
of this is needed. So it cannot be in a register. of this is needed. So it cannot be in a register.
In a FUNCTION_DECL it has no meaning. In a FUNCTION_DECL it has no meaning.
In CONSTRUCTOR nodes, it means object constructed must be in memory.
In LABEL_DECL nodes, it means a goto for this label has been seen In LABEL_DECL nodes, it means a goto for this label has been seen
from a place outside all binding contours that restore stack levels. from a place outside all binding contours that restore stack levels.
In an artificial SSA_NAME that points to a stack partition with at least
two variables, it means that at least one variable has TREE_ADDRESSABLE.
In ..._TYPE nodes, it means that objects of this type must be fully In ..._TYPE nodes, it means that objects of this type must be fully
addressable. This means that pieces of this object cannot go into addressable. This means that pieces of this object cannot go into
register parameters, for example. If this a function type, this register parameters, for example. If this a function type, this
means that the value must be returned in memory. means that the value must be returned in memory.
In CONSTRUCTOR nodes, it means object constructed must be in memory.
In IDENTIFIER_NODEs, this means that some extern decl for this name In IDENTIFIER_NODEs, this means that some extern decl for this name
had its address taken. That matters for inline functions. */ had its address taken. That matters for inline functions.
In a STMT_EXPR, it means we want the result of the enclosed expression. */
#define TREE_ADDRESSABLE(NODE) ((NODE)->base.addressable_flag) #define TREE_ADDRESSABLE(NODE) ((NODE)->base.addressable_flag)
/* Set on a CALL_EXPR if the call is in a tail position, ie. just before the /* Set on a CALL_EXPR if the call is in a tail position, ie. just before the
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment