https://gcc.gnu.org/bugzilla/show_bug.cgi?id=111010
--- Comment #8 from ro at CeBiTec dot Uni-Bielefeld.DE <ro at CeBiTec dot Uni-Bielefeld.DE> --- > --- Comment #7 from Richard Biener <rguenth at gcc dot gnu.org> --- > > diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md > index f3a3305ac4f..d38b9d764d8 100644 > --- a/gcc/config/i386/i386.md > +++ b/gcc/config/i386/i386.md > @@ -11511,7 +11511,7 @@ > }) > > (define_insn_and_split "*concat<mode><dwi>3_3" > - [(set (match_operand:<DWI> 0 "nonimmediate_operand" "=ro,r,r,&r") > + [(set (match_operand:<DWI> 0 "nonimmediate_operand" "=ro,r,r,!&r") > (any_or_plus:<DWI> > (ashift:<DWI> > (zero_extend:<DWI> > > fixes the issue for me, this disparages the &r,m,m alternative since > that makes any reloading difficult(?) and the early-clobber output > makes register pressure even harder to deal with. On the gcc-13 branch, it does indeed, both for the reduced testcase and the original one. I've also successfully regtested the patch just in case. On trunk, the situation is different, however: even without the patch, the reduced testcase works while the full one fails. With the patch (adjusted to apply to "*concat<mode><dwi>3_4", unless I'm mistaken here), the situation stays the same: ok for the reduced testcase, failure for the original one.