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.

Reply via email to