Hello,
the attached one-liner passed bootstrap+testsuite (really all languages)
on x86_64-linux-gnu (I got an extra pass of unix/-m32: os but I assume
that the failure with trunk was random).
The current code is a bit weird: we bail out if either result or found is
TREE_ADDRESSABLE, but then the variable replacement includes:
TREE_ADDRESSABLE (result) |= TREE_ADDRESSABLE (found);
(modified "recently", it was a plain assignment before)
I mostly ran the testsuite to find a testcase showing why found should not
have its address taken, so if someone wants to add one (or at least a
comment in tree-nrv.c), that would be good.
2014-10-16 Marc Glisse <marc.gli...@inria.fr>
* tree-nrv.c (pass_nrv::execute): Don't disable when address is taken.
--
Marc Glisse
Index: gcc/tree-nrv.c
===================================================================
--- gcc/tree-nrv.c (revision 216286)
+++ gcc/tree-nrv.c (working copy)
@@ -210,21 +210,20 @@ pass_nrv::execute (function *fun)
return 0;
}
else
found = rhs;
/* The returned value must be a local automatic variable of the
same type and alignment as the function's result. */
if (TREE_CODE (found) != VAR_DECL
|| TREE_THIS_VOLATILE (found)
|| !auto_var_in_fn_p (found, current_function_decl)
- || TREE_ADDRESSABLE (found)
|| DECL_ALIGN (found) > DECL_ALIGN (result)
|| !useless_type_conversion_p (result_type,
TREE_TYPE (found)))
return 0;
}
else if (gimple_has_lhs (stmt))
{
tree addr = get_base_address (gimple_get_lhs (stmt));
/* If there's any MODIFY of component of RESULT,
then bail out. */