> I would first ask why subreg_get_info is being called with ymode ==
> QImode for a hard register which can not hold QImode.  That implies
> that there is a QImode value in the register, which you say is
> invalid.

Are there any ports besides m32c that have registers which can hold HI
(or SI I suppose) but not QI values?

What I've done as a workaround is check for the zero and fail nicely:

Index: rtlanal.c
===================================================================
--- rtlanal.c   (revision 131405)
+++ rtlanal.c   (working copy)
@@ -3135,12 +3135,20 @@ subreg_get_info (unsigned int xregno, en
       else
        info->offset = 0;
       info->nregs = nregs_ymode;
       return;
     }
 
+  if (nregs_ymode == 0)
+    {
+      info->representable_p = false;
+      info->nregs = 1;
+      info->offset = offset;
+      return false;
+    }
+
   /* If registers store different numbers of bits in the different
      modes, we cannot generally form this subreg.  */
   if (!HARD_REGNO_NREGS_HAS_PADDING (xregno, xmode)
       && !HARD_REGNO_NREGS_HAS_PADDING (xregno, ymode)
       && (GET_MODE_SIZE (xmode) % nregs_xmode) == 0
       && (GET_MODE_SIZE (ymode) % nregs_ymode) == 0)

Reply via email to