https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113280
--- Comment #8 from David Brown <david at westcontrol dot com> ---
(In reply to Segher Boessenkool from comment #4)
> Nothing has changed here.
>
> opt == 2 and opt == 3 should use "=X", not "+X", btw.
>
I realise (since you told me - thanks) that
asm ("" : "+X" (x))
and
asm ("" : "=X" (x) : "0" (x))
are the same. However, it seems that
asm ("" : "+X" (x) : "0" (x))
is different. If I change "opt == 2" to use "=X", then it acts exactly like
the "opt == 1" version (as expected), but having "+X" in "opt == 2" gives
different results. I don't know /why/ this seems to be treated differently,
since it is just repeating the input in the same target, but it is.
As for using "=X" in the "opt == 3" case, I worry that that could lead to
errors as the two assembly lines are independent. The first says "put X
anywhere", and the second - if it had "=X" - says "take X from anywhere".
These don't have to be the same "anywhere" unless the input and output are in
the same statement - and if the compiler picked different anywheres, the code
would not work.