Handle vectors that don't fit in an integer.
authorAndrew Stubbs <ams@codesourcery.com>
Thu, 15 Nov 2018 17:14:15 +0000 (17:14 +0000)
committerAndrew Stubbs <ams@gcc.gnu.org>
Thu, 15 Nov 2018 17:14:15 +0000 (17:14 +0000)
GCN vector sizes range between 64 and 512 bytes, none of which have
correspondingly sized integer modes.  This breaks a number of assumptions
throughout the compiler, but I don't really want to create modes just for this
purpose.

Instead, this patch fixes up the cases that I've found, so far, such that the
compiler tries something else, or fails to optimize, rather than just ICE.

2018-11-15  Andrew Stubbs  <ams@codesourcery.com>
            Kwok Cheung Yeung  <kcy@codesourcery.com>

gcc/
* tree-vect-stmts.c (vectorizable_store): Don't ICE when
int_mode_for_size fails.
(vectorizable_load): Likewise.

Co-Authored-By: Kwok Cheung Yeung <kcy@codesourcery.com>
From-SVN: r266190

gcc/ChangeLog
gcc/tree-vect-stmts.c

index 45fbfe1a2ec02a91ff4cd2382577ff65cda6c7ec..7b46b67122776672a0766f91afaeffd35739c372 100644 (file)
@@ -1,3 +1,10 @@
+2018-11-15  Andrew Stubbs  <ams@codesourcery.com>
+            Kwok Cheung Yeung  <kcy@codesourcery.com>
+
+       * tree-vect-stmts.c (vectorizable_store): Don't ICE when
+       int_mode_for_size fails.
+       (vectorizable_load): Likewise.
+
 2018-11-15  David Malcolm  <dmalcolm@redhat.com>
 
        * doc/ux.texi (Group logically-related diagnostics): Move
index a67a7f4e34848fba52201d90e31ffe632eb78a0b..764810b9bb692558e71ad08d7bbe5d3347682918 100644 (file)
@@ -6654,12 +6654,12 @@ vectorizable_store (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
                     supported.  */
                  unsigned lsize
                    = group_size * GET_MODE_BITSIZE (elmode);
-                 elmode = int_mode_for_size (lsize, 0).require ();
                  unsigned int lnunits = const_nunits / group_size;
                  /* If we can't construct such a vector fall back to
                     element extracts from the original vector type and
                     element size stores.  */
-                 if (mode_for_vector (elmode, lnunits).exists (&vmode)
+                 if (int_mode_for_size (lsize, 0).exists (&elmode)
+                     && mode_for_vector (elmode, lnunits).exists (&vmode)
                      && VECTOR_MODE_P (vmode)
                      && targetm.vector_mode_supported_p (vmode)
                      && (convert_optab_handler (vec_extract_optab,
@@ -7789,11 +7789,11 @@ vectorizable_load (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
                     to a larger load.  */
                  unsigned lsize
                    = group_size * TYPE_PRECISION (TREE_TYPE (vectype));
-                 elmode = int_mode_for_size (lsize, 0).require ();
                  unsigned int lnunits = const_nunits / group_size;
                  /* If we can't construct such a vector fall back to
                     element loads of the original vector type.  */
-                 if (mode_for_vector (elmode, lnunits).exists (&vmode)
+                 if (int_mode_for_size (lsize, 0).exists (&elmode)
+                     && mode_for_vector (elmode, lnunits).exists (&vmode)
                      && VECTOR_MODE_P (vmode)
                      && targetm.vector_mode_supported_p (vmode)
                      && (convert_optab_handler (vec_init_optab, vmode, elmode)