Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

compiler-gcc.h: remove ancient workaround for gcc PR 58670

The workaround for 'asm goto' miscompilation introduces a compiler barrier
quirk that inhibits many useful compiler optimizations. For example,
__try_cmpxchg_user compiles to:

11375: 41 8b 4d 00 mov 0x0(%r13),%ecx
11379: 41 8b 02 mov (%r10),%eax
1137c: f0 0f b1 0a lock cmpxchg %ecx,(%rdx)
11380: 0f 94 c2 sete %dl
11383: 84 d2 test %dl,%dl
11385: 75 c4 jne 1134b <...>
11387: 41 89 02 mov %eax,(%r10)

where the barrier inhibits flags propagation from asm when compiled with
gcc-12.

When the mentioned quirk is removed, the following code is generated:

11553: 41 8b 4d 00 mov 0x0(%r13),%ecx
11557: 41 8b 02 mov (%r10),%eax
1155a: f0 0f b1 0a lock cmpxchg %ecx,(%rdx)
1155e: 74 c9 je 11529 <...>
11560: 41 89 02 mov %eax,(%r10)

The refered compiler bug:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670

was fixed for gcc-4.8.2.

Current minimum required version of GCC is version 5.1 which has the above
'asm goto' miscompilation fixed, so remove the workaround.

Link: https://lkml.kernel.org/r/20220624141412.72274-1-ubizjak@gmail.com
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: "H. Peter Anvin" <hpa@zytor.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>

authored by

Uros Bizjak and committed by
akpm
43c249ea 86e5908e

-11
-11
include/linux/compiler-gcc.h
··· 66 66 __builtin_unreachable(); \ 67 67 } while (0) 68 68 69 - /* 70 - * GCC 'asm goto' miscompiles certain code sequences: 71 - * 72 - * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58670 73 - * 74 - * Work it around via a compiler barrier quirk suggested by Jakub Jelinek. 75 - * 76 - * (asm goto is automatically volatile - the naming reflects this.) 77 - */ 78 - #define asm_volatile_goto(x...) do { asm goto(x); asm (""); } while (0) 79 - 80 69 #if defined(CONFIG_ARCH_USE_BUILTIN_BSWAP) 81 70 #define __HAVE_BUILTIN_BSWAP32__ 82 71 #define __HAVE_BUILTIN_BSWAP64__