]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
SVE fallout from PR90006
authorRichard Sandiford <richard.sandiford@arm.com>
Tue, 9 Apr 2019 07:50:51 +0000 (07:50 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Tue, 9 Apr 2019 07:50:51 +0000 (07:50 +0000)
2019-04-08  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* tree-vect-data-refs.c (vect_get_smallest_scalar_type): Always
use gimple_expr_type for load and store calls.  Skip over the
condition argument in a conditional internal function.
Protect use of TREE_INT_CST_LOW.

From-SVN: r270222

gcc/ChangeLog
gcc/tree-vect-data-refs.c

index c951ce8429871e77724df4a7c12df1e00fef3038..f1d18b963771fc0418f5ea435650deb594735ec4 100644 (file)
@@ -1,3 +1,10 @@
+2019-04-09  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * tree-vect-data-refs.c (vect_get_smallest_scalar_type): Always
+       use gimple_expr_type for load and store calls.  Skip over the
+       condition argument in a conditional internal function.
+       Protect use of TREE_INT_CST_LOW.
+
 2019-04-09  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/90015
index 8f185c99dad58defb584cf9351157f2441e178b8..271cb584a6d558ff7f6761fdd84ba428b3df6228 100644 (file)
@@ -145,14 +145,29 @@ vect_get_smallest_scalar_type (stmt_vec_info stmt_info,
       if (rhs < lhs)
         scalar_type = rhs_type;
     }
-  else if (is_gimple_call (stmt_info->stmt)
-          && gimple_call_num_args (stmt_info->stmt) > 0)
+  else if (gcall *call = dyn_cast <gcall *> (stmt_info->stmt))
     {
-      tree rhs_type = TREE_TYPE (gimple_call_arg (stmt_info->stmt, 0));
-
-      rhs = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (rhs_type));
-      if (rhs < lhs)
-        scalar_type = rhs_type;
+      unsigned int i = 0;
+      if (gimple_call_internal_p (call))
+       {
+         internal_fn ifn = gimple_call_internal_fn (call);
+         if (internal_load_fn_p (ifn) || internal_store_fn_p (ifn))
+           /* gimple_expr_type already picked the type of the loaded
+              or stored data.  */
+           i = ~0U;
+         else if (internal_fn_mask_index (ifn) == 0)
+           i = 1;
+       }
+      if (i < gimple_call_num_args (call))
+       {
+         tree rhs_type = TREE_TYPE (gimple_call_arg (call, i));
+         if (tree_fits_uhwi_p (TYPE_SIZE_UNIT (rhs_type)))
+           {
+             rhs = TREE_INT_CST_LOW (TYPE_SIZE_UNIT (rhs_type));
+             if (rhs < lhs)
+               scalar_type = rhs_type;
+           }
+       }
     }
 
   *lhs_size_unit = lhs;