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.