[rs6000] Fix PR92566 by checking VECTOR_UNIT_NONE_P
authorKewen Lin <linkw@gcc.gnu.org>
Thu, 28 Nov 2019 06:34:31 +0000 (06:34 +0000)
committerKewen Lin <linkw@gcc.gnu.org>
Thu, 28 Nov 2019 06:34:31 +0000 (06:34 +0000)
As Segher pointed out in PR92566, we shouldn't offer some vector modes which
aren't supported under current setting.  This patch is to make it check by
VECTOR_UNIT_NONE_P which is initialized as current architecture masks.

2019-11-28  Kewen Lin  <linkw@gcc.gnu.org>

    PR target/92566
    * gcc/config/rs6000/rs6000.c (rs6000_preferred_simd_mode): Check by
    VECTOR_UNIT_NONE_P instead.

From-SVN: r278800

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index 3061b9e76003dcfb5c183c2c88c9d20861c8c2f3..7c7ff3f03004ca6f2d54533809351e5bd3f9b9ea 100644 (file)
@@ -1,3 +1,9 @@
+2019-11-28  Kewen Lin  <linkw@gcc.gnu.org>
+
+       PR target/92566
+       * gcc/config/rs6000/rs6000.c (rs6000_preferred_simd_mode): Check
+       by VECTOR_UNIT_NONE_P instead.
+
 2019-11-28  Hongtao Liu  <hongtao.liu@inte.com>
 
        * gcc/config/i386/sse.md (avx512f_maskcmp<mode>3):
index 2995348f3ce2d0d0bde6a8b58d20f264380fa4b9..3c22f64c139d00f841d9e8de9ae5bb323d19398d 100644 (file)
@@ -4915,30 +4915,11 @@ rs6000_builtin_vectorization_cost (enum vect_cost_for_stmt type_of_cost,
 static machine_mode
 rs6000_preferred_simd_mode (scalar_mode mode)
 {
-  if (TARGET_VSX)
-    switch (mode)
-      {
-      case E_DFmode:
-       return V2DFmode;
-      default:;
-      }
-  if (TARGET_ALTIVEC || TARGET_VSX)
-    switch (mode)
-      {
-      case E_SFmode:
-       return V4SFmode;
-      case E_TImode:
-       return V1TImode;
-      case E_DImode:
-       return V2DImode;
-      case E_SImode:
-       return V4SImode;
-      case E_HImode:
-       return V8HImode;
-      case E_QImode:
-       return V16QImode;
-      default:;
-      }
+  opt_machine_mode vmode = mode_for_vector (mode, 16 / GET_MODE_SIZE (mode));
+
+  if (vmode.exists () && !VECTOR_UNIT_NONE_P (vmode.require ()))
+    return vmode.require ();
+
   return word_mode;
 }