re PR target/92723 (ICE in expand_shift_1, at expmed.c:2635)
authorJakub Jelinek <jakub@redhat.com>
Wed, 11 Dec 2019 23:49:30 +0000 (00:49 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 11 Dec 2019 23:49:30 +0000 (00:49 +0100)
PR target/92723
* tree-vect-patterns.c (vect_recog_rotate_pattern): If dt is not
vect_internal_def, use oprnd1 as is, without trying to cast it.
Formatting fix.

* gcc.dg/vect/pr92723.c: New test.

From-SVN: r279265

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/vect/pr92723.c [new file with mode: 0644]
gcc/tree-vect-patterns.c

index 88abb6d5ef3fc299f581da318b4a40e288052419..4be2b9681c896d4fa6dc53645d3cf07d4e9d333e 100644 (file)
@@ -1,3 +1,10 @@
+2019-12-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/92723
+       * tree-vect-patterns.c (vect_recog_rotate_pattern): If dt is not
+       vect_internal_def, use oprnd1 as is, without trying to cast it.
+       Formatting fix.
+
 2019-12-11  Martin Sebor  <msebor@redhat.com>
 
        * builtins.c (compute_objsize): Add an argument and set it to offset
index 485659228159dc87a082a469e8bb07c2a61f13ba..8488ae942cd1aafd3432d8c0a2df15e0626d501c 100644 (file)
@@ -1,3 +1,8 @@
+2019-12-11  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/92723
+       * gcc.dg/vect/pr92723.c: New test.
+
 2019-12-11 Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/92897
diff --git a/gcc/testsuite/gcc.dg/vect/pr92723.c b/gcc/testsuite/gcc.dg/vect/pr92723.c
new file mode 100644 (file)
index 0000000..0d60883
--- /dev/null
@@ -0,0 +1,9 @@
+/* { dg-do compile } */
+
+void
+foo (unsigned long long *x, unsigned long long *y, int z)
+{
+  int i;
+  for (i = 0; i < 1024; i++)
+    x[i] = (y[i] >> z) | (y[i] << (-z & (__SIZEOF_LONG_LONG__ * __CHAR_BIT__ - 1)));
+}
index c9ad9e0eb9455901120c82917f08843eb21d9e73..ae41cbe5941b2ad4b1a9695719703d31d287627a 100644 (file)
@@ -2432,14 +2432,12 @@ vect_recog_rotate_pattern (stmt_vec_info stmt_vinfo, tree *type_out)
       oprnd0 = def;
     }
 
-  if (dt == vect_external_def
-      && TREE_CODE (oprnd1) == SSA_NAME)
+  if (dt == vect_external_def && TREE_CODE (oprnd1) == SSA_NAME)
     ext_def = vect_get_external_def_edge (vinfo, oprnd1);
 
   def = NULL_TREE;
   scalar_int_mode mode = SCALAR_INT_TYPE_MODE (type);
-  if (TREE_CODE (oprnd1) == INTEGER_CST
-      || TYPE_MODE (TREE_TYPE (oprnd1)) == mode)
+  if (dt != vect_internal_def || TYPE_MODE (TREE_TYPE (oprnd1)) == mode)
     def = oprnd1;
   else if (def_stmt && gimple_assign_cast_p (def_stmt))
     {
@@ -2454,14 +2452,7 @@ vect_recog_rotate_pattern (stmt_vec_info stmt_vinfo, tree *type_out)
     {
       def = vect_recog_temp_ssa_var (type, NULL);
       def_stmt = gimple_build_assign (def, NOP_EXPR, oprnd1);
-      if (ext_def)
-       {
-         basic_block new_bb
-           = gsi_insert_on_edge_immediate (ext_def, def_stmt);
-         gcc_assert (!new_bb);
-       }
-      else
-       append_pattern_def_seq (stmt_vinfo, def_stmt);
+      append_pattern_def_seq (stmt_vinfo, def_stmt);
     }
   stype = TREE_TYPE (def);
   scalar_int_mode smode = SCALAR_INT_TYPE_MODE (stype);