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

--- Comment #3 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
I think the problem is that validate_subreg etc. has a restriction like:
  /* Subregs involving floating point modes are not allowed to
     change size.  Therefore (subreg:DI (reg:DF) 0) is fine, but
     (subreg:SI (reg:DF) 0) isn't.  */
but lower-subreg.c doesn't take that into account in:
         /* We only try to decompose single word subregs of multi-word
             registers.  When we find one, we return -1 to avoid iterating
             over the inner register.

             ??? This doesn't allow, e.g., DImode subregs of TImode values
             on 32-bit targets.  We would need to record the way the
             pseudo-register was used, and only decompose if all the uses
             were the same number and size of pieces.  Hopefully this
             doesn't happen much.  */

          if (outer_words == 1 && inner_words > 1)
            {
              bitmap_set_bit (decomposable_context, regno);
              iter.skip_subrtxes ();
              continue;
            }
and decompose_register creates concat with a word sized integral pseudos in it.

Reply via email to