Limit mask of vec_merge to HOST_BITS_PER_WIDE_INT
authorH.J. Lu <hongjiu.lu@intel.com>
Thu, 18 Oct 2018 21:29:55 +0000 (21:29 +0000)
committerH.J. Lu <hjl@gcc.gnu.org>
Thu, 18 Oct 2018 21:29:55 +0000 (14:29 -0700)
Since mask of vec_merge is in HOST_WIDE_INT, HOST_BITS_PER_WIDE_INT is
the maximum number of vector elements.

* simplify-rtx.c (simplify_subreg): Limit mask of vec_merge to
HOST_BITS_PER_WIDE_INT.
(test_vector_ops_duplicate): Likewise.

From-SVN: r265290

gcc/ChangeLog
gcc/simplify-rtx.c

index e36ecd20e665d4ef9d1076c41fe12b9dda3529e3..7c5f9dd4814789dfdccc49ce2da89636bd8b6fff 100644 (file)
@@ -1,3 +1,9 @@
+2018-10-18  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * simplify-rtx.c (simplify_subreg): Limit mask of vec_merge to
+       HOST_BITS_PER_WIDE_INT.
+       (test_vector_ops_duplicate): Likewise.
+
 2018-10-18  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR target/72782
index ccf92166356597fd43e9c85d333a83f4c4e40688..2ff68ceb4e335d5b4fb257da3ae7553c0eb29aed 100644 (file)
@@ -6611,6 +6611,7 @@ simplify_subreg (machine_mode outermode, rtx op,
    */
   unsigned int idx;
   if (constant_multiple_p (byte, GET_MODE_SIZE (outermode), &idx)
+      && idx < HOST_BITS_PER_WIDE_INT
       && GET_CODE (op) == VEC_MERGE
       && GET_MODE_INNER (innermode) == outermode
       && CONST_INT_P (XEXP (op, 2))
@@ -6861,6 +6862,8 @@ test_vector_ops_duplicate (machine_mode mode, rtx scalar_reg)
       rtx vector_reg = make_test_reg (mode);
       for (unsigned HOST_WIDE_INT i = 0; i < const_nunits; i++)
        {
+         if (i >= HOST_BITS_PER_WIDE_INT)
+           break;
          rtx mask = GEN_INT ((HOST_WIDE_INT_1U << i) | (i + 1));
          rtx vm = gen_rtx_VEC_MERGE (mode, duplicate, vector_reg, mask);
          poly_uint64 offset = i * GET_MODE_SIZE (inner_mode);