https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91814

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Uroš Bizjak from comment #3)
> (In reply to Richard Biener from comment #2)
> > ISTR discussing this but holding back a fix at the time we weren't sure if
> > we'd preserve the non-subreg sets.  So sth like 
> > 
> > Index: gcc/config/i386/i386-features.c
> > ===================================================================
> > --- gcc/config/i386/i386-features.c     (revision 275698)
> > +++ gcc/config/i386/i386-features.c     (working copy)
> > @@ -668,6 +668,8 @@ scalar_chain::emit_conversion_insns (rtx
> >  static rtx
> >  gen_gpr_to_xmm_move_src (enum machine_mode vmode, rtx gpr)
> >  {
> > +  if (!x86_64_general_operand (gpr, GET_MODE_INNER (vmode)))
> > +    gpr = force_reg (GET_MODE_INNER (vmode), gpr);
> >    switch (GET_MODE_NUNITS (vmode))
> >      {
> >      case 1:
> > 
> > fixes it with the question whether the use of x86_64_general_operand
> > is correct and whether it's necessary for the NUNITS == 1 case
> > (which IIRC isn't exercised anyway).

Tested the above successfully.

> We should use nonimmediate_operand for NUNITS != 1. Perhaps also add
> gcc_unreachable () for NUNITS == 1 case.

OK, will test the following which works on the testcase as well

Index: gcc/config/i386/i386-features.c
===================================================================
--- gcc/config/i386/i386-features.c     (revision 275959)
+++ gcc/config/i386/i386-features.c     (working copy)
@@ -668,10 +668,13 @@ scalar_chain::emit_conversion_insns (rtx
 static rtx
 gen_gpr_to_xmm_move_src (enum machine_mode vmode, rtx gpr)
 {
+  if (!nonimmediate_operand (gpr, GET_MODE_INNER (vmode)))
+    gpr = force_reg (GET_MODE_INNER (vmode), gpr);
   switch (GET_MODE_NUNITS (vmode))
     {
     case 1:
-      return gen_rtx_SUBREG (vmode, gpr, 0);
+      /* We are not using this case currently.  */
+      gcc_unreachable ();
     case 2:
       return gen_rtx_VEC_CONCAT (vmode, gpr,
                                 CONST0_RTX (GET_MODE_INNER (vmode)));

Reply via email to