One could also simply remove the error in varasm.c. This would preserve the optimization. As a side effect, this would allow register without __asm__ at file scope, but there do not seem to be any disadvantages. (register at file scope is already diagnosed by the C FE when using --pedantic).
Best, Martin Am Donnerstag, den 27.02.2020, 10:31 +0100 schrieb Richard Biener: > 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 > > > > > >