https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116353
--- Comment #7 from Christoph Müllner <cmuellner at gcc dot gnu.org> --- > To add on to the info provided by Manolis, this is the diff for the proposed > fix: > > diff --git a/gcc/ifcvt.cc b/gcc/ifcvt.cc > index 3e25f30b67e..da59c907891 100644 > --- a/gcc/ifcvt.cc > +++ b/gcc/ifcvt.cc > @@ -3938,8 +3938,10 @@ bb_ok_for_noce_convert_multiple_sets (basic_block > test_bb, unsigned *cost) > rtx src = SET_SRC (set); > > /* Do not handle anything involving memory loads/stores since it might > - violate data-race-freedom guarantees. */ > - if (!REG_P (dest) || contains_mem_rtx_p (src)) > + violate data-race-freedom guarantees. Make sure we can force SRC > + to a register as that may be needed in try_emit_cmove_seq. */ > + if (!REG_P (dest) || contains_mem_rtx_p (src) > + || !noce_can_force_operand (src)) > return false; > > /* Destination and source must be appropriate. */ I've successfully bootstrapped the proposed change on top of master with `--enable-languages=c,c++,fortran,objc,obj-c++,ada,go,d,lto` on x86-64 and aarch64. So the change is: Tested-by: Christoph Müllner <christoph.muell...@vrull.eu>