This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: Difference between -O3 and -O2 with the -f options -O3 adds
- From: Michael Meissner <meissner at linux dot vnet dot ibm dot com>
- To: Matthias Kretz <Matthias dot Kretz at kip dot uni-heidelberg dot de>
- Cc: gcc-help at gcc dot gnu dot org
- Date: Wed, 29 Jul 2009 12:57:30 -0400
- Subject: Re: Difference between -O3 and -O2 with the -f options -O3 adds
- References: <200907291743.25681.Matthias.Kretz@kip.uni-heidelberg.de>
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@linux.vnet.ibm.com