]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR target/92723 (ICE in expand_shift_1, at expmed.c:2635)
authorJakub Jelinek <jakub@redhat.com>
Fri, 20 Dec 2019 17:41:17 +0000 (18:41 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 20 Dec 2019 17:41:17 +0000 (18:41 +0100)
Backported from mainline
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.

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

From-SVN: r279671

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

index fd856d9e78ec3658afdc6945b99ed2d179af2632..28ec8783edeeafb4ef602dc48b54bdf7c48dc0f9 100644 (file)
@@ -5,6 +5,13 @@
        diagnose teams not closely nested inside of target.
 
        Backported from mainline
+       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-11-27  Jakub Jelinek  <jakub@redhat.com>
 
        PR debug/92664
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 ff952d6f464fd86c49e9fa8268910ba88d91d15a..badf4e7104e4dbfac4b04c816519d08eaba9c969 100644 (file)
@@ -2070,14 +2070,12 @@ vect_recog_rotate_pattern (stmt_vec_info stmt_vinfo, tree *type_out)
 
   *type_out = vectype;
 
-  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))
     {
@@ -2092,14 +2090,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);