Prevent aborts taking a vector mode subreg of a constant integer
authorBernd Schmidt <bernds@redhat.com>
Thu, 18 Apr 2002 11:29:19 +0000 (11:29 +0000)
committerBernd Schmidt <bernds@gcc.gnu.org>
Thu, 18 Apr 2002 11:29:19 +0000 (11:29 +0000)
From-SVN: r52467

gcc/ChangeLog
gcc/combine.c

index 9d19693c27f9b5374fd0e5cffab88e1b8a6d6589..799f4c87a7dd1b60cbfc36fb9072e33f88ac9517 100644 (file)
@@ -4,6 +4,10 @@
        (handle_vector_size_attribute): Use it to avoid generating a
        new type node each time we are called.
 
+       * combine.c (subst): Avoid trying to make a vector mode subreg of
+       an integer constant.
+       (gen_lowpart_for_combine): Likewise.
+                       
 2002-04-18  Roger Sayle  <roger@eyesopen.com>
            Jakub Jelinek  <jakub@redhat.com>
 
index e051c618636830b4ab05e440964559c64901216f..67f62908e5333ba05ccfa4ba327bbb746931c38c 100644 (file)
@@ -3538,6 +3538,9 @@ subst (x, from, to, in_dest, unique_copy)
 
              if (GET_CODE (new) == CONST_INT && GET_CODE (x) == SUBREG)
                {
+                 if (VECTOR_MODE_P (GET_MODE (x)))
+                   return gen_rtx_CLOBBER (VOIDmode, const0_rtx);
+
                  x = simplify_subreg (GET_MODE (x), new,
                                       GET_MODE (SUBREG_REG (x)),
                                       SUBREG_BYTE (x));
@@ -9800,6 +9803,12 @@ gen_lowpart_for_combine (mode, x)
            || GET_MODE_SIZE (GET_MODE (x)) == GET_MODE_SIZE (mode)))
     return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
 
+  /* simplify_gen_subreg does not know how to handle the case where we try
+     to convert an integer constant to a vector.
+     ??? We could try to teach it to generate CONST_VECTORs.  */
+  if (GET_MODE (x) == VOIDmode && VECTOR_MODE_P (mode))
+    return gen_rtx_CLOBBER (GET_MODE (x), const0_rtx);
+
   /* X might be a paradoxical (subreg (mem)).  In that case, gen_lowpart
      won't know what to do.  So we will strip off the SUBREG here and
      process normally.  */