On Thu, 15 Feb 2024 at 10:25, Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > On Thu, 15 Feb 2024 at 00:39, Jakub Jelinek <jakub@xxxxxxxxxx> wrote: > > > > Can it be guarded with > > #if GCC_VERSION < 140100 > > Ack. I'll update the workaround to do that, and add the new and > improved bugzilla pointer. .. and I also followed your suggestion to just consider any gcc-14 snapshots as fixed. That seemed safe, considering that in practice the actual bug that Sean reported seems to not actually trigger with any gcc version 12.1+ as per your bisect (and my minimal testing). HOWEVER, when I was working through this, I noted that the *other* part of the workaround (the "missing volatile") doesn't seem to have been backported as aggressively. IOW, I find that "Mark asm goto with outputs as volatile" in the gcc-12 and gcc-13 branches, but not in gcc-11. So I did end up making the default "asm_goto_output()" macro always use "asm volatile goto()", so that we don't have to worry about the other gcc issue. End result: the extra empty asm barrier is now dependent on gcc version in my tree, but the manual addition of 'volatile' is unconditional. Because it looks to me like gcc-11.5 will have your fix for the pseudo ordering, but not Andrew Pinski's fix for missing a volatile. Anyway, since the version dependencies were complex enough, I ended up going with putting that logic in our Kconfig files, rather than making the gcc-specific header file an ugly mess of #if's. Our Kconfig files are pretty much designed for having complicated configuration dependencies, so it ends up being quite natural there: config GCC_ASM_GOTO_OUTPUT_WORKAROUND bool depends on CC_IS_GCC && CC_HAS_ASM_GOTO_OUTPUT # Fixed in GCC 14.1, 13.3, 12.4 and 11.5 # https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113921 default y if GCC_VERSION < 110500 default y if GCC_VERSION >= 120000 && GCC_VERSION < 120400 default y if GCC_VERSION >= 130000 && GCC_VERSION < 130300 and having those kinds of horrid expressions as preprocessor code included in every single compilation unit seemed just nasty. Linus