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