Message ID | 20151130230539.GB30608@kam.mff.cuni.cz |
---|---|
State | New |
Headers | show |
On December 1, 2015 12:05:39 AM GMT+01:00, Jan Hubicka <hubicka@ucw.cz> wrote: >Hi, >this is first patch in the broken up series. It adds the logic into >ipa-inline-transform to drop the flag when inlining. I do it always >until >we find a way to make early optimizations safe WRT this transform. > >The testcase triggers with GCC 5.0/4.9 too, older compilers passes if >-fstrict-aliasing is used at linktime and fails otherwise. > >Bootstrapped/regtested x86_64-linux, will commit it after re-testing on >Firefox. > >Honza > > * ipa-inline-transform.c (inline_call): Drop -fstrict-aliasing when > inlining -fno-strict-aliasing into -fstrict-aliasing body. > * gcc.dg/lto/alias-1_0.c: New testcase. > * gcc.dg/lto/alias-1_1.c: New testcase. >Index: ipa-inline-transform.c >=================================================================== >--- ipa-inline-transform.c (revision 231081) >+++ ipa-inline-transform.c (working copy) >@@ -322,6 +322,21 @@ inline_call (struct cgraph_edge *e, bool > if (DECL_FUNCTION_PERSONALITY (callee->decl)) > DECL_FUNCTION_PERSONALITY (to->decl) > = DECL_FUNCTION_PERSONALITY (callee->decl); >+ if (!opt_for_fn (callee->decl, flag_strict_aliasing) >+ && opt_for_fn (to->decl, flag_strict_aliasing)) Just curious why you don't handle the other way round? >+ { >+ struct gcc_options opts = global_options; >+ >+ cl_optimization_restore (&opts, >+ TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (to->decl))); >+ opts.x_flag_strict_aliasing = false; >+ if (dump_file) >+ fprintf (dump_file, "Dropping flag_strict_aliasing on %s:%i\n", >+ to->name (), to->order); ISTR to have seen %s/%i for printing name and order in IPA, no? >+ build_optimization_node (&opts); >+ DECL_FUNCTION_SPECIFIC_OPTIMIZATION (to->decl) >+ = build_optimization_node (&opts); >+ } > >/* If aliases are involved, redirect edge to the actual destination and > possibly remove the aliases. */ >Index: testsuite/gcc.dg/lto/alias-1_0.c >=================================================================== >--- testsuite/gcc.dg/lto/alias-1_0.c (revision 0) >+++ testsuite/gcc.dg/lto/alias-1_0.c (revision 0) >@@ -0,0 +1,23 @@ >+/* { dg-lto-do run } */ >+/* { dg-lto-options { { -O2 -flto } } } */ >+int val; >+ >+__attribute__ ((used)) >+int *ptr = &val; >+__attribute__ ((used)) >+float *ptr2 = (void *)&val; >+ >+extern void typefun(float val); >+ >+void link_error (void); Unused and unneeded forward decl? Thanks, >+ >+int >+main() >+{ >+ *ptr=1; >+ typefun (0); >+ if (*ptr) >+ __builtin_abort (); >+ return 0; >+} >+ >Index: testsuite/gcc.dg/lto/alias-1_1.c >=================================================================== >--- testsuite/gcc.dg/lto/alias-1_1.c (revision 0) >+++ testsuite/gcc.dg/lto/alias-1_1.c (revision 0) >@@ -0,0 +1,7 @@ >+/* { dg-options "-fno-strict-aliasing" } */ >+extern float *ptr2; >+void >+typefun (float val) >+{ >+ *ptr2=val; >+}
> > * ipa-inline-transform.c (inline_call): Drop -fstrict-aliasing when > > inlining -fno-strict-aliasing into -fstrict-aliasing body. > > * gcc.dg/lto/alias-1_0.c: New testcase. > > * gcc.dg/lto/alias-1_1.c: New testcase. > >Index: ipa-inline-transform.c > >=================================================================== > >--- ipa-inline-transform.c (revision 231081) > >+++ ipa-inline-transform.c (working copy) > >@@ -322,6 +322,21 @@ inline_call (struct cgraph_edge *e, bool > > if (DECL_FUNCTION_PERSONALITY (callee->decl)) > > DECL_FUNCTION_PERSONALITY (to->decl) > > = DECL_FUNCTION_PERSONALITY (callee->decl); > >+ if (!opt_for_fn (callee->decl, flag_strict_aliasing) > >+ && opt_for_fn (to->decl, flag_strict_aliasing)) > > Just curious why you don't handle the other way round? After inlining, opt_for_fn of CALLEE will be ignored and will become opt_for_fn of TO. Turning flag_strict_alising code to !flag_strict_aliasing is safe, but not the other way around. > > >+ { > >+ struct gcc_options opts = global_options; > >+ > >+ cl_optimization_restore (&opts, > >+ TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (to->decl))); > >+ opts.x_flag_strict_aliasing = false; > >+ if (dump_file) > >+ fprintf (dump_file, "Dropping flag_strict_aliasing on %s:%i\n", > >+ to->name (), to->order); > > ISTR to have seen %s/%i for printing name and order in IPA, no? Hmm, right, will update it. > >+void link_error (void); > > Unused and unneeded forward decl? Yep, I originally wanted to check that we optimize out the type punned code (we can) but we don't seem to be able to do so. It is just a testcase and extra declaration is harmless I guess. Thanks! Honza
Index: ipa-inline-transform.c =================================================================== --- ipa-inline-transform.c (revision 231081) +++ ipa-inline-transform.c (working copy) @@ -322,6 +322,21 @@ inline_call (struct cgraph_edge *e, bool if (DECL_FUNCTION_PERSONALITY (callee->decl)) DECL_FUNCTION_PERSONALITY (to->decl) = DECL_FUNCTION_PERSONALITY (callee->decl); + if (!opt_for_fn (callee->decl, flag_strict_aliasing) + && opt_for_fn (to->decl, flag_strict_aliasing)) + { + struct gcc_options opts = global_options; + + cl_optimization_restore (&opts, + TREE_OPTIMIZATION (DECL_FUNCTION_SPECIFIC_OPTIMIZATION (to->decl))); + opts.x_flag_strict_aliasing = false; + if (dump_file) + fprintf (dump_file, "Dropping flag_strict_aliasing on %s:%i\n", + to->name (), to->order); + build_optimization_node (&opts); + DECL_FUNCTION_SPECIFIC_OPTIMIZATION (to->decl) + = build_optimization_node (&opts); + } /* If aliases are involved, redirect edge to the actual destination and possibly remove the aliases. */ Index: testsuite/gcc.dg/lto/alias-1_0.c =================================================================== --- testsuite/gcc.dg/lto/alias-1_0.c (revision 0) +++ testsuite/gcc.dg/lto/alias-1_0.c (revision 0) @@ -0,0 +1,23 @@ +/* { dg-lto-do run } */ +/* { dg-lto-options { { -O2 -flto } } } */ +int val; + +__attribute__ ((used)) +int *ptr = &val; +__attribute__ ((used)) +float *ptr2 = (void *)&val; + +extern void typefun(float val); + +void link_error (void); + +int +main() +{ + *ptr=1; + typefun (0); + if (*ptr) + __builtin_abort (); + return 0; +} + Index: testsuite/gcc.dg/lto/alias-1_1.c =================================================================== --- testsuite/gcc.dg/lto/alias-1_1.c (revision 0) +++ testsuite/gcc.dg/lto/alias-1_1.c (revision 0) @@ -0,0 +1,7 @@ +/* { dg-options "-fno-strict-aliasing" } */ +extern float *ptr2; +void +typefun (float val) +{ + *ptr2=val; +}