[committed] i386: Use lock prefixed insn instead of MFENCE [PR95750]
Franz Sirl
Franz.Sirl-kernel@lauterbach.com
Tue Jul 21 15:46:35 GMT 2020
Am 2020-07-20 um 20:39 schrieb Uros Bizjak via Gcc-patches:
> Currently, __atomic_thread_fence(seq_cst) on x86 and x86-64 generates
> mfence instruction. A dummy atomic instruction (a lock-prefixed instruction
> or xchg with a memory operand) would provide the same sequential consistency
> guarantees while being more efficient on most current CPUs. The mfence
> instruction additionally orders non-temporal stores, which is not relevant
> for atomic operations and are not ordered by seq_cst atomic operations anyway.
>
> 2020-07-20 Uroš Bizjak <ubizjak@gmail.com>
>
> gcc/ChangeLog:
> PR target/95750
> * config/i386/i386.h (TARGET_AVOID_MFENCE):
> Rename from TARGET_USE_XCHG_FOR_ATOMIC_STORE.
> * config/i386/sync.md (mfence_sse2): Disable for TARGET_AVOID_MFENCE.
> (mfence_nosse): Enable also for TARGET_AVOID_MFENCE. Emit stack
> referred memory in word_mode.
> (mem_thread_fence): Do not generate mfence_sse2 pattern when
> TARGET_AVOID_MFENCE is true.
> (atomic_store<mode>): Update for rename.
> * config/i386/x86-tune.def (X86_TUNE_AVOID_MFENCE):
> Rename from X86_TUNE_USE_XCHG_FOR_ATOMIC_STORE.
>
> gcc/testsuite/ChangeLog:
> PR target/95750
> * gcc.target/i386/pr95750.c: New test.
>
> Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.
>
> Uros.
>
Hi,
I didn't bisect it, but I see a profiledbootstrap ICE that may be related:
libtool: compile:
/home/fsirl/rpmbuild/BUILD/gcc-11.0.0+gitr11+2246/obj-x86_64-suse-linux/./gcc/xgcc
-B/home/fsirl/rpmbuild/BUILD/gcc-11.0.0+gitr11+2246/obj-x86_64-suse-linux/./gcc/
-B/usr/x86_64-su
se-linux/bin/ -B/usr/x86_64-suse-linux/lib/ -isystem
/usr/x86_64-suse-linux/include -isystem
/usr/x86_64-suse-linux/sys-include -m32 -DHAVE_CONFIG_H -I.
-I../../../../libgo -I ../../../../libgo/runti
me -I../../../../libgo/../libffi/include -I../libffi/include -pthread
-L../libatomic/.libs -fexceptions -fnon-call-exceptions -fsplit-stack
-Wall -Wextra -Wwrite-strings -Wcast-qual -minline-all-stri
ngops -D_GNU_SOURCE -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I
../../../../libgo/../libgcc -I ../../../../libgo/../libbacktrace -I
../../../gcc/include -O2 -g -fmessage-length=0 -D_FORTIFY_SOURCE=
2 -funwind-tables -fasynchronous-unwind-tables -U_FORTIFY_SOURCE -m32
-MT runtime/runtime_c.lo -MD -MP -MF runtime/.deps/runtime_c.Tpo -c
../../../../libgo/runtime/runtime_c.c -fPIC -DPIC -o runtime
/.libs/runtime_c.o
../../../../libgo/runtime/runtime_c.c: In function ?runtime_cputicks?:
../../../../libgo/runtime/runtime_c.c:102:1: error: unrecognizable insn:
102 | }
| ^
(insn 20 19 21 6 (set (mem/v:BLK (scratch:SI) [0 A8])
(unspec:BLK [
(mem/v:BLK (scratch:SI) [0 A8])
] UNSPEC_MFENCE))
"../../../../libgo/runtime/runtime_c.c":84:7 -1
(nil))
during RTL pass: vregs
../../../../libgo/runtime/runtime_c.c:102:1: internal compiler error: in
extract_insn, at recog.c:2294
This is on a Xeon X5650 machine.
Franz
More information about the Gcc-patches
mailing list