What's the difference between -O3 and (-O2 + flags that man gcc says -O3 adds to -O2)?

前端 未结 2 990
一生所求
一生所求 2020-12-03 04:28

I recently received a bug report about a program which fails to compile with the -O3 switch (see https://github.com/cschwan/sage-on-gentoo/issues/66). In particular, the pro

2条回答
  •  无人及你
    2020-12-03 05:15

    Man pages can be outdated, but you can find actual lists for O2 and O3.

    To get full list (almost, check "update") of -f optimization options actually used, I suggest you use the -fverbose-asm -save-temps (or -fverbose-asm -S) - there is a full list at a top of asm file (*.s).

    For gcc-4.6.0 I got x (the difference between O2 and O3) to be:

     -fgcse-after-reload
     -finline-functions
     -fipa-cp-clone
     -fpredictive-commoning
     -ftree-loop-distribute-patterns
     -ftree-vectorize
     -funswitch-loops
    

    Another source of information for your question is the sources of GCC (file gcc/opts.c and possibly gcc/common.opt) as gcc-4.6.0:

    /* -O3 optimizations.  */
    { OPT_LEVELS_3_PLUS, OPT_ftree_loop_distribute_patterns, NULL, 1 },
    { OPT_LEVELS_3_PLUS, OPT_fpredictive_commoning, NULL, 1 },
    /* Inlining of functions reducing size is a good idea with -Os
       regardless of them being declared inline.  */
    { OPT_LEVELS_3_PLUS_AND_SIZE, OPT_finline_functions, NULL, 1 },
    { OPT_LEVELS_3_PLUS, OPT_funswitch_loops, NULL, 1 },
    { OPT_LEVELS_3_PLUS, OPT_fgcse_after_reload, NULL, 1 },
    { OPT_LEVELS_3_PLUS, OPT_ftree_vectorize, NULL, 1 },
    { OPT_LEVELS_3_PLUS, OPT_fipa_cp_clone, NULL, 1 },
    

    I have also checked, does gcc check -On in other files (cscope symbol search for x_optimize).

    The only additional usage of n from option -On is saving it value into macro __OPTIMIZE__. So some headers can behave differently for value of this macro equal 2 or 3.

    UPDATE: There are questions about it in GCC WIKI:

    • "Is -O1 (-O2,-O3 or -Os) equivalent to individual -foptimization options?"

    No. First, individual optimization options (-f*) do not enable optimization, an option -Os or -Ox with x > 0 is required. Second, the -Ox flags enable many optimizations that are not controlled by any individual -f* option. There are no plans to add individual options for controlling all these optimizations.

    • "What specific flags are enabled by -O1 (-O2, -O3 or -Os)?"

    Varies by platform and GCC version. You can get GCC to tell you what flags it enables by doing this:

    touch empty.c
    gcc -O1 -S -fverbose-asm empty.c
    cat empty.s
    

提交回复
热议问题