[PATCH][RFC] Merge LTO -O options from compile-time

Jan Hubicka hubicka@ucw.cz
Tue Mar 4 18:43:00 GMT 2014


> 
> This merges -O options given at compile-time into a single
> optimization level to be used for LTO link time (but
> overridden with whatever is specified at LTO link time - unless
> no optimization level is specified there).  That is, it
> determines a "default" optimization level used at LTO link time
> (as opposed to the default optimization level zero).
> 
> Currently the code merges exact same options as-is and
> mismatching optimization levels based on the maximum value of
> 'optimize' they cause and merging it as -Ooptimize.
> Thus -Og and -Os get merged as -O2, -O and -Ofast get merged as -O3
> and -O and -O1 get merged as -O1.
> 
> Specifying any optimization level explicitely at link time
> will override what we came up with above (including explicitely
> specifying -O0).
> 
> Comments?
> 
> I've tested that it works as expected.  Do we want something like
> this for 4.9?

Yes, I do not see much down-sides.  Of course I have the grand plans
to make compiler flags to be preserved thorough LTO, but i think you
patch improves things over what we have now.

Honza
> 
> Thanks,
> Richard.
> 
> 2014-03-04  Richard Biener  <rguenther@suse.de>
> 
> 	* lto-wrapper.c (merge_and_complain): Merge compile-time
> 	optimization levels.
> 	(run_gcc): And pass it through to the link options.
> 
> Index: gcc/lto-wrapper.c
> ===================================================================
> *** gcc/lto-wrapper.c	(revision 208305)
> --- gcc/lto-wrapper.c	(working copy)
> *************** merge_and_complain (struct cl_decoded_op
> *** 459,464 ****
> --- 459,535 ----
>   	    fatal ("Option %s not used consistently in all LTO input files",
>   		   foption->orig_option_with_args_text);
>   	  break;
> + 
> + 	case OPT_O:
> + 	case OPT_Ofast:
> + 	case OPT_Og:
> + 	case OPT_Os:
> + 	  for (j = 0; j < *decoded_options_count; ++j)
> + 	    if ((*decoded_options)[j].opt_index == OPT_O
> + 		|| (*decoded_options)[j].opt_index == OPT_Ofast
> + 		|| (*decoded_options)[j].opt_index == OPT_Og
> + 		|| (*decoded_options)[j].opt_index == OPT_Os)
> + 	      break;
> + 	  if (j == *decoded_options_count)
> + 	    append_option (decoded_options, decoded_options_count, foption);
> + 	  else if ((*decoded_options)[j].opt_index == foption->opt_index
> + 		   && foption->opt_index != OPT_O)
> + 	    /* Exact same options get merged.  */
> + 	    ;
> + 	  else
> + 	    {
> + 	      /* For mismatched option kinds preserve the optimization
> + 	         level only, thus merge it as -On.  This also handles
> + 		 merging of same optimization level -On.  */
> + 	      int level = 0;
> + 	      switch (foption->opt_index)
> + 		{
> + 		case OPT_O:
> + 		  if (foption->arg[0] == '\0')
> + 		    level = MAX (level, 1);
> + 		  else
> + 		    level = MAX (level, atoi (foption->arg));
> + 		  break;
> + 		case OPT_Ofast:
> + 		  level = MAX (level, 3);
> + 		  break;
> + 		case OPT_Og:
> + 		  level = MAX (level, 1);
> + 		  break;
> + 		case OPT_Os:
> + 		  level = MAX (level, 2);
> + 		  break;
> + 		default:
> + 		  gcc_unreachable ();
> + 		}
> + 	      switch ((*decoded_options)[j].opt_index)
> + 		{
> + 		case OPT_O:
> + 		  if ((*decoded_options)[j].arg[0] == '\0')
> + 		    level = MAX (level, 1);
> + 		  else
> + 		    level = MAX (level, atoi ((*decoded_options)[j].arg));
> + 		  break;
> + 		case OPT_Ofast:
> + 		  level = MAX (level, 3);
> + 		  break;
> + 		case OPT_Og:
> + 		  level = MAX (level, 1);
> + 		  break;
> + 		case OPT_Os:
> + 		  level = MAX (level, 2);
> + 		  break;
> + 		default:
> + 		  gcc_unreachable ();
> + 		}
> + 	      (*decoded_options)[j].opt_index = OPT_O;
> + 	      char *tem;
> + 	      asprintf (&tem, "-O%d", level);
> + 	      (*decoded_options)[j].arg = &tem[2];
> + 	      (*decoded_options)[j].canonical_option[0] = tem;
> + 	      (*decoded_options)[j].value = 1;
> + 	    }
> + 	  break;
>   	}
>       }
>   }
> *************** run_gcc (unsigned argc, char *argv[])
> *** 610,615 ****
> --- 681,690 ----
>   	case OPT_fwrapv:
>   	case OPT_ftrapv:
>   	case OPT_fstrict_overflow:
> + 	case OPT_O:
> + 	case OPT_Ofast:
> + 	case OPT_Og:
> + 	case OPT_Os:
>   	  break;
>   
>   	default:



More information about the Gcc-patches mailing list