Commit 81edaf2f by Eric Botcazou Committed by Eric Botcazou

trans.c (walk_nesting_tree): New static function.

	* gcc-interface/trans.c (walk_nesting_tree): New static function.
	(finalize_nrv): Use it to walk the entire nesting tree.

From-SVN: r271685
parent 3e86c778
2019-05-28 Eric Botcazou <ebotcazou@adacore.com> 2019-05-28 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (walk_nesting_tree): New static function.
(finalize_nrv): Use it to walk the entire nesting tree.
2019-05-28 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Subtype>: Remove * gcc-interface/decl.c (gnat_to_gnu_entity) <E_Record_Subtype>: Remove
obsolete test on Is_For_Access_Subtype. obsolete test on Is_For_Access_Subtype.
......
...@@ -4280,6 +4280,20 @@ finalize_nrv_unc_r (tree *tp, int *walk_subtrees, void *data) ...@@ -4280,6 +4280,20 @@ finalize_nrv_unc_r (tree *tp, int *walk_subtrees, void *data)
return NULL_TREE; return NULL_TREE;
} }
/* Apply FUNC to all the sub-trees of nested functions in NODE. FUNC is called
with the DATA and the address of each sub-tree. If FUNC returns a non-NULL
value, the traversal is stopped. */
static void
walk_nesting_tree (struct cgraph_node *node, walk_tree_fn func, void *data)
{
for (node = node->nested; node; node = node->next_nested)
{
walk_tree_without_duplicates (&DECL_SAVED_TREE (node->decl), func, data);
walk_nesting_tree (node, func, data);
}
}
/* Finalize the Named Return Value optimization for FNDECL. The NRV bitmap /* Finalize the Named Return Value optimization for FNDECL. The NRV bitmap
contains the candidates for Named Return Value and OTHER is a list of contains the candidates for Named Return Value and OTHER is a list of
the other return values. GNAT_RET is a representative return node. */ the other return values. GNAT_RET is a representative return node. */
...@@ -4287,7 +4301,6 @@ finalize_nrv_unc_r (tree *tp, int *walk_subtrees, void *data) ...@@ -4287,7 +4301,6 @@ finalize_nrv_unc_r (tree *tp, int *walk_subtrees, void *data)
static void static void
finalize_nrv (tree fndecl, bitmap nrv, vec<tree, va_gc> *other, Node_Id gnat_ret) finalize_nrv (tree fndecl, bitmap nrv, vec<tree, va_gc> *other, Node_Id gnat_ret)
{ {
struct cgraph_node *node;
struct nrv_data data; struct nrv_data data;
walk_tree_fn func; walk_tree_fn func;
unsigned int i; unsigned int i;
...@@ -4308,10 +4321,7 @@ finalize_nrv (tree fndecl, bitmap nrv, vec<tree, va_gc> *other, Node_Id gnat_ret ...@@ -4308,10 +4321,7 @@ finalize_nrv (tree fndecl, bitmap nrv, vec<tree, va_gc> *other, Node_Id gnat_ret
return; return;
/* Prune also the candidates that are referenced by nested functions. */ /* Prune also the candidates that are referenced by nested functions. */
node = cgraph_node::get_create (fndecl); walk_nesting_tree (cgraph_node::get_create (fndecl), prune_nrv_r, &data);
for (node = node->nested; node; node = node->next_nested)
walk_tree_without_duplicates (&DECL_SAVED_TREE (node->decl), prune_nrv_r,
&data);
if (bitmap_empty_p (nrv)) if (bitmap_empty_p (nrv))
return; return;
......
2019-05-28 Eric Botcazou <ebotcazou@adacore.com> 2019-05-28 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/opt79.ad[sb]: New test.
2019-05-28 Eric Botcazou <ebotcazou@adacore.com>
* gnat.dg/specs/discr5.ads: New test. * gnat.dg/specs/discr5.ads: New test.
2019-05-28 Eric Botcazou <ebotcazou@adacore.com> 2019-05-28 Eric Botcazou <ebotcazou@adacore.com>
......
-- { dg-do compile }
-- { dg-options "-O" }
package body Opt79 is
function F (I : Integer) return Arr is
A : Arr;
procedure Nested is
procedure Inner is
begin
A (1) := 0;
end;
begin
Inner;
end;
begin
Nested;
for J in A'Range loop
A (J) := I;
end loop;
return A;
end;
end Opt79;
package Opt79 is
type Arr is array (1 .. 8) of Integer;
function F (I : Integer) return Arr;
end Opt79;
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