On Thu, 27 Feb 2020, Jakub Jelinek wrote: > Hi! > > The following testcase is rejected, while it was accepted in 3.4 and earlier > (before tree-ssa merge). > The problem is that we decide to promote the const variable to TREE_STATIC, > but TREE_STATIC DECL_REGISTER VAR_DECLs may only be the global register vars > and so assemble_variable/make_decl_rtl diagnoses it. > > Either we do what the following patch does, where we could consider > register as a hint the user doesn't want such optimization, because if > something is forced static, it is not "register" anymore and register static > is not valid in C either, or we could clear DECL_REGISTER instead, but would > still need to punt at least on DECL_HARD_REGISTER cases. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Thanks, Richard. > 2020-02-27 Jakub Jelinek <ja...@redhat.com> > > PR c/93949 > * gimplify.c (gimplify_init_constructor): Don't promote readonly > DECL_REGISTER variables to TREE_STATIC. > > * gcc.c-torture/compile/pr93949.c: New test. > > --- gcc/gimplify.c.jj 2020-02-25 13:54:02.087091120 +0100 > +++ gcc/gimplify.c 2020-02-26 19:30:57.466490166 +0100 > @@ -4923,6 +4923,7 @@ gimplify_init_constructor (tree *expr_p, > && num_nonzero_elements > 1 > && TREE_READONLY (object) > && VAR_P (object) > + && !DECL_REGISTER (object) > && (flag_merge_constants >= 2 || !TREE_ADDRESSABLE (object)) > /* For ctors that have many repeated nonzero elements > represented through RANGE_EXPRs, prefer initializing > --- gcc/testsuite/gcc.c-torture/compile/pr93949.c.jj 2020-02-26 > 19:42:15.754530691 +0100 > +++ gcc/testsuite/gcc.c-torture/compile/pr93949.c 2020-02-26 > 19:42:08.153642329 +0100 > @@ -0,0 +1,7 @@ > +/* PR c/93949 */ > + > +void > +foo (void) > +{ > + register const double d[3] = { 0., 1., 2. }; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg, Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)