From 13b6b77304b3b3e0ff36c1854d02ef21a0ad16c9 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Mon, 15 May 2017 08:43:25 +0000 Subject: [PATCH] trans.c (return_value_ok_for_nrv_p): Only apply the addressability check in the constrained case. * gcc-interface/trans.c (return_value_ok_for_nrv_p): Only apply the addressability check in the constrained case. From-SVN: r248053 --- gcc/ada/ChangeLog | 5 +++++ gcc/ada/gcc-interface/trans.c | 12 +++++++----- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 6d9a86d17fe..78a3bb1c71b 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,8 @@ +2017-05-15 Eric Botcazou + + * gcc-interface/trans.c (return_value_ok_for_nrv_p): Only apply the + addressability check in the constrained case. + 2017-05-15 Eric Botcazou * gcc-interface/trans.c (Identifier_to_gnu): Also accept incomplete diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c index 4c80053fabf..abdef037545 100644 --- a/gcc/ada/gcc-interface/trans.c +++ b/gcc/ada/gcc-interface/trans.c @@ -3238,8 +3238,9 @@ Loop_Statement_to_gnu (Node_Id gnat_node) RETURN_EXPR [ = 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, tree ret_val) 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. */ -- 2.30.2