On Tue, 4 Feb 2014, Jakub Jelinek wrote: > Hi! > > As discussed in the PR, this patch disallows cloning of > non-optimized functions, which doesn't work properly e.g. because > -O0 functions don't have vdef/vuses, but also doesn't sound like > something people would like to happen if they say particular function > shouldn't be optimized. If everything is compiled with -O0, we > don't perform the IPA optimizations at all. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok. Thanks, Richard. > 2014-02-04 Jakub Jelinek <ja...@redhat.com> > > PR ipa/60026 > * tree-inline.c (copy_forbidden): Fail for > __attribute__((optimize (0))) functions. > > * c-c++-common/torture/pr60026.c: New test. > > --- gcc/tree-inline.c.jj 2014-02-01 09:39:59.000000000 +0100 > +++ gcc/tree-inline.c 2014-02-03 19:33:52.146931674 +0100 > @@ -3315,6 +3315,18 @@ copy_forbidden (struct function *fun, tr > goto fail; > } > > + tree fs_opts; > + fs_opts = DECL_FUNCTION_SPECIFIC_OPTIMIZATION (fun->decl); > + if (fs_opts) > + { > + struct cl_optimization *os = TREE_OPTIMIZATION (fs_opts); > + if (!os->x_optimize) > + { > + reason = G_("function %q+F compiled without optimizations"); > + goto fail; > + } > + } > + > fail: > fun->cannot_be_copied_reason = reason; > fun->cannot_be_copied_set = true; > --- gcc/testsuite/c-c++-common/torture/pr60026.c.jj 2014-02-03 > 18:18:37.395092543 +0100 > +++ gcc/testsuite/c-c++-common/torture/pr60026.c 2014-02-03 > 18:18:26.000000000 +0100 > @@ -0,0 +1,28 @@ > +/* PR ipa/60026 */ > +/* { dg-do compile } */ > + > +struct S { int f; } a; > + > +__attribute__((optimize (0))) > +struct S foo (int x, struct S y) > +{ > + int b = y.f; > + return a; > +} > + > +void > +bar () > +{ > + while (a.f) > + { > + struct S c = {0}; > + foo (0, c); > + } > +} > + > +int > +main () > +{ > + bar (); > + return 0; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE / SUSE Labs SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 GF: Jeff Hawn, Jennifer Guild, Felix Imend"orffer