Re: Difference between -O3 and -O2 with the -f options -O3 adds

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Wed, Jul 29, 2009 at 05:43:25PM +0200, Matthias Kretz wrote:
> Hi,
> 
> I just updated to 4.4.1 and now one of my unit tests fails when it is compiled 
> with -O3.
> OTOH when I compile with -O2 -finline-functions -funswitch-loops -ftree-
> vectorize -fpredictive-commoning -fgcse-after-reload -fipa-cp-clone the 
> resulting binary does not fail.
> 
> I looked at the Assembly with objdump -dwC and I can see at least that the -O3 
> compiled binary has some loop unrolling done that's not in the other binary.
> 
> The gcc manual says that -O3 is the same as -O2 plus -finline-functions -
> funswitch-loops -ftree-vectorize -fpredictive-commoning -fgcse-after-reload
> 
> gcc -c -Q -O3 --help=optimizers compared to the same with -O2 shows that also 
> -fipa-cp-clone goes in that list. But still the result is not the same.
> 
> Any ideas how to debug this regression further?
> 
> Regards,
> 	Matthias

This is likely due to two places in the compiler that look at optimization
level as a value, instead of just as as the component switches.

The first place is in tree-ssa-pre.c, which sets the boolean do_partial_partial
if -O3 and there is no extra switch to control this::

	/* Main entry point to the SSA-PRE pass.  DO_FRE is true if the caller
	   only wants to do full redundancy elimination.  */

	static unsigned int
	execute_pre (bool do_fre ATTRIBUTE_UNUSED)
	{
	  unsigned int todo = 0;

	  do_partial_partial = optimize > 2;

	  /* This has to happen before SCCVN runs because
	     loop_optimizer_init may create new phis, etc.  */
	  if (!do_fre)
	    loop_optimizer_init (LOOPS_NORMAL);

	  if (!run_scc_vn (do_fre))
	    {
	      if (!do_fre)
		{
		  remove_dead_inserted_code ();
		  loop_optimizer_finalize ();
		}

	      return 0;
	    }
	  init_pre (do_fre);
	  /* ... */

In opts.c, two parameter values are adjusted if -O3 in addition to the -f
options:


	  /* Allow even more virtual operators.  Max-aliased-vops was set above for
	     -O2, so don't reset it unless we are at -O3.  */
	  if (opt3)
	    set_param_value ("max-aliased-vops", 1000);

	  set_param_value ("avg-aliased-vops", (opt3) ? 3 : initial_avg_aliased_vops);

For the second set, you can set those parameters yourself to see if setting
them makes any difference.  The first case, you could need to debug the
compiler and/or change the source to try it out.

-- 
Michael Meissner, IBM
4 Technology Place Drive, MS 2203A, Westford, MA, 01886, USA
meissner@xxxxxxxxxxxxxxxxxx

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux