varpool: Restore GENERIC TREE_READONLY automatic var optimization [PR7260]

In 4.8 and earlier we used to fold the following to 0 during GENERIC folding,
but we don't do that anymore because ctor_for_folding etc. has been turned into a
GIMPLE centric API, but as the testcase shows, it is invoked even during
GENERIC folding and there the automatic vars still should have meaningful
initializers.  I've verified that the C++ FE drops TREE_READONLY on
automatic vars with const qualified types if they require non-constant
(runtime) initialization.

2021-01-27  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/97260
	* varpool.c: Include tree-pass.h.
	(ctor_for_folding): In GENERIC return DECL_INITIAL for TREE_READONLY
	non-TREE_SIDE_EFFECTS automatic variables.

	* gcc.dg/tree-ssa/pr97260.c: New test.
This commit is contained in:
Jakub Jelinek 2021-01-27 10:08:46 +01:00
parent e62bb7f083
commit efc9ccbfd0
2 changed files with 19 additions and 0 deletions

View File

@ -0,0 +1,11 @@
/* PR tree-optimization/97260 */
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-optimized" } */
/* { dg-final { scan-tree-dump "return 0;" "optimized" } } */
int
foo (void)
{
const char a[] = "1234";
return __builtin_memcmp (a, "1234", 4);
}

View File

@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see
#include "context.h"
#include "stringpool.h"
#include "attribs.h"
#include "tree-pass.h"
const char * const tls_model_names[]={"none", "emulated",
"global-dynamic", "local-dynamic",
@ -412,6 +413,13 @@ ctor_for_folding (tree decl)
if (!TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
{
gcc_assert (!TREE_PUBLIC (decl));
/* Unless this is called during FE folding. */
if (cfun
&& (cfun->curr_properties & (PROP_trees | PROP_rtl)) == 0
&& TREE_READONLY (decl)
&& !TREE_SIDE_EFFECTS (decl)
&& DECL_INITIAL (decl))
return DECL_INITIAL (decl);
return error_mark_node;
}