diff mbox

[Ada] Small speedup for simple functions returning unconstrained array

Message ID 1668664.i4Hbm2t3cf@polaris
State New
Headers show

Commit Message

Eric Botcazou May 15, 2017, 8:43 a.m. UTC
Tested on x86_64-suse-linux, applied on the mainline.


2017-05-15  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/trans.c (return_value_ok_for_nrv_p): Only apply the
	addressability check in the constrained case.
diff mbox

Patch

Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c	(revision 248052)
+++ gcc-interface/trans.c	(working copy)
@@ -3238,8 +3238,9 @@  Loop_Statement_to_gnu (Node_Id gnat_node
      RETURN_EXPR [<retval> = Ri]
        [...]
 
-   and we try to fulfill a simple criterion that would make it possible to
-   replace one or several Ri variables with the RESULT_DECL of the function.
+   where the Ri are not addressable and we try to fulfill a simple criterion
+   that would make it possible to replace one or several Ri variables by the
+   single RESULT_DECL of the function.
 
    The first observation is that RETURN_EXPRs that don't directly reference
    any of the Ri variables on the RHS of their assignment are transparent wrt
@@ -3271,8 +3272,8 @@  Loop_Statement_to_gnu (Node_Id gnat_node
    because the anonymous return object is allocated on the secondary stack
    and RESULT_DECL is only a pointer to it.  Each return object can be of a
    different size and is allocated separately so we need not care about the
-   aforementioned overlapping issues.  Therefore, we don't collect the other
-   expressions and skip step #2 in the algorithm.  */
+   addressability and the aforementioned overlapping issues.  Therefore, we
+   don't collect the other expressions and skip step #2 in the algorithm.  */
 
 struct nrv_data
 {
@@ -3612,7 +3613,8 @@  return_value_ok_for_nrv_p (tree ret_obj,
   if (TREE_STATIC (ret_val))
     return false;
 
-  if (TREE_ADDRESSABLE (ret_val))
+  /* For the constrained case, test for addressability.  */
+  if (ret_obj && TREE_ADDRESSABLE (ret_val))
     return false;
 
   /* For the constrained case, test for overalignment.  */