> -----Original Message-----
> From: H.J. Lu <hjl.to...@gmail.com>
> Sent: Tuesday, August 12, 2025 8:19 PM
> To: gcc-patches@gcc.gnu.org
> Cc: ubiz...@gmail.com; Liu, Hongtao <hongtao....@intel.com>
> Subject: [PATCH v2] x86: Convert integer constant to mode of move
> 
> For
> 
> (set (reg/v:DI 106 [ k ])
>      (const_int 3000000000 [0xb2d05e00])) ...
> (set (reg:V4SI 115 [ _13 ])
>      (vec_duplicate:V4SI (subreg:SI (reg/v:DI 106 [ k ]) 0))) ...
> (set (reg:V2SI 118 [ _9 ])
>      (vec_duplicate:V2SI (subreg:SI (reg/v:DI 106 [ k ]) 0)))
> 
> we should generate
> 
> (set (reg:SI 125)
>      (const_int -1294967296 [0xffffffffb2d05e00])) (set (reg:V4SI 124)
>      (vec_duplicate:V4SI (reg:VSI 125))
> ...
> (set (reg:V4SI 115 [ _13 ])
>      (reg:V4SI 124)
> ...
> (set (reg:V2SI 118 [ _9 ])
>      (subreg:V2SI (reg:V4SI 124))
> 
> by converting integer constant to mode of move.

Ok. 
> 
> gcc/
> 
>       PR target/121497
>       * config/i386/i386-features.cc (ix86_broadcast_inner): Convert
>       integer constant to mode of move
> 
> gcc/testsuite/
> 
>       PR target/121497
>       * gcc.target/i386/pr121497.c: New test.
> 
> Co-authored-by: Liu, Hongtao <hongtao....@intel.com>
> Signed-off-by: H.J. Lu <hjl.to...@gmail.com>
> ---
>  gcc/config/i386/i386-features.cc         |  2 ++
>  gcc/testsuite/gcc.target/i386/pr121497.c | 18 ++++++++++++++++++
>  2 files changed, 20 insertions(+)
>  create mode 100644 gcc/testsuite/gcc.target/i386/pr121497.c
> 
> diff --git a/gcc/config/i386/i386-features.cc b/gcc/config/i386/i386-
> features.cc
> index 9941e61361c..b4aa5fa1de7 100644
> --- a/gcc/config/i386/i386-features.cc
> +++ b/gcc/config/i386/i386-features.cc
> @@ -3639,6 +3639,8 @@ ix86_broadcast_inner (rtx op, machine_mode
> mode,
>        Set *INSN_P to nullptr and return SET_SRC if SET_SRC is an
>        integer constant.  */
>        op = src;
> +      if (mode != GET_MODE (reg))
> +     op = gen_int_mode (INTVAL (src), mode);
>        *insn_p = nullptr;
>      }
>    else
> diff --git a/gcc/testsuite/gcc.target/i386/pr121497.c
> b/gcc/testsuite/gcc.target/i386/pr121497.c
> new file mode 100644
> index 00000000000..ce55f9558f0
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/pr121497.c
> @@ -0,0 +1,18 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O3 -msse2 -w" } */
> +
> +extern void a(int *);
> +int q;
> +void b(int c, int d, int e, int f, int g, int h) {
> +  int t[] = {c, d, e, f, g, h};
> +  a(t);
> +}
> +int main() {
> +  int k[2], i = 0, *p();
> +  if (q) {
> +    for (; (int)p + i < 2; i++)
> +      k[i] = -1294967296;
> +    b(k[0] + 7, k[0] + 9, k[0] + 6, k[0] + 9, k[0] + 9, k[0] + 6);
> +  }
> +  return 0;
> +}
> --
> 2.50.1

Reply via email to