Commit 1ec7f492 by Andrew Stubbs Committed by Andrew Stubbs

Handle vectors that don't fit in an integer.

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
parent 2bd652d2
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> 2018-11-15 David Malcolm <dmalcolm@redhat.com>
* doc/ux.texi (Group logically-related diagnostics): Move * doc/ux.texi (Group logically-related diagnostics): Move
...@@ -6654,12 +6654,12 @@ vectorizable_store (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi, ...@@ -6654,12 +6654,12 @@ vectorizable_store (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
supported. */ supported. */
unsigned lsize unsigned lsize
= group_size * GET_MODE_BITSIZE (elmode); = group_size * GET_MODE_BITSIZE (elmode);
elmode = int_mode_for_size (lsize, 0).require ();
unsigned int lnunits = const_nunits / group_size; unsigned int lnunits = const_nunits / group_size;
/* If we can't construct such a vector fall back to /* If we can't construct such a vector fall back to
element extracts from the original vector type and element extracts from the original vector type and
element size stores. */ 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) && VECTOR_MODE_P (vmode)
&& targetm.vector_mode_supported_p (vmode) && targetm.vector_mode_supported_p (vmode)
&& (convert_optab_handler (vec_extract_optab, && (convert_optab_handler (vec_extract_optab,
...@@ -7789,11 +7789,11 @@ vectorizable_load (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi, ...@@ -7789,11 +7789,11 @@ vectorizable_load (stmt_vec_info stmt_info, gimple_stmt_iterator *gsi,
to a larger load. */ to a larger load. */
unsigned lsize unsigned lsize
= group_size * TYPE_PRECISION (TREE_TYPE (vectype)); = group_size * TYPE_PRECISION (TREE_TYPE (vectype));
elmode = int_mode_for_size (lsize, 0).require ();
unsigned int lnunits = const_nunits / group_size; unsigned int lnunits = const_nunits / group_size;
/* If we can't construct such a vector fall back to /* If we can't construct such a vector fall back to
element loads of the original vector type. */ 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) && VECTOR_MODE_P (vmode)
&& targetm.vector_mode_supported_p (vmode) && targetm.vector_mode_supported_p (vmode)
&& (convert_optab_handler (vec_init_optab, vmode, elmode) && (convert_optab_handler (vec_init_optab, vmode, elmode)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment