Re: [PATCH] Fix expansion with COMPOUND_LITERAL_EXPR (PR middle-end/64067)
On Thu, Nov 27, 2014 at 11:03:20AM +0100, Richard Biener wrote: > > The testcase shows that when expanding ARRAY_REF from a const static var > > with initializer that contains COMPOUND_LITERAL_EXPR, we can try to expand > > COMPOUND_LITERAL_EXPR even when modifier is not EXPAND_INITIALIZER (it is > > EXPAND_SUM in that testcase, but could be many others). > > While gimplification should get rid of all the compound literal exprs > > for automatic compound literals, COMPOUND_LITERAL_EXPR for static compound > > literals can survive in the initializers, thus this patch handles them > > always. > > > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > Ok. (I wonder if the fallthru still makes sense or if we should > hit a gcc_unreachable () for other uses of COMPOUND_LITERAL_EXPR). I think the fallthru can't work, because it will hit the gcc_unreachable (); on unhandled COMPOUND_LITERAL_EXPR in expand_expr_real_*. So changing the if in the patch into gcc_assert and removing /* FALLTHRU */ might be ok too (and removing == COMPOUND_LITERAL_EXPR from the fallthru if). > > 2014-11-26 Jakub Jelinek > > > > PR middle-end/64067 > > * expr.c (expand_expr_addr_expr_1) : > > Handle it by returning address of COMPOUND_LITERAL_EXPR_DECL > > not only if modifier is EXPAND_INITIALIZER, but whenever > > COMPOUND_LITERAL_EXPR_DECL is non-NULL and TREE_STATIC. > > > > * gcc.c-torture/compile/pr64067.c: New test. > > > > --- gcc/expr.c.jj 2014-11-18 08:26:45.0 +0100 > > +++ gcc/expr.c 2014-11-26 17:38:52.877675088 +0100 > > @@ -7677,11 +7677,13 @@ expand_expr_addr_expr_1 (tree exp, rtx t > >break; > > > > case COMPOUND_LITERAL_EXPR: > > - /* Allow COMPOUND_LITERAL_EXPR in initializers, if e.g. > > -rtl_for_decl_init is called on DECL_INITIAL with > > -COMPOUNT_LITERAL_EXPRs in it, they aren't gimplified. */ > > - if (modifier == EXPAND_INITIALIZER > > - && COMPOUND_LITERAL_EXPR_DECL (exp)) > > + /* Allow COMPOUND_LITERAL_EXPR in initializers or coming from > > +initializers, if e.g. rtl_for_decl_init is called on DECL_INITIAL > > +with COMPOUND_LITERAL_EXPRs in it, or ARRAY_REF on a const static > > +array with address of COMPOUND_LITERAL_EXPR in DECL_INITIAL; > > +the initializers aren't gimplified. */ > > + if (COMPOUND_LITERAL_EXPR_DECL (exp) > > + && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp))) > > return expand_expr_addr_expr_1 (COMPOUND_LITERAL_EXPR_DECL (exp), > > target, tmode, modifier, as); > >/* FALLTHRU */ Jakub
Re: [PATCH] Fix expansion with COMPOUND_LITERAL_EXPR (PR middle-end/64067)
On Wed, 26 Nov 2014, Jakub Jelinek wrote: > Hi! > > The testcase shows that when expanding ARRAY_REF from a const static var > with initializer that contains COMPOUND_LITERAL_EXPR, we can try to expand > COMPOUND_LITERAL_EXPR even when modifier is not EXPAND_INITIALIZER (it is > EXPAND_SUM in that testcase, but could be many others). > While gimplification should get rid of all the compound literal exprs > for automatic compound literals, COMPOUND_LITERAL_EXPR for static compound > literals can survive in the initializers, thus this patch handles them > always. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? Ok. (I wonder if the fallthru still makes sense or if we should hit a gcc_unreachable () for other uses of COMPOUND_LITERAL_EXPR). Thanks, Richard. > 2014-11-26 Jakub Jelinek > > PR middle-end/64067 > * expr.c (expand_expr_addr_expr_1) : > Handle it by returning address of COMPOUND_LITERAL_EXPR_DECL > not only if modifier is EXPAND_INITIALIZER, but whenever > COMPOUND_LITERAL_EXPR_DECL is non-NULL and TREE_STATIC. > > * gcc.c-torture/compile/pr64067.c: New test. > > --- gcc/expr.c.jj 2014-11-18 08:26:45.0 +0100 > +++ gcc/expr.c2014-11-26 17:38:52.877675088 +0100 > @@ -7677,11 +7677,13 @@ expand_expr_addr_expr_1 (tree exp, rtx t >break; > > case COMPOUND_LITERAL_EXPR: > - /* Allow COMPOUND_LITERAL_EXPR in initializers, if e.g. > - rtl_for_decl_init is called on DECL_INITIAL with > - COMPOUNT_LITERAL_EXPRs in it, they aren't gimplified. */ > - if (modifier == EXPAND_INITIALIZER > - && COMPOUND_LITERAL_EXPR_DECL (exp)) > + /* Allow COMPOUND_LITERAL_EXPR in initializers or coming from > + initializers, if e.g. rtl_for_decl_init is called on DECL_INITIAL > + with COMPOUND_LITERAL_EXPRs in it, or ARRAY_REF on a const static > + array with address of COMPOUND_LITERAL_EXPR in DECL_INITIAL; > + the initializers aren't gimplified. */ > + if (COMPOUND_LITERAL_EXPR_DECL (exp) > + && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp))) > return expand_expr_addr_expr_1 (COMPOUND_LITERAL_EXPR_DECL (exp), > target, tmode, modifier, as); >/* FALLTHRU */ > --- gcc/testsuite/gcc.c-torture/compile/pr64067.c.jj 2014-11-26 > 17:37:37.835865797 +0100 > +++ gcc/testsuite/gcc.c-torture/compile/pr64067.c 2014-11-26 > 17:37:02.0 +0100 > @@ -0,0 +1,10 @@ > +/* PR middle-end/64067 */ > + > +struct S { int s; }; > +int *const v[1] = { &((struct S) { .s = 42 }).s }; > + > +int * > +foo (void) > +{ > + return v[0]; > +} > > Jakub > > -- Richard Biener SUSE LINUX GmbH, GF: Jeff Hawn, Jennifer Guild, Felix Imendoerffer, HRB 21284 (AG Nuernberg) Maxfeldstrasse 5, 90409 Nuernberg, Germany
[PATCH] Fix expansion with COMPOUND_LITERAL_EXPR (PR middle-end/64067)
Hi! The testcase shows that when expanding ARRAY_REF from a const static var with initializer that contains COMPOUND_LITERAL_EXPR, we can try to expand COMPOUND_LITERAL_EXPR even when modifier is not EXPAND_INITIALIZER (it is EXPAND_SUM in that testcase, but could be many others). While gimplification should get rid of all the compound literal exprs for automatic compound literals, COMPOUND_LITERAL_EXPR for static compound literals can survive in the initializers, thus this patch handles them always. Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2014-11-26 Jakub Jelinek PR middle-end/64067 * expr.c (expand_expr_addr_expr_1) : Handle it by returning address of COMPOUND_LITERAL_EXPR_DECL not only if modifier is EXPAND_INITIALIZER, but whenever COMPOUND_LITERAL_EXPR_DECL is non-NULL and TREE_STATIC. * gcc.c-torture/compile/pr64067.c: New test. --- gcc/expr.c.jj 2014-11-18 08:26:45.0 +0100 +++ gcc/expr.c 2014-11-26 17:38:52.877675088 +0100 @@ -7677,11 +7677,13 @@ expand_expr_addr_expr_1 (tree exp, rtx t break; case COMPOUND_LITERAL_EXPR: - /* Allow COMPOUND_LITERAL_EXPR in initializers, if e.g. -rtl_for_decl_init is called on DECL_INITIAL with -COMPOUNT_LITERAL_EXPRs in it, they aren't gimplified. */ - if (modifier == EXPAND_INITIALIZER - && COMPOUND_LITERAL_EXPR_DECL (exp)) + /* Allow COMPOUND_LITERAL_EXPR in initializers or coming from +initializers, if e.g. rtl_for_decl_init is called on DECL_INITIAL +with COMPOUND_LITERAL_EXPRs in it, or ARRAY_REF on a const static +array with address of COMPOUND_LITERAL_EXPR in DECL_INITIAL; +the initializers aren't gimplified. */ + if (COMPOUND_LITERAL_EXPR_DECL (exp) + && TREE_STATIC (COMPOUND_LITERAL_EXPR_DECL (exp))) return expand_expr_addr_expr_1 (COMPOUND_LITERAL_EXPR_DECL (exp), target, tmode, modifier, as); /* FALLTHRU */ --- gcc/testsuite/gcc.c-torture/compile/pr64067.c.jj2014-11-26 17:37:37.835865797 +0100 +++ gcc/testsuite/gcc.c-torture/compile/pr64067.c 2014-11-26 17:37:02.0 +0100 @@ -0,0 +1,10 @@ +/* PR middle-end/64067 */ + +struct S { int s; }; +int *const v[1] = { &((struct S) { .s = 42 }).s }; + +int * +foo (void) +{ + return v[0]; +} Jakub