https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71785
--- Comment #19 from Segher Boessenkool <segher at gcc dot gnu.org> ---
(In reply to Aleksey from comment #16)
> > > It would be helpful if you give the explanation how these options affect
> > > "un-factoring".
> >
> > What options? -fno-reorder-blocks? Those doo the same to this code as
> > they do anywhere else: the compiler does not run the reorder-blocks
> > pass, so you get worse code.
>
> This is not an explanation.
Of course it is. If you want a motivation instead, then a good argument is
that this is consistent with how all other options are handled.
'-freorder-blocks'
Reorder basic blocks in the compiled function in order to reduce
number of taken branches and improve code locality.
Enabled at levels '-O', '-O2', '-O3', '-Os'.
If you disable this option, you get more taken branches and a less linear
control flow. As documented.
And not just for duplicating the computed gotos, but in *many* other places.
You *need* to have this pass enabled, to get good code. And almost everyone
always has; this works both ways.
> START - the very first "goto *xxx" - was not optimized, since "bb 5" has
> only 1 predecessor.
> But it's optimized in later step "bbro". That's exactly why option
> "-fno-reorder-blocks" breaks first jump optimization.
>
> Can someone explain why there are such conditions:
> if (single_pred_p (bb))
> return false;
>
> if (single_pred_p (bb))
> continue;
> in maybe_duplicate_computed_goto function?
It duplicates the code, one copy for every predecessor to jump to. It does
not move existing blocks elsewhere.
> One can ask compiler to not reorder
> them with option "-fno-reorder-blocks" - that's enough to fulfil the
> requirements. This option was used in 2004 in QEMU for similar purposes.
It is 15 years later now. If you want a compiler that behaves like GCC did
in 2004, you should use a GCC release from 2004 perhaps?
> So GCC has enough options to structure the machine code in C (and C++)
> language in desired way, there is no need to go into assembler.
That is not how things work.