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:
parent
e62bb7f083
commit
efc9ccbfd0
11
gcc/testsuite/gcc.dg/tree-ssa/pr97260.c
Normal file
11
gcc/testsuite/gcc.dg/tree-ssa/pr97260.c
Normal 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);
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user