> -----Original Message-----
> From: H.J. Lu <[email protected]>
> Sent: Wednesday, March 11, 2026 11:57 AM
> To: Hongtao Liu <[email protected]>
> Cc: GCC Patches <[email protected]>; Uros Bizjak
> <[email protected]>; Liu, Hongtao <[email protected]>; Jakub Jelinek
> <[email protected]>
> Subject: [PATCH v5] x86: Handle non-int load with integer constant
> 
> On Tue, Mar 10, 2026 at 5:51 PM Hongtao Liu <[email protected]> wrote:
> >
> > On Wed, Mar 11, 2026 at 3:48 AM H.J. Lu <[email protected]> wrote:
> > >
> > > 1. For non-int load with zero integer constant, generate:
> > >
> > > (set (reg/v:SF 126 [ f ])
> > >      (const_double:SF 0.0 [0x0.0p+0]))
> > >
> > > instead of
> > >
> > > (set (reg/v:SF 126 [ f ])
> > >      (const_int 0 [0]))
> > >
> > > 2. For non-int load with non-zero integer constant, generate:
> > >
> > > (set (subreg:SI (reg/v:SF 105 [ f ]) 0)
> > >      (const_int 1313486336 [0x4e4a3600]))
> > >
> > > instead of
> > >
> > > (set (reg/v:SF 105 [ f ])
> > >      (const_int 1313486336 [0x4e4a3600]))
> > >
> > > gcc/
> > >
> > >         PR target/124407
> > >         * config/i386/i386-features.cc (ix86_place_single_vector_set):
> > >         Handle non-int load with integer constant.
> > >         (ix86_broadcast_inner): Convert const0_rtx to non-int mode.
> > >
> > > gcc/testsuite/
> > >
> > >         PR target/124407
> > >         * gcc.target/i386/pr124407-1.c: New test.
> > >         * gcc.target/i386/pr124407-2.c: Likewise.
> > >
> > > Signed-off-by: H.J. Lu <[email protected]>
> > > ---
> > >  gcc/config/i386/i386-features.cc           | 33 +++++++++++++++++++---
> > >  gcc/testsuite/gcc.target/i386/pr124407-1.c | 17 +++++++++++
> > > gcc/testsuite/gcc.target/i386/pr124407-2.c | 12 ++++++++
> > >  3 files changed, 58 insertions(+), 4 deletions(-)  create mode
> > > 100644 gcc/testsuite/gcc.target/i386/pr124407-1.c
> > >  create mode 100644 gcc/testsuite/gcc.target/i386/pr124407-2.c
> > >
> > > diff --git a/gcc/config/i386/i386-features.cc
> > > b/gcc/config/i386/i386-features.cc
> > > index 0e4fdcd2853..49fc32d9240 100644
> > > --- a/gcc/config/i386/i386-features.cc
> > > +++ b/gcc/config/i386/i386-features.cc
> > > @@ -3331,9 +3331,25 @@ ix86_place_single_vector_set (rtx dest, rtx src,
> bitmap bbs,
> > >        rtx inner_scalar = load->val;
> > >        /* Set the source in (vec_duplicate:V4SI (reg:SI 99)).  */
> > >        rtx reg = XEXP (src, 0);
> > > -      if ((REG_P (inner_scalar) || MEM_P (inner_scalar))
> > > -         && GET_MODE (reg) != GET_MODE (inner_scalar))
> > > -       inner_scalar = gen_rtx_SUBREG (GET_MODE (reg), inner_scalar, 0);
> > > +      machine_mode reg_mode = GET_MODE (reg);
> > > +      if (reg_mode != GET_MODE (inner_scalar))
> > > +       {
> > > +         if (REG_P (inner_scalar) || MEM_P (inner_scalar))
> > > +           inner_scalar = gen_rtx_SUBREG (reg_mode, inner_scalar, 0);
> > > +         else if (!SCALAR_INT_MODE_P (reg_mode))
> > > +           {
> > > +             /* For non-int load with integer constant, generate
> > > +
> > > +                (set (subreg:SI (reg/v:SF 105 [ f ]) 0)
> > > +                     (const_int 1313486336 [0x4e4a3600]))
> > > +
> > > +              */
> > > +             gcc_assert (CONST_INT_P (inner_scalar));
> > > +             unsigned int bits = GET_MODE_BITSIZE (reg_mode);
> > > +             machine_mode mode = int_mode_for_size (bits, 0).require ();
> > > +             reg = gen_rtx_SUBREG (mode, reg, 0);
> > > +           }
> > > +       }
> > >        rtx set = gen_rtx_SET (reg, inner_scalar);
> > >        insn = emit_insn_before (set, set_insn);
> > >        if (dump_file)
> > > @@ -3769,6 +3785,13 @@ ix86_broadcast_inner (rtx op, machine_mode
> mode,
> > >      {
> > >        /* Handle sequences like
> > >
> > > +        (set (subreg:SI (reg/v:SF 105 [ f ]) 0)
> > > +             (const_int 0 [0]))
> > > +        (set (reg:V4SF 110)
> > > +             (vec_duplicate:V4SF (reg/v:SF 105 [ f ])))
> > > +
> > > +        and
> > > +
> > >          (set (reg:SI 99)
> > >                (const_int 34 [0x22]))
> > >          (set (reg:V4SI 98)
> > > @@ -3777,7 +3800,9 @@ 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))
> > > +      if (op == const0_rtx && !SCALAR_INT_MODE_P (mode))
> > > +       op = CONST0_RTX (mode);
> > > +      else if (mode != GET_MODE (reg))
> > should be
> >
> >    else if (mode != GET_MODE (reg) && SCALAR_INT_MODE_P (mode))?
> 
> How about
> 
>       if (SCALAR_INT_MODE_P (mode))
>         {
>           if (mode != GET_MODE (reg))
>             op = gen_int_mode (INTVAL (src), mode);
>         }
>       else if (op == const0_rtx)
>         op = CONST0_RTX (mode);
> 
Ok.
> in the enclosed v5 patch?
> 
> >
> > Others LGTM.
> > >         op = gen_int_mode (INTVAL (src), mode);
> > >        *insn_p = nullptr;
> > >      }
> >
> 
> 
> 
> --
> H.J.

Reply via email to